数据库基础(一)——数据库是什么,数据库的基本命令
前言
在最开始学习数据库的时候,我们都会有一个疑问,数据库到底是什么?这是一个很严重的问题。随着我们学习的深入,越来越多的逻辑问题充斥我们的学习,到那个时候如果计算机基础方面的知识点没有融会贯通的话,再进一步深入理解相关逻辑是很难的。所以希望大家可以在基础阶段就将一些平时不在乎的知识点掌握(如果是速成想法的同学可以跳过此博客)。
文章目录
数据库初识
简单理解数据库,就是一种存放数据的仓库;就像便利店的库房一样,我们可以把货物存放在仓库,需要摆在外面展示给客户看的时候,再从库房中取出,店面打烊的时候再将货物放回仓库中。
只是数据库的操作比较科幻,我们在需要仓库中的某一种物品时,可以将它通过科技手段复制一份,然后将复制品展示给客户看,当店面打烊后,复制品就会消失(程序终止或停止该模块服务后,缓存区的数据会清除);如果商品的数据更改的话,我们回通过手段,让仓库中的货物与复制品保持一致性(也可以不更改,看具体业务);如果我们不需要这款商品的话,我们可以通知仓库将该商品删除掉。
总之,仓库永远不会让客户参观,我们只是按照某种逻辑或者业务让客户观察到展示给他的数据。
数据库概念
数据库(DB,DataBase)是一种安装在操作系统上(Windows,Mac,Linux),用来存储数据、管理数据的功能。
数据库中包含一些概念:DB、DBS、DBMS:
- DB(Database):数据库;
- DBS(DataBase System):数据库系统;
- DBMS(DataBase System Management):数据库管理系统;
DB、DBS、DBMS之间的关系
前文说过,DB就是一个存放数据的仓库,任何东西都可以作为一个数据库;DBMS则是一个管理数据库的系统,我们通过DBMS来操作数据库中的相关数据。
DBS则是老大哥,它包含着DB以及DBMS,它是一个完整的软件,共同构建一个存放数据,管理数据等操作的构件。
数据库分类
数据库可以分为两类:关系型数据库以及非关系型数据库。数据库中用表来存放数据,按照Java语言的思想来说,我们可以粗略的理解为:每个表对应Java程序中的一个实体类。
一般来说,Java中的每个类基本都会有相应的关系:有的是继承关系,有的是当前类的某个成员变量是另一个类的对象。关系型数据库就是每个表之间都有一定的对应关系;非关系型数据库是表与表之间弱关联的关系(基本没有关系)。
在此补充一个知识点,非关系型数据库的概念仅存在于理论当中,因为数据与数据、表与表之间是不可能完全没有关系的,现存的非关系型数据库只能说是无限接近NOSQL的理论。
NOSQL(Not Only SQL),意为不仅仅是SQL。
关系型数据库
关系型数据报包括以下几种常见数据库:
- MySql
- SQLServer
- Oracle
非关系型数据库
主要有以下几种:
- Redis
- MongoDB
MySQL
安转MySQL的步骤我在此不做赘述,大家随便找一个安装教程就可以,但是一定要记住:将环境变量配置好。
接下来会说明一下在命令提示符中使用MySQL的一些基本要求和语句。
- 命令提示符界面(管理员方式启动)初始化数据服务:
mysqld --initialize-insecure --user=mysql
- 启动MySQL服务
net start mysql
【注】:该命令必须在管理员身份下执行,否则没有访问权限。
- 修改数据库密码
在数据库安装结束后,我们的root账户并没有密码,需要手动设置密码。
// 通过root账户连接数据库
mysql -uroot -p
// 设定root账户的密码(这是一条SQL语句,暂时不需要理解它的含义)
update mysql.user set authentication_string=password('自己设定的密码') where user='root' and Host='localhost';
// 刷新权限
flush privileges;
- 重启数据库服务
// 在mysql的光标中输入 exit ,然后在windows命令下输入重启指令
net stop mysql
net start mysql
- 连接数据库
mysql -uroot -p自己设定的密码
连接成功后会显示一下界面:
SQL语句
- 注释
-- 单行注释
/*
多行注释
*/
- 反引号
/*
反引号的作用是区分我们的数据库中的特殊字段与自定义库名、表名、字段名等自定义变量之间的区别,被反引号包围的字段会被当做自定义名处理
*/
select `user` from student;
- 查看所有数据库
show databases;
- 使用某个数据库(一下皆以student为例)
use student;
- 查看所有表
show tables:
- 查看表所有数据
describe student;
- 创建数据库
create database testdatabse;
- 删除数据库
-- 如果student数据库存在,则删除该数据库
drop database if exists student;
- 退出连接
exit;
quit;
数据库指令
- 建库指令
-- testdatabase 为创建的数据库名,以下使用testdatabase标识
create database testdatabase;
- 建表指令
-- 创建数据表的时候,伴随着书写数据表的字段,字段的区别以及相关要求在下面的数据类型解释说明过,在此不做赘述。
create table if not exists `student`(
`id` varchar(32) NOT NULL COMMENT '鍛樺伐鍙?,
`username` varchar(50) DEFAULT NULL COMMENT '璐﹀彿',
`password` varchar(50) DEFAULT NULL COMMENT '瀵嗙爜',
`name` varchar(20) DEFAULT NULL COMMENT '濮撳悕',
`department` int(11) DEFAULT NULL COMMENT '闄㈢郴缂栧彿',
`telephone` varchar(15) DEFAULT NULL COMMENT '鑱旂郴鏂瑰紡',
`power` varchar(10) DEFAULT NULL COMMENT '鏉冮檺',
`status` int(11) DEFAULT NULL COMMENT '鐘舵€侊紙鏄惁閫氳繃瀹℃牳锛?,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- ENGINE代表的是我们数据库使用的引擎,后文会有讲解,暂时不作讲解
- 修改表指令
-- 修改表名
alter table `student` rename as `teacher`
-- 添加字段 int类型数据在MySQL中默认长度为11
alter table `teacher` add source int(11)
-- 修改字段约束
alter table `teacher` modify source varchar(11)
-- 修改字段名
alter table `teacher` change source sources int(11)
-- 删除字段指令
alter table `teacher` drop sources
- 数据表删除操作
drop table if exists `teacher`
数据操作指令
- 插入
-- 插入数据
-- 插入数据的时候,我们可以省略字段,但是后面需要插入的值必须要一一对应
insert into 表名(字段1,字段2,字段3)values('值1','值2','值3')
-- 如果对于同一个字段要插入多条数据,values后面的值,需要使用“,”隔开。
- 修改
-- where 关键字后面出现的是修改条件,即按照条件来查找相关数据,然后再对条件指定的数据进行修改
update `表名` set `字段`=`字段值` where `条件字段`=`条件值`
-- 如果没有where关键字以及后面的条件,会对整张表中所有数据进行相应的修改操作,如果没有条件匹配的数据,则不会发生修改且不会报错
-- 如果需要修改多个字段的值,可以对多个字段通过“,”来分割
- 删除
-- delete 语句后面如果不加条件的话,会将整个表中的数据删除
delete from 表名 where id = 条件
-- 清空当前数据表
truncate `表名`
delete和truncate之间对于清表的区别
- 相同点:都能删除数据,且不会删除表结构;
- 不同点:truncate会重新设置自增列,计数器回归领,且不会影响事务
- 查询(重点)
-- 简单查询
-- 查询全部
select * from `student`
-- 查询指定字段(sid,sname)
select `sid`,`sname` from `student`
-- 别名查询:别名关键字 as
select `sid` as studentId,`sname` as studentName from `student`
-- 函数:举例说明 concat,拼接字符串,执行后会将sname字段的所有值前面拼接上'学生姓名:'
select concate('学生姓名:',sname) as 拼接后的名字 from `student`
-- 去重查询,distinct关键字会将重复的数据只显示一条
select distinct `sid` as 学号 from `result`
-- 将MySQL当做计算器来使用
-- 将所有学生成绩加一
select `sid`,`course` + 1 as `执行后` from `student`
接下来说明按条件搜索的查询语句
select * from `student`
where
`sname` = '老程'
and
`tel` like '%888%'
and
sid in ('1001','1002','1003')
and
age between 18 and 20
and
`class` is not null
group by `class`
having gender = '男'
上面描述的是:
在student表中查找全部字段的信息,按照以下条件:
- sname 为 老程
- 电话里面有 888 (百分号用在like后,模糊查询,代表着可以没有,如果有则至少有一位占位符)
- 学号为(1001,1002,1003)任意一个
- 年龄在18到20之间
- 班级不为空
- 按照班级来分组
- 分组后再按照性别为男进行判定
- 分页和排序查询
分页关键字为limit,排序的关键字为order by,在SQL语法中有明确规定,先排序后分页。
首先说明排序,排序的情况只有两种:升序以及降序。
select * from `student`
where
`gender` = '男'
order by sage asc
-- order by 语法中应标明对什么字段进行哪种排序;asc 为升序,desc为降序
分页中,limit 有两个参数,第一个参数表示起始数据,第二个参数表示每页数据条数
select * from `student`
order by `sid` asc
limit 0,100
-- 该sql语句表示为将student表中的数据按照升序排序,然后对其分页,从第一条数据开始,显示一百条
数据库操作指令(子句)
-
where子句:
where子句代表着条件,条件一般是用作通过对字段的限制等条件在数据表中寻找到匹配的数据。一般用作where子句匹配字段条件的运算符如下
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=5 | true |
<>或!= | 不等于 | 5<>6 | true |
> | 大于 | ||
< | 小于 | ||
<= | 小于等于 | ||
.>= | 大于等于 | ||
between…and… | 在某个范围 | where id between 1 and 10 | |
and | 并且 | ||
or | 或者 |
函数
- 常用函数(不是很常用的常用函数)
-- 返回当前数值的绝对值
select abs(-3)
-- 向上取整
select celing(3.1)
-- 向下取整
select floor(3.9)
-- 随机数(返回0~1之间的随机数)
select rand()
-- 返回参数的符号,负数返回-1,正数返回-1
select sign(-10)
select sign(10)
-- 字符串函数
-- 返回字符串长度
select char_length('你猜猜我多长')
-- 拼接字符串
select concat('老','程')
-- 插入替换字符串,第一个参数表示被修改的字符串,第二个参数表示从第几个位置开始(不是下标),第三个字符串是指替换多少个位置,最后一个是覆盖到指定位置的替换字符串
select insert('老程爱编程',1,2,'我')
-- 截取字符串,第二各参数代表从第几个开始,第三个参数代表截取截取几个字符串
select substr('被截取的字符串',2,2)
-- 反转字符串
select reverse('被反转的字符串')
-- 按条件查找数据并将数据修改
select replace(username,'r','R') from `student` where username like '%r%'
-- 常用函数中比较重要的函数
-- 时间以及日期函数
-- 获取当前日期
select current_date()
select curdate()
-- 获取当前的时间
select now()
-- 获取本地时间
select localtime()
-- 获取系统时间
select sysdate()
-- 从时间中获取不同单位(年,月,日,时,分,秒等)
SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())
-- 查看当前登录用户
select user()
-- 查看当前数据库版本
select version()
- 聚合函数(很常用的函数)
-- 计数器
count()
-- 求和函数
sum()
-- 平均数
avg()
-- 最大值
max()
-- 最小值
min()
-- 聚合函数应用
-- 计数器:一下计数器的结果相同,但是存在本质的区别
-- 该方式会忽略掉所有的null值
select count(sid) from `student`
-- * 代表所有的值,不会忽而略所有的null值
select count(*) from `student`
-- 1 不会忽略所有的null值
-- count(*)以及count(1)之间的区别
/*
count(*)会把所有列,即所有字段进行按行统计
count(1)会忽略所有列,以1代表所有列,然后按照这种方式计算行数
如果我们在使用count(字段名)的方式进行统计时,字段名为当前表的主键,则比count(1)快
如果字段名不为主键,则count(1)更快
如果表中多个列没有主键,则count(1)的执行效率高于count(*)
*/
数据库数据类型
数值
- tinyint:十分小的数据;1字节;
- smallint:较小的数据;2字节;
- mediumint:中等大小的数据;3字节;
- int:标准证书;4字节;
- bigint:较大的数据;8字节;
- float:单精度浮点数;4字节;
- double:双精度浮点数;8字节;
- decimal:字符创形式的浮点数;金融计算时可以使用decimal;
字符串
- char:固定大小字符串;0~255;
- varchar:可变长字符串;0~65535;
- rinytext:微型文本;2^8 - 1;
- text:文本串(保存大文本);2^16-1;
时间日期:与Java中的 java.util.Date类相对应
- date:YYYY-MM-DD,日期格式;
- time:HH:mm:ss,时间格式;
- datetime:YYYY-MM-DD HH:mm:ss,最常用的时间格式;
- timestamp:时间戳,1970.1.1到现在的毫秒数;
- year:年份;
字符编码集
MySQL的默认编码是Latin1,(不需要了解到底是什么编码),这种编码是不支持中文,我们需要将MySQL的字符编码集修改为支持中文的编码。
修改方式是:在my.ini中配置默认字符编码集:
character-set-server=utf8
总结
本小节记录了MySQL的基本概念以及使用方式,在MySQL的使用过程中,我们应尽量培养数据表之间只有逻辑关系而没有物理关系的使用,因为表间关系太过复杂会导致我们的CRUD语句越来越复杂。尽量保证只做单表查询(在此声明,与阿里对于业务单表查询的规定完全无关,减少表间物理关系是数据库设计的一个建议,阿里只是将其执行出来而已)。
下一篇笔记记录数据库中事务的相关概念。