1 数据库的基本概念
1.1 什么是数据库
数据库(DataBase,简称:DB),是一个用于存储和管理数据的仓库。
1.2 数据库的特定
- 持久化存储数据。数据库其实是一个文件系统。
- 方便存储和管理数据。
- 使用统一的方式操作数据库——SQL。
1.3 常用的数据库
可以通过网址:https://db-engines.com/en/ranking , 查看数据库的排行榜。
2 SQL
2.1 SQL的概念
SQL(Structured Query Language): 结构化查询语义,就是定义了操作所有关系型数据库的规则。
2.2 SQL的通用语法
SQL 语句可以单行或者多行书写,以分号
“;”
结尾。可以使用空格和缩进来增强语句的可以读性。
MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
SQL语句的注释:
单行注释:
sql1
2
3-- 注释内容
# 注释内容(MySQL特有)多行注释
Code1
2
3
4/*
注释
注释
*/
2.3 SQL的分类
DDL(Data Definition Language),数据定义语义:
用来定义数据库对象:数据库、表、列等。关键字:
create
、drop
、alert
等。DML(Data Manipulation Language),数据操作语义:
用来对数据库中的表进行增删改。关键字:insert
、delete
、update
等DQL(Data Query Language),数据查询语言:
用来查询数据库中表的数据。关键字:
select
、where
等。DCL(Data Control Language),数据控制语言:
用来定义数据库的访问权限和安全级别,以及创建用户。关键字:
GRANT
,REVOKE
等。
2.4 CRUD
- C(Create):创建
- R(Retrieve):查询
- U(Update):修改
- D(Delete):删除
4 操作数据库
4.1 创建数据库
1 | # 创建数据库 |
4.2 查询数据库
查询所有的数据库名称
1 | # 查询所有的数据库名称 |
示例:
1 | mysql> show databases; |
查询某个数据库的字符集
查询某个数据库的创建语句
1 | # 查询某个数据库的字符集/查询某个数据库的创建语句 |
示例:
1 | mysql> show create database mysql; |
4.3 修改数据库
修改数据库的字符集
1 | # 修改字符集 |
示例:
1 | mysql> alter database db3 character set utf8; |
4.4 删除数据库
1 | #删除数据库 |
4.5 使用数据库
查询当前正在使用的数据库
1 | # 查看当前使用的数据库 |
使用数据库
1 | # 使用数据库 |
5 操作表
5.1 创建表
创建语法
1 | create tabele 表名( |
示例:
1 | create table student( |
复制表
1 | # 复制表 |
5.2 查询表
查询所有表
1 | # 查询某个数据库的所有表的名称 |
查询表结构
1 | # 查询表结构 |
查询表字符集
查询表创建语句
1 | # 查询表字符集/查询表创建语句 |
5.3 修改表
修改表名
1 | # 修改表名 |
修改表的字符集
1 | # 修改字符集为utf-8 |
添加一列
1 | # 添加列 |
修改某一列
1 | # 修改列名和数据类型 |
删除某一列
1 | # 删除列 |
5.4 删除表
1 | # 删除表 |
6 操作数据
6.1 添加数据
语法:
1 | # 插入数据 |
注意列名和表名要一一对应,如果不定义列名,则给所有的列添加值:
如:
1 | # 插入数据 |
示例:
1 | # 插入数据 |
6.2 删除数据
1 | # 删除数据 |
示例:
1 | # 删除id=1的数据 |
注意如果不加条件会删除所有记录,但如果要删除所有的数据也不建议使用该命令,因为它会一条一条的删除数据,效率比较低下,建议使用TRUNCATE
,它会先删除表,再创建一个一模一样的表。
1 | # 删除全部数据 |
6.3 修改数据
语法:
1 | # 修改数据 |
注意:如果不加任何条件,会将表中所有的记录全部修改。
6.4 查询数据
语法
1 | select |
测试表:
1 | create table student( |
基础查询
多个字段查询
sql1
2
3select 字段名1,字段名2,... from 表名;
select * from 表名; -- 查询所有字段去除重复: 使用关键字
distinct
计算列
一般可以使用四则运算计算一些列的值(一般只会对数值型的数据进行计算)。
如果有字段为null参与运算,结果都会null,这时可以使用
ifnull
关键字,具体格式如下sql1
2
3ifnull(表达式1,表达式2)
-- 表达式1:需要判断是否为null的字段
-- 表达式2:如果该字段为空,所替换的值
取别名
使用
as
关键字,as
也可以省略。
1 | select * from student; |
条件查询
使用 where
字句
- 使用运算符
> , < , <= , >= , = ,!= , <>
1 | --查询年龄大于(等于)20岁 |
- 使用
&&
,and
,between ... and
1 | --查询年龄大于等于20 小于等于30 |
- 使用
in (集合)
1 | --查询年龄22岁,19岁,25岁的信息 |
- 使用
is null
,is not null
1 | --查询英语成绩为null |
- 使用
like
占位符:
_
: 单个任意字符%
: 多个任意字符
1 | --查询name中姓马的有哪些? 使用like |
排序查询
语法:
1 | -- order by 字句 |
排序方式:
ASC
:升序,默认为升序。DESC
: 降序。
排序规则: 如果有多个排序条件,则当前面的条件值一样是,才会判断后面的条件值。
1 | -- 按数学成绩排序 |
聚合函数
将一列数据作为一个整体,进行纵向的计算。
注意:聚合函数会排除
null
的值解决方案:
(1)选择不包含
null
的列进行计算(2)使用
ifnull
函数
count
:计算个数- 一般选择非null的列,如主键 。
- 可以使用
count(*)
1 | select count(name) from student; |
max
:计算最大值min
: 计算最小值sum
:计算和avg
: 计算平均值
1 | select max(math) from student; |
分组查询
语法
1 | -- group by |
注意:
- 分组之后查询的字段只能是分组字段和聚合函数
where
和having
的区别?
where
在分组前进行限定,不满足条件不参与分组;having
在分组后进行限定,如果不满足条件则不会被查出来。where
后不可以跟聚合函数,having
后面可以进行聚合函数判断。
1 | -- 按照性别分组。分别查询男、女同学的数学平均分 |
分页查询
语法:
1 | -- limit |
开始的索引 = (当前的页码 - 1)* 每页显示的条数
1 | -- 每页显示3条记录 |
limit
关键字是在MySQL
中特有,Oracle
和SqlServer
没有
7 约束
概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性
分类:
- 主键约束:
primary key
- 非空约束:
not null
- 唯一约束:
unique
- 外键约束:
foreign key
7.1 非空约束
创建表时添加非空约束
1 | CREATE TABLE stu( |
删除非空约束
1 | -- 删除非空约束 |
创建表后添加非空约束
1 | -- 添加非空约束 |
7.2 唯一约束
创建表时添加唯一约束
1 | create table stu( |
注意:MySQL中的唯一约束限定的列的值可以有多个null
删除唯一约束
1 | -- 删除唯一约束 |
创建表后添加唯一约束
1 | -- 创建表后添加唯一约束 |
7.3 主键约束
- 含义:非空且唯一
- 一张表只能有一个字段为主键
- 主键是表中记录的唯一标识
创建表时添加主键
1 | create table stu( |
删除主键约束
1 | -- 删除主键 |
创建表后添加主键
1 | -- 创建表后添加主键 |
自动增长
如果某一列是数值类型,使用auto_increment
可以来完成值的自动增长。
1 | -- 创建表时添加自动增长 |
7.4 键约束
foreign key
让表与表产生关系,从而保证数据的正确性
创建表时添加外键
语法:
1 | create table 表名( |
示例:
1 | create table department( |
删除外键
1 | -- 删除外键 |
创建表后添加外键
1 | -- 添加外键 |
级联操作
- 级联更新: ON UPDATE CASCADE
- 级联删除:ON DELETE CASCADE
语法:
1 | -- 级联更新和级联删除可以分别设置 |
8 多表查询
笛卡尔积:有两个集合A、B,取这两个集合的所有组成情况。
8.1 内连接查询
隐式内连接
使用where
条件消除无用的数据
1 | -- 查询所有员工信息和对应的部门信息 |
显示内连接
语法:
1 | -- 显示内连接 |
示例:
1 | select * from emp inner join dept on emp.dept_id = dept.id; |
8.2 外连接查询
左外连接
语法:
1 | -- outer可以不写 |
示例:
1 | select |
右外连接
语法:
1 | -- outer可以不写 |
示例:
1 | select |
8.3 子查询
查询中嵌套查询,成嵌套查询为子查询。
示例:
1 | -- 查询工资最高的员工信息 |
子查询的结果是单行单列的
子查询的结果可以作为条件,使用运算符(> 、 >= 、 < 、 <=、 =
)去判断
1 | -- 查询员工工资小于平均工资的人 |
子查询的结果是多行单列的
子查询可以作为条件,使用运算符in
来判断
1 | -- 查询 财务部 和 市场部 的所有员工信息 |
子查询的结果是多行多列的
子查询可以作为一张虚拟表参与查询
1 | -- 查询员工的入职日期是 2011-11-11 之后的员工信息和部门信息 |
9 事务
9.1 事务的基本介绍
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失效。
操作:
- 开启事务:
start transacion;
- 回滚:
rollback;
- 提交:
commit;
1 | -- 张三给李四转账500元 |
事务提交的两种方式:
自动提交
MySQL中的事务是自动提交的,一条DML(增删改)语句会自动提交一次事务
手动提交
Oracle数据库默认是手动提交事务,需要先开启事务,然后再提交
MySQL中修改事务默认提交方式:
1 | -- 查看事务的默认提交方式 |
9.2 事务的四大特征
- 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
- 持久性:当事务提交或者回滚吼,数据库会持久化的保存数据。
- 隔离性:多个事务之间,相互独立。
- 一致性:事务操作前后,数据总量不变。
9.3 事务的隔离级别
多个事务之间隔离的相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
存在的问题:
- 赃读: 一个数据读取到另一个事务中没有提交的数据。
- 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。
- 幻读:一个事务操作(DML)数据表中所有的记录,另一个事务添加了一条数据,则地一个事务查询不到自己的修改。
隔离级别:
read uncommitted:读未提交
产生的问题:赃读、不可重复读、幻读
read committed:读已提交(Oracle默认)
产生的问题:不可重复读、幻读
repeatable read:可重复读(MySQL默认)
产生的问题:幻读
serializable :串行化
可以解决所有的问题
注意:隔离级别从小到大安全性越来越高,但效率越来越低。
10用户管理和权限管理
10.1 用户管理
查询用户
1 | -- 1 切换到mysql数据库 |
通配符:
%
表示可以在任意主机使用用户登录数据库
创建用户
语法:
1 | -- 创建用户 |
示例:
1 | create user 'zhangsan'@'localhost' identified by '123'; |
删除用户
1 | --删除用户 |
修改用户密码
使用sql的方式修改:
1 | -- 修改密码 |
第二种方式:
1 | -- 修改密码 |
MySQL中忘记了root用户密码?
停止MySQL服务
sql1
2# windows下需要管理员权限
net stop mysql使用无验证方式启动MySQL
sql1
2# 窗口会停留
mysqld --skip-grant-tables登录MySQL修改密码
sql1
2# 重新打开一个窗口,直接输入mysql回车就可以登录数据库
mysql
修改密码:
1 | use mysql; |
10.2 权限管理
查询权限
1 | -- 查询权限 |
授予权限
1 | -- 授予权限 |
撤销权限
1 | -- 撤销权限 |
11 数据库的备份和还原
11.1 命令行方式
备份
使用命令:
1 | -- 在命令行中执行 |
还原
登陆数据库
创建数据库
使用数据库
执行备份文件
sql1
source 文件路径
11.2 图形化工具
点击备份导出导入即可。
12 补充:MySQL 数据类型
来源:https://www.runoob.com/mysql/mysql-data-types.html
MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
12.1 数值类型
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
12.2 日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
12.3 字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。