1.插入否则更新(duplicate)
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...

-- 通过 MySQL 函数获取受到影响的数据行数
SELECT ROW_COUNT();

2.替换(replace)
-- 主键 或者 唯一键 没有冲突,则直接插入;
-- 主键 或者 唯一键 如果冲突,则删除后再插入
REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒');
Query OK, 2 rows affected (0.00 sec)
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,删除后重新插入

3.读取(retrieve)
我们先直接创建一个表

全列查询
-- 通常情况下不建议使用 * 进行全列查询
-- 1. 查询的列越多,意味着需要传输的数据量越大;
-- 2. 可能会影响到索引的使用。(索引待后面课程讲解)
SELECT * FROM 表名;

指定列查询
SELECT 列名1, 列名2, ... FROM 表名;

查询字段为表达式

结果去重

当然我们也可以对多个字段去重
为查询结果指定别名

当然我们也可以对多组字段进行指定别名


这个as可以有 也可以没有
条件查询
我们先来看看运算符


我们直接上题目
第一题

第二题

当然了 用 between ... and也可以
第三题

当然用in也可以

第四题

_(下划线):是 MySQL 中的单字符通配符,它表示匹配任意一个字符。
%(百分号):是 MySQL 中的多字符通配符,它表示匹配任意零个或多个字符。
第五题

第六题

注意where后面只能接原本表存在的字段 取别名的字段无法使用

第七题

第八题

NULL的查询
null不参与计算 因此> < =等比较符无法使用



当然 我们如果硬要比较NULL 就要用<=>符
如果比较的双方都是 NULL,NULL <=> NULL 的结果为 TRUE(1)。 如果一方是 NULL,另一方是具体的值,NULL <=> 具体值 的结果为 FALSE(0)

结果排序
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
第九题

写不写asc都可以 因为你没写默认就算asc
第十题

我们发现NULL 视为比任何值都小,降序出现在最下面
第十一题

第十二题

我们发现order by后面是可以加取的别名的和where不一样的
第十三题

筛选分页结果
-- 起始下标为 0
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
这里的下表是从0开始的

4.更新(update)
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
第一题

第二题

第三题


但是这个地方注意我们只能用limit 3 不能用limit 0,3 以及limit 0 offset 3尽管左后结果是一致的
第四题

5.删除数据(delete)
第一题
删除孙悟空同学的考试成绩

删除整表

我们发现在删除整表后
截断表


插入查询结果
INSERT INTO table_name [(column [, column ...])] SELECT ...
第二题

6.聚合函数

第一题

这个地方一共是6个人 没有id2
count(1)和count(*)基本上一致
第二题

第三题
统计本次考试的语文成绩分数个数(去重的)

第四题

当查找的数据没有时就会返回NULL;
第五题

第六题

第七题

分组(group by)
分组前我们先建表

第一题
查看每个部门的平均工资

第二题
查看平均工资高于8000部门其的平均工资

having可以搭配group by使用 功能上和where相似

1. WHERE 的作用:筛选原始数据行
比如要查询部门 1 中薪水大于 8000 的员工:
SELECT name, sal
FROM employees
WHERE dep = 1 AND sal > 8000; -- 筛选原始行,不涉及分组
2. HAVING 的作用:筛选分组后的结果
比如要查询平均薪水大于 9000 的部门:
SELECT dep, AVG(sal) AS avg_sal
FROM employees
GROUP BY dep -- 先按部门分组
HAVING avg_sal > 9000; -- 筛选分组后的平均薪水>9000的部门
1. HAVING 可以和 SELECT 单独搭配使用吗?
可以,但通常需要配合聚合函数。
当SELECT中只有聚合函数且无GROUP BY时,HAVING可以单独使用(此时默认整个表为一个分组)。
示例:查询所有员工的总薪水是否大于 10 万:
SELECT SUM(sal) AS total_sal
FROM employees
HAVING total_sal > 100000; -- 无GROUP BY,默认整个表为一组
2. WHERE 可以单独和 GROUP BY 搭配使用吗?
可以。WHERE在GROUP BY之前执行,先筛选行再分组,是常见用法。
示例:先筛选部门 1 的员工,再计算该部门的平均薪水:
SELECT dep, AVG(sal)
FROM employees
WHERE dep = 1 -- 先筛选部门1的员工
GROUP BY dep; -- 再对筛选后的结果分组
总结
WHERE:分组前 “筛行”,不支持聚合函数,可单独用。
HAVING:分组后 “筛组”,支持聚合函数,通常需配合GROUP BY。
记住一句话:先 WHERE 筛行,再 GROUP BY 分组,最后 HAVING 筛组
3349

被折叠的 条评论
为什么被折叠?



