表的增删改查
CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)
目录
1.Create:
1.1 插入 insert:
1.1.1 单行数据 + 全列插入:
1.1.2 多行数据 + 指定列插入:
1.1.3 插入否则更新:
1.2 替换 replace:
2.Retrieve:
2.1 SELECT 列:
2.1.1 全列查询:
2.1.2 指定列查询:
2.1.3 查询字段为表达式:
2.1.4 为查询结果指定别名:
2.1.5 结果去重:
2.2 WHERE 条件:
2.3 结果排序:
2.4 筛选分页结果:
3 Update:
3.1 更新值为具体值:
3.2 一次更新多个列:
3.3 更新值为原值基础上变更:
3.4 更新全表(没有 WHERE 子句):
4 Delete:
4.1 删除数据:
4.1.1 删除指定行:
4.1.2 删除整张表数据(没有 WHERE 子句):
4.2 截断表:
5 插入查询结果:
5.1 创建一张空表 no_duplicate_table,结构和 duplicate_table 一样
5.2 将 duplicate_table 的去重数据插入到 no_duplicate_table
5.3 通过重命名表,实现原子的去重操作
6 聚合函数:
6.1 统计次数:
6.2 统计平均数:
7 group by子句的使用:
7.1 如何显示每个部门的平均工资和最高工资
7.2 显示每个部门的每种岗位的平均工资和最低工资
7.3 显示平均工资低于2000的部门和它的平均工资
1.Create:
1.1 插入 insert:
语法:
insert [into] table_name [column,....] values (value_list)
[,(value_list,......)] ;
1.1.1 单行数据 + 全列插入:
INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);
1.1.2 多行数据 + 指定列插入:
INSERT INTO students (id, sn, name) VALUES
(102, 20001, '曹孟德'),
(103, 20002, '孙仲谋');
1.1.3 插入否则更新:
若由于主键或者唯一键冲突,则更新此行数据。
INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师')
ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大师';
1.2 替换 replace:
若由于主键或者唯一键冲突,则替换为新数据。
REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒');
2.Retrieve:
语法:
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
[LIMIT ...] ;
2.1 SELECT 列:
2.1.1 全列查询:
SELECT * FROM exam_result;
2.1.2 指定列查询:
SELECT id, name, english FROM exam_result;
2.1.3 查询字段为表达式:
SELECT id, name, chinese + math + english FROM exam_result;
2.1.4 为查询结果指定别名:
语法:
SELECT column [AS] alias_name [,...] FROM table_name;
案例:
SELECT id, name, chinese + math + english 总分 FROM exam_result;
2.1.5 结果去重:
SELECT DISTINCT math FROM exam_result;
2.2 WHERE 条件:
比较运算符:

逻辑运算符:

2.3 结果排序:
ASC 为升序(从小到大) DESC 为降序(从大到小) 默认为 ASC
语法:
SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...];
案例:
查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
SELECT name, math, english, chinese FROM exam_result
ORDER BY math DESC, english, chinese;
2.4 筛选分页结果:
语法:
起始下标为 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;
3 Update:
语法:
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
3.1 更新值为具体值:
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';
3.2 一次更新多个列:
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';
3.3 更新值为原值基础上变更:
UPDATE exam_result SET math = math + 30
ORDER BY chinese + math + english
LIMIT 3;
3.4 更新全表(没有 WHERE 子句):
UPDATE exam_result SET chinese = chinese * 2;
4 Delete:
4.1 删除数据:
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
案例:
4.1.1 删除指定行:
DELETE FROM exam_result WHERE name = '孙悟空';
4.1.2 删除整张表数据(没有 WHERE 子句):
DELETE FROM for_delete;
4.2 截断表:
语法:
TRUNCATE [TABLE] table_name
注意:
1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
3. 会重置 AUTO_INCREMENT 项,DELETE不会重置。
5 插入查询结果:
语法:
INSERT INTO table_name [(column [, column ...])] SELECT ...
案例:删除表中的的重复复记录,重复的数据只能有一份
5.1 创建一张空表 no_duplicate_table,结构和 duplicate_table 一样
CREATE TABLE no_duplicate_table LIKE duplicate_table;
5.2 将 duplicate_table 的去重数据插入到 no_duplicate_table
INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table;
5.3 通过重命名表,实现原子的去重操作
RENAME TABLE duplicate_table TO old_duplicate_table,
no_duplicate_table TO duplicate_table;
6 聚合函数:
函数:

案例:
6.1 统计次数:
SELECT COUNT(*) FROM students;
6.2 统计平均数:
SELECT AVG(math) FROM students;
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) from EMP group by deptno
having和group by配合使用,对group by结果进行过滤
select avg(sal) as myavg from EMP group by deptno having myavg<2000;
--having经常和group by搭配使用,作用是对分组进行筛选,作用有些像where。
*SQL查询中各个关键字的执行先后顺序:
from > on> join > where > group by > with > having > select > distinct > order by > limit
