1. 单表

1.1 排序—order by

升序ASC、降序DESC
1)单列排序
2)组合排序
image.png

1.2 聚合函数 (5种)

count(计数)、sum、max、min、avg(平均值)

1.3 分组—group by

对查询的信息进行分组,相同数据作为一组
注意:分组的目的就是为了统计,所以要和聚合函数一起使用,得到一个组的统计信息(平均薪资,薪资总和等等信息)
使用方式:
image.png

1.3.1 having关键字

1) 需要在分组后**,**对数据进行过滤,使用 关键字 having
2) 分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。
image.png

1.3.2 where 与 having的区别

image.png

1.4 limit关键字

作用:限制返回的查询结果的行数 ,比如返回一个表的前几条数据

2. 约束

2.1 主键约束—primary key

2.1.1 添加方式3种

(1)直接加在字段后面,eid ``INT ``PRIMARY KEY``,
(2)在表的末尾指定主键,PRIMARY KEY``(eid)
(3)建完表之后,选择表添加主键,ALTER TABLE ``emp2 ``ADD PRIMARY KEY``(eid);

2.1.2 删除—drop

选定表alter table emp之后drop primary key

2.1.3 自增—auto_increment

eid ``INT ``PRIMARY KEY AUTO_INCREMENT``,

2.1.3.1 修改自增起始值

image.png

2.1.4 delete和truncate

相同:都是删除表中所有数据
区别:
image.png
delete方式:
SELECT ``* ``FROM ``emp2;
DELETE FROM ``emp2;
truncate方式:
TRUNCATE TABLE ``emp2;``

2.2 非空约束—not null

注意:以下几个约束都是跟在字段类型后面声明。

2.3 唯一约束—unique

特点**: **表中的某一列的值不能重复( 对null不做唯一的判断 )

2.4 外键约束—foreign key

2.4.1 添加方式

注意:外键一定是在从表中的
1. 新建表时添加外键<br />
image.png
2. 已有表添加外键
![image.png](https://cdn.nlark.com/yuque/0/2020/png/2733429/1608878860407-ed2bedc0-34fa-46cc-829e-2d373099eb8e.png#align=left&display=inline&height=73&margin=%5Bobject%20Object%5D&name=image.png&originHeight=73&originWidth=1071&size=41994&status=done&style=none&width=1071)

2.4.2 删除外键

image.png

2.4.3 注意事项

1) 从表外键类型必须与主表主键类型一致 否则创建失败
2) 添加数据时, 应该先添加主表中的数据.
3) 删除数据时,应该先删除从表中的数据

2.5 默认值约束—default

功能:用来指定某列的默认值

3. 事务

3.1 概念和回滚

概念:事务是一个整体,由一条或者多条SQL 语句组成,这些SQL语句要么都执行成功,要么都执行失败, 只要有
一条SQL出现异常,整个操作就会回滚,整个业务执行失败
回滚** :**即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成
的操作全部撤销,滚回到事务开始时的状态。(在提交之前执行)

3.2 手动提交事务

设置:
image.png
基本操作:
image.png

3.3 自动提交事务(默认的)

(1)MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句
执行完毕 自动提交事务,MySQL 默认开始自动提交事务
(2)MySQL默认是自动提交事务

3.4 事务四大特性ACID

image.png

3.5 mysql事务隔离级别(了解)

(1)并发问题
image.png
(2)隔离级别
image.png
注意:设置事务隔离级别,需要退出 MySQL 再重新登录才能看到隔离级别的变化

3.6 隔离性问题演示理解

隔离性问题:

3.6.1 脏读

一个事务读取到了另一个事务中尚未提交的数据。
问题描述:
比如张三向李四购买商品,张三开启事务,向李四账号转入 500 块,然后打电话给李四说钱已经转了。李四一查询钱到账了,发货给张三。张三收到货后回滚事务,李四的再查看钱没了。由于张三只是执行了转账操作,并没有提交事务,因此李四看到的金额是可以被张三撤回的。
解决:设置read committed隔离级别

3.6.2 不可重复读

同一个事务中**,进行查询操作,但是每次读取的数据内容是不一样的(B修改数据提交事务后,A再查和之前查的不同了,情理之中是正常的)
问题描述:
比如银行程序需要将查询结果分别输出到电脑屏幕和发短信给客 户,结果在一个事务中针对不同的输出目的地进行的两次查询不一致,导致文件和屏幕中的结果不一致,银行工作 人员就不知道以哪个为准了。
理解:在A提交修改数据的事务前后,B两次查到的数据不一致,前一次是原始数据,后一次是A修改过的数据。
解决:同一个事务中为了保证多次查询数据一致,必须使用 repeatable read 隔离级别**

3.6.3 幻读

select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在(可能B插入的),
无法插入,此时就发生了幻读。
解决:设置最高隔离级别,必须A事务提交之后,B事务才可以操作。
如果一个事务,使用了SERIALIZABLE——可串行化隔离级别时,在这个事务没有被提交之前 , 其
他的线程,只能等到当前操作完成之后,才能进行操作,这样会非常耗时,而且,影响数据库的
性能,数据库不会使用这种隔离级别 。