MySql(三) 数据的CRUD与事务
1 DML 操作表中的数据
用于对表中的记录进行增删改操作
1.1 插入记录
1 | insert [into] 表名 [字段名] values (字段值) |
1 | -- 插入全部字段 |
注:没有添加数据的字段会使用 NULL
1.2 蠕虫复制
将一张已经存在的表中的数据复制到另一张表中
1 | -- 将表名 2 中的所有的列复制到表名 1 中 |
1.3 更新表记录
1 | update 表名 set 列名=值 [where 条件表达式] |
1 | -- 不带条件修改数据 |
1.4 删除表记录
1 | delete 表名 [where 条件表达式] |
1 | -- 不带条件删除数据 |
truncate 和 delete 的区别: truncate 相当于删除表的结构,再创建一张表
2. DQL 查询表中的数据
查询不会对数据库中的数据进行修改.只是一种显示数据的方式
2.1 简单查询
1 | -- 使用*表示所有列 |
2.2 指定列的别名进行查询
使用别名的好处: 显示的时候使用新的名字,并不修改表的结构
1 | -- 对列指定别名 |
表使用别名的原因:用于多表查询操作
2.3 清除重复值
查询指定列并且结果不出现重复数据
1 | select distinct 字段名 from 表名; |
2.4 查询结果参与运算
1 | -- 某列数据和固定值运算 |
注意: 参与运算的必须是数值类型
2.5 条件查询
1 | select 字段名 from 表名 where 条件; |
运算符
| 比较运算符 | 说明 |
|---|---|
>、<、<=、>=、=、<> |
<>在 SQL 中表示不等于,在 mysql 中也可以使用!= 没有== |
| BETWEEN…AND | 在一个范围之内,如:between 100 and 200 相当于条件在 100 到 200 之间,包头又包尾 |
| IN(集合) | 集合表示多个值,使用逗号分隔 |
| LIKE ‘张%’ | 模糊查询 |
| IS NULL | 查询某一列为 NULL 的值,注:不能写=NULL |
逻辑运算符
| 逻辑运算符 | 说明 |
|---|---|
| and 或 && | 与,SQL 中建议使用前者,后者并不通用 |
| or 或 || | 或 |
| not 或 ! | 非 |
in 关键字
1 | select 字段名 from 表名 where 字段 in (数据 1, 数据 2...); |
范围查询
1 | between 值 1 and 值 2 |
like 关键字
1 | -- like 表示模糊查询 |
| 通配符 | 说明 |
|---|---|
| % | 匹配多个字符串 |
| _ | 匹配一个字符 |
3. 高级DQL
1 | -- 通过 order by 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序) |
单列排序
只按某一个字段进行排序,单列排序
1 | -- 查询所有数据,使用年龄降序排序 |
组合排序
同时对多个字段进行排序,如果第 1 个字段相等,则按第 2 个字段排序,依次类推
1 | select 字段名 from 表名 where 字段=值 order by 字段名 1 [asc|desc], 字段名 2 [asc|desc]; |
3.2 聚合函数
使用聚合函数查询是纵向查询, 它是对一列的值进行计算,然后返回一个结果值
聚合函数会忽略空值 NULL
五个聚合函数
| SQL中的聚合函数 | 作用 |
|---|---|
| max(列名) | 求这一列的最大值 |
| min(列名) | 求这一列的最小值 |
| avg(列名) | 求这一列的平均值 |
| count(列名) | 统计这一列有多少条记录 |
| sum(列名) | 对这一列求总和 |
1 | select 聚合函数(列名) from 表名; |
我们发现对于 NULL 的记录不会统计,建议如果统计个数则不要使用有可能为 null 的列
1 | ifnull(列名,默认值) -- 如果列名不为空,返回这列的值。如果为 NULL,则返回默认值。 |
3.3 分组
1 | -- 分组查询是指使用 group by 语句对查询信息进行分组,相同数据作为一组 |
group by 将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。
分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
1 | -- 按性别进行分组,求男生和女生数学的平均分 |
having 与 where 的区别
| 子句 | 作用 |
|---|---|
| where 子句 | 1) 对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,即先过滤在分组2) where后面 不可以使用聚合函数 |
| having 子句 | 1) having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤2) having 后面 可以使用聚合函数 |
3.4 limit 语句
limit 是限制的意思,所以 limit 的作用就是限制查询记录的条数
1 | select *|字段列表 [as 别名] from 表名 [where 子句] [group by 子句][having 子句][order by 子 |
4. 表连接查询
4.1 多表查询
多表查询的作用
如果一条 SQL 语句查询多张表,因为查询结果在多张不同的表中,每张表取 1 列或多列
多表查询的分类
- 内连接
- 隐式内连接
- 显示内连接
- 外连接
- 左外连接
- 右外连接
4.2 笛卡尔积现象
什么是笛卡尔积
左表的每一条数据和右边的每一条数据组合,这种效果成为笛卡儿乘积
如何清除笛卡尔积现象的影响
我们发现不是所有的数据组合都是有用的,只有员工表.dept_id = 部门表.id 的数据才是有用的
所以需要通过条件过滤掉没用的数据
1 | -- 设置过滤条件 Column 'id' in where clause is ambiguous |
4.3 内连接
用左边表的记录去匹配右边表的记录,如果符合条件的则显示。如:从表.外键=主表.主键
隐式内连接 : 看不到 JOIN 关键字,条件使用 WHERE 指定
1 | select 字段名 from 左表, 右表 where 条件 |
显示内连接:使用 INNER JOIN … ON 语句, 可以省略 INNER
1 | select 字段名 from 左表 [inner] join 右表 on 条件 |
4.4 左外连接
用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示 NULL
可以理解为:在内连接的基础上保证左表的数据全部显示
左外连接:使用 LEFT OUTER JOIN … ON,OUTER 可以省略
1 | select 字段名 from 左表 left [outer] join 右表 on 条件 |
4.5 右外连接
用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示 NULL
可以理解为:在内连接的基础上保证右表的数据全部显示
右外连接:使用 RIGHT OUTER JOIN … ON,OUTER 可以省略
1 | select 字段名 from 左表 right [outer]join 右表 on 条件 |
5. 子查询
5.1 什么是子查询
子查询的概念
- 一个查询的结果做为另一个查询的条件
- 有查询的嵌套,内部的查询称为子查询
- 子查询要使用括号
5.2 子查询的结果是一个值的时候
子查询的结果是一个值的时候
子查询结果只要是单行单列,肯定在 WHERE 后面作为条件,父查询使用:比较运算符,如:> 、<、<>、=
1 | select 查询字段 from 表 where 字段=(子查询); |
5.3 子查询结果是多行单列的时候
子查询结果是多行单列的时候
子查询结果是单例多行,结果集类似于一个数组,父查询使用 IN 运算符
1 | SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询); |
5.4 子查询的结果是多行多列
子查询的结果是多行多列
子查询结果只要是多列,肯定在 FROM 后面作为表
1 | select 查询字段 from (子查询) 表别名 where 条件; |
子查询作为表需要取别名,否则这张表没有名称则无法访问表中的字段
1 | -- 查询出 2011 年以后入职的员工信息,包括部门名称 |
6. 事务
6.1 事务的应用场景说明
什么是事务: 在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的
转账是一个用户扣钱,另一个用户加钱。如果其中有一条 SQL 语句出现异常,这条 SQL 就可能执行失败
事务执行是一个整体,所有的 SQL 语句都必须执行成功
如果其中有 1 条 SQL 语句出现异常,则所有的 SQL 语句都要回滚,整个业务执行失败
6.2 手动提交事务
MYSQL 中可以有两种方式进行事务的操作:
- 手动提交事务
- 自动提交事务
手动提交事务的 SQL 语句
| 功能 | SQL语句 |
|---|---|
| 开启事务 | start transaction |
| 提交事务 | commit |
| 回滚事务 | rollback |
手动提交事务使用过程
- 执行成功的情况: 开启事务 →执行多条 SQL 语句→成功提交事务
- 执行失败的情况: 开启事务→执行多条 SQL 语句→事务的回滚
6.3 自动提交事务
MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕 自动提交事务,MySQL 默认开始自动提交事务

