表的增删查改
CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)
1.Create
语法:
sql
INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...
中的代表可以被省略的部分。
以studet表为例:

单行插入: (框出来的地方可省略)列名可以部分省略,前提要符合数据的约束

**多行插入:**插入的部分用 ','隔开,最后一个加';'

插入否则更新
由于 主键 或者 唯一键 对应的值已经存在而导致插入失败,可以选择性的进行同步更新操作:
语法:
sql
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...


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

2.Retrieve
sql
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...

全列查询

指定列查询
查询字段为表达式
表达式不包含字段:

表达式包含一个字段:

表达式包含多个字段 :

为查询结果指定别名:

结果去重
有重复

去重后

WHERE 条件


练习:
查询英语成绩小于60 的学生

语文成绩在 80, 90 分的同学及语文成绩


数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩


姓孙的同学 及 孙某同学

语文成绩好于英语成绩的同学

总分在 200 分以下的同学

语文成绩 > 80 并且不姓孙的同学

NULL 的查询
sql
SELECT name, qq FROM students WHERE qq IS NOT NULL;
-- NULL 和 NULL 的比较,= 和 <=> 的区别

结果排序
sql
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小) -- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
注:null值默认比任何值都小
例子:
同学及数学成绩,按数学成绩升序显示

查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示

查询同学及总分,由高到低

筛选分页结果
sql
-- 起始下标为 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 s;

建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死
例子:
按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页

3.Update
sql
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
对查询到的结果进行列值更新
示例
将孙悟空同学的数学成绩变更为 80 分

将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分

将总成绩倒数前三的3位同学的数学成绩加上30分

4.Delete
sql
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
例子:
删除孙悟空同学的考试成绩

删除表




我们可以看到这个auto_increment=4,不会因为删除所有的元素而重置自动增长id的计数器

因此我们再插入数据时,可以看到id从4开始

截断表
sql
TRUNCATE [TABLE] table_name
注意:这个操作慎用
- 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
- 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事
物,所以无法回滚 - 会重置 AUTO_INCREMENT 项



我们可以观察到,与删除整表不同的是截断表truncate会将计数器重置

5.插入查询结果
sql
INSERT INTO table_name [(column [, column ...])] SELECT ...
删除表中的的重复复记录,重复的数据只能有一份

创建一张空表 no_duplicate_table,结构和 duplicate_table 一样

将 duplicate_table 的去重数据插入到 no_duplicate_table

通过重命名表,实现原子的去重操作

6.聚合函数
示例:统计多少学生


统计math列有多少个成绩

统计数math成绩不同的个数

统计math成绩的总和

统计math成绩的平均值


统计英语成绩小于六十的有几人

数学成绩超过七十分的最小成绩

7.分组聚合统计
在select中使用group by 子句可以对指定列进行分组查询:
sql
select column1, column2, .. from table group by column;
分组就像防御把一组按照条件拆成了多个组,进行各自组内的统计分组(分表),就是相当于把一战表按照条件在逻辑上拆成了多个子表,然后对各自的子表进行聚合统计

显示每个部门的平均工资和最高工资

显示每个部门的每种岗位的平均工资和最低工资

显示平均工资低于2000的部门和它的平均工资
having是对聚合后的统计数据,再进行条件筛选
