MySQL之DML(数据操纵语言)

数据操纵语言(DML)主要是针对数据表里的记录的增删改查。

INSERT,DELETE,UPDATE,SELECT

1. INSERT

语法:INSERT INTO table_name [(column [, column] …)] VALUES value [, value] …

– 首先创建一张学生表
在这里插入图片描述
1.1 单行数据 + 全列插入

– 插入两条记录,value的数量必须和定义表的列的数量及顺序一致
在这里插入图片描述
– 查看插入后结果
在这里插入图片描述
1.2 多行数据 + 指定列插入
在这里插入图片描述
– 查看插入后结果
在这里插入图片描述
1.3 插入否则更新

原因:由于主键或者唯一键对应的值已经存在而导致插入失败!

– 主键冲突
在这里插入图片描述
– 唯一键冲突
在这里插入图片描述
可以选择性的进行同步更新操作语法:

INSERT … ON DUPLICATE KEY UPDATE column = value [, column = value] …
在这里插入图片描述0 row affected:表中有冲突数据,但冲突数据的值和 update 的值相等
1 row affected:表中没有冲突数据,数据被插入
2 row affected:表中有冲突数据,并且数据已经被更新

– 查看插入后数据
在这里插入图片描述
1.4 替换

主键或者唯一键没有冲突,则直接插入;主键或者唯一键有冲突,则删除后再插入

语法:REPLACE INTO table_name [(column [, column] …)] VALUES value [, value] …
在这里插入图片描述
1 row affected:表中没有冲突数据,数据被插入
2 row affected:表中有冲突数据,删除后重新插入

– 查看替换后数据
在这里插入图片描述

2. SELECT

语法:SELECT [DISTINCT] {* | {column [, column] …} [FROM table_name] [WHERE …] [ORDER BY column [ASC | DESC], …] LIMIT …

– 创建学生成绩表
在这里插入图片描述
– 插入测试数据
在这里插入图片描述
2.1 SELECT列

2.1.1 全列查询

通常情况下不建议使用 * 进行全列查询。

因为查询的列越多,意味着需要传输的数据量越大;可能会影响到索引的使用。
在这里插入图片描述
2.1.2 指定列查询
在这里插入图片描述
2.1.3 查询字段为表达式
在这里插入图片描述
– 表达式包含一个字段
在这里插入图片描述
– 表达式包含多个字段
在这里插入图片描述
2.1.4 为查询结果指定别名

语法:SELECT column [AS] alias_name […] FROM table_name;
在这里插入图片描述
2.1.5 结果去重 (DISTINCT)

– 98分重复了,要是想知道同学们的数学成绩都有哪几个值时就必须结果去重了
在这里插入图片描述
– 去重之后的结果
在这里插入图片描述
2.2 WHERE条件

比较运算符:
在这里插入图片描述
逻辑运算符:
在这里插入图片描述
2.2.1 查询英语不及格的同学姓名及英语成绩
在这里插入图片描述
2.2.2 语文成绩在[80, 90]之间的学生姓名及语文成绩

– 使用 and 条件进行连接
在这里插入图片描述
– 使用 between … and 条件进行连接
在这里插入图片描述
2.2.3 数学成绩是 58 或者 59 或者 98 或者 99 分的学生姓名及数学成绩

– 使用 or 条件进行连接
在这里插入图片描述
– 使用 in 条件进行连接
在这里插入图片描述
2.2.4 查询 姓孙 及 孙某 同学的姓名

– % 匹配任意多个(包括 0 个)任意字符
在这里插入图片描述
– _ 匹配严格的一个任意字符
在这里插入图片描述
2.2.5 语文成绩好于英语成绩的同学的姓名及语文和英语成绩
在这里插入图片描述
2.2.6 总分在200分以下的同学姓名及他们的总分

WHERE 条件中使用表达式,别名不能用在 WHERE 条件中!!!
在这里插入图片描述
2.2.7 语文成绩大于80并且不姓孙的同学的姓名及语文成绩

– AND 和 NOT 的使用
在这里插入图片描述
2.2.8 查询要么是孙某同学,要么是总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80的同学的姓名、各科成绩及总分

– 综合性查询
在这里插入图片描述
猪悟能是满足第二个条件的,而孙权是满足第一个条件的

2.2.9 NULL 的查询

– 查询刚才之前建好的students表
在这里插入图片描述
– 查询qq号已知的同学姓名及qq号
在这里插入图片描述
– NULL 和 NULL 的比较,= 和 <=> 的比较
在这里插入图片描述
2.3 结果排序

语法:SELECT … FROM table_name [WHERE …] ORDER BY column [ASC|DESC], […];

ASC为升序,DESC为降序,默认为升序

注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序

2.3.1 查询exam_result表里的学生姓名及数学成绩,并按数学成绩升序显示
在这里插入图片描述
2.3.2 查询students表里的学生姓名及qq号,并按qq号升序显示

– NULL 视为比任何值都小,升序出现在最上面!!!
在这里插入图片描述
– NULL 视为比任何值都小,降序出现在最下面!!!
在这里插入图片描述
2.3.3 在exam_result表中查询学生的各科成绩,并按数学降序、语文升序、英语升序的

方式显示

– 多字段排序,排序优先级随书写顺序
在这里插入图片描述
2.3.4 查询学生姓名及总分,总分按照降序排列
在这里插入图片描述
– ORDER BY 子句中可以使用列别名
在这里插入图片描述
2.3.5 查询姓孙的同学或者姓曹的同学的数学成绩,结果按数学成绩由高到低显示

– 结合 WHERE 子句 和 ORDER BY 子句
在这里插入图片描述
2.4 筛选分页结果

建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表

数据导致数据库卡死

语法:-- 起始下标为 0

① 从 0 开始,筛选 n 条结果

SELECT … FROM table_name [WHERE …] [ORDER BY …] LIMIT n;

② 从 s 开始,筛选 n 条结果

SELECT … FROM table_name [WHERE …] [ORDER BY …] LIMIT s, n;

③ 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用

SELECT … FROM table_name [WHERE …] [ORDER BY …] LIMIT n OFFSET n;

案例:对exam_result表按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页

– 第一页
在这里插入图片描述
– 第二页
在这里插入图片描述
– 第三页,如果结果不足 3 个,不会有影响

在这里插入图片描述

3. UPDATE

对查询到的结果进行列值更新。

语法:UPDATE table_name SET column = expr [, column = expr …] [WHERE …] [ORDER BY …] [LIMIT …]

3.1 把孙悟空同学的数学成绩改为80分 (更新值为具体值)

– 查看原数据
在这里插入图片描述
– 数据更新
在这里插入图片描述
– 查看更新后的数据
在这里插入图片描述
3.2 将曹孟德同学的数学成绩变更为60分,语文成绩变更为70分 (一次更新多个列)

– 查看原数据
在这里插入图片描述
– 数据更新
在这里插入图片描述
– 查看更新后的数据
在这里插入图片描述
3.3 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分(更新值为原值基础上变更)

– 查看原数据
在这里插入图片描述
– 数据更新,不支持 shuxue += 30 这种语法!!!
在这里插入图片描述
– 查看更新后数据

这里不可以再按总分升序排序取前 3 个,因为加了30分之后的名次可能跟之前会有所变

化,没办法比较是否更新成功了。
在这里插入图片描述
– 按总成绩排序后查询结果
在这里插入图片描述
这时倒数第三名已经变了

3.4 将所有同学的语文成绩更新为原来的 2 倍

注意:更新全表的语句慎用!!!

– 查看原数据
在这里插入图片描述
– 数据更新
在这里插入图片描述
– 查看更新后的数据
在这里插入图片描述

4. DELETE

4.1 删除数据

语法:DELETE FROM table_name [WHERE …] [ORDER BY …] [LIMIT …]

4.1.1 删除孙悟空同学的考试成绩

– 查看原数据
在这里插入图片描述
– 删除数据
在这里插入图片描述
– 查看删除后数据
在这里插入图片描述
4.1.2 删除整张表数据

注意:删除整表操作要慎用!!!

– 准备测试表
在这里插入图片描述
– 插入测试数据
在这里插入图片描述
– 查看测试数据
在这里插入图片描述
– 删除整表数据,注意影响行数是 3
在这里插入图片描述
– 查看删除结果
在这里插入图片描述
– 再插入一条数据,发现自增 id 在原值上增长
在这里插入图片描述
– 查看表结构,会有 AUTO_INCREMENT=n 项
在这里插入图片描述
4.2 截断表

语法:TRUNCATE [TABLE] table_name

注意:这个操作慎用!

① 只能对整表操作,不能像 DELETE 一样针对部分数据操作;

② 实际上 MySQL 不对数据操作,所以比 DELETE 更快

会重置 AUTO_INCREMENT 项

– 准备测试表
在这里插入图片描述
– 插入测试数据
在这里插入图片描述
– 查看测试数据
在这里插入图片描述
– 截断整表数据,注意影响行数是 0,所以实际上没有对数据真正操作
在这里插入图片描述
– 查看截断后的表
在这里插入图片描述
– 再插入一条数据,自增 id 在重新增长
在这里插入图片描述
– 查看表结构,会有 AUTO_INCREMENT=2 项
在这里插入图片描述

5. 插入查询结果

语法:INSERT INTO table_name [(column [, column …])] SELECT …

案例:删除表中的的重复记录,重复的数据只能有一份

– 创建原数据表
在这里插入图片描述
– 插入测试数据
在这里插入图片描述
– 创建一张空表 no_distinct_table,结构和 distinct_table 一样
在这里插入图片描述
– 将 distinct_table 的去重数据插入到 no_distinct_table
在这里插入图片描述
– 通过重命名表,实现原子的去重操作
在这里插入图片描述
– 查看最终结果
在这里插入图片描述

6. 聚合函数

在这里插入图片描述
以下是接下来要用到的两张表里( students 和 exam_result )的所有数据

在这里插入图片描述
在这里插入图片描述
6.1 在 students 表中统计班级共有多少同学

– 使用 * 做统计,不受 NULL 影响
在这里插入图片描述
6.2 统计班级收集的 qq 号有多少

– NULL 不会计入结果
在这里插入图片描述
6.3 统计本次考试的数学成绩分数个数

– COUNT(shuxue) 统计的是全部成绩
在这里插入图片描述
– COUNT(DISTINCT shuxue) 统计的是去重成绩数量
在这里插入图片描述
6.4 统计数学成绩总分
在这里插入图片描述
6.4 统计平均总分
在这里插入图片描述
6.5 返回英语最高分
在这里插入图片描述
6.6 返回 > 70 分以上的数学最低分
在这里插入图片描述

7. GROUP BY子句

在select中使用group by 子句可以对指定列进行分组查询

语法:select column1, column2, … from table group by column;

案例:创建一个雇员信息表(EMP员工表,DEPT部门表,SALGRADE工资等级表)

7.1 计算每个部门的平均工资和最高工资

select deptno,avg(sal),max(sal) from EMP group by deptno;

7.2 计算每个部门的每种岗位的平均工资和最低工资

select avg(sal),min(sal),job, deptno from EMP group by deptno, job;

7.3 显示平均工资低于2000的部门和它的平均工资

select avg(sal) as myavg from EMP group by deptno having myavg<2000;

猜你喜欢

转载自blog.csdn.net/qq_43508801/article/details/86375468