目录
[order by语句](#order by语句)
[group by句子的使用](#group by句子的使用)
Create
插入
语法:
INSERT [INTO] table_name
(column \[, column\] ...)
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...
注意:MySQL语法不区分单双引号,不区分大小写。
忽略:全列插入。
()values():像一个扁担,左边和右边对应。其中前一个括号指明要插入的列,后一个括号填写对应的元素。如果前一个括号忽略则默认为全列插入。
可同时插入多条,即()values(),(),()......
into也可省略。
示例:
sql
mysql> create table test8(
-> id int primary key auto_increment,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into test8 (id,name)values(20250031,'张三');
Query OK, 1 row affected (0.01 sec)
mysql> insert test8 (name)values('李四');
Query OK, 1 row affected (0.01 sec)
mysql> insert test8 values(20250045,'王五');
Query OK, 1 row affected (0.00 sec)
mysql> insert test8 (name)values('赵六'),('田七');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql>
替换
语法
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...
通常用来解决由于主键 或者唯一键对应的值已经存在而导致插入失败的问题。即对数据进行更新。
如下我们插入已存在主键的值:
sql
mysql> insert into values(20250031,'李华');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values(20250031,'李华')' at line 1
mysql> insert into test8 values(20250031,'李华') on duplicate key update name='李华';
Query OK, 2 rows affected (0.00 sec)
mysql>

方法二:
sql
mysql> replace into test8 values(20250031,'小明');
Query OK, 2 rows affected (0.00 sec)

Retrieve(读取)
select(确定列)
语法:
SELECT
column1, column2, ...
FROM
table_name
WHERE condition
GROUP BY column_name
HAVING condition
ORDER BY column_name \[ASC\|DESC\]
LIMIT offset, count\];
全列查询:select * from 表名(建议不要使用)。
去重:select distinct 列名 form 表名
案例:


显示时对列重命名:列名 as 新列名。as可省略。
其次可对列进行运算然后显示,如下:

where条件(确定行)
语法:
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件表达式;


注意:NULL和0不一样。
NULL=NULL结果还是NULL,因为NULL不可以用=比较,而是用<=>。通常用is null,is not null。
示例:
英语不及格的同学及英语成绩
sql
mysql> select name,english from exam_result where english<60;
语文成绩在[80,90]分的同学及语文成绩
sql
select name,chinese from exam_result where chinese>=80 and chinesese<=90;
或:
sql
mysql> select name,chinese from exam_result where chinese between 80 and 90;
数学成绩是58或59或98或99分的同学及数学成绩
sql
mysql> select name,math from exam_result where math=58 or math=59 or math=98 or math=99;
或
sql
mysql> select name,math from exam_result where math in (58,59,98,99);
姓孙的同学 及 孙某同学
sql
mysql> select name from exam_result where name like '孙%';
sql
mysql> select name from exam_result where name like '孙_';
语文成绩好于英语成绩的同学
sql
mysql> select name,chinese,english from exam_result where chinese > english;
总分在200分以下的同学
sql
mysql> select name,chinese+math+english 总分 from exam_result where chiinese+math+english<200;
注意:语句的执行顺序是从右往左,所以不能使用'总分'这个词来计算,而where不支持把列重命名。执行顺序:1.from 2.where 3.select
语文成绩>80并且不姓孙的同学
sql
mysql> select name,chinese from exam_result where chinese>80 and not(name like '孙%');
孙某同学,否则要求总成绩>200并且语文成绩<数学并且英语成绩>80
sql
mysql> select name,chinese,math,english,chinese+math+english 总分
-> from exam_result
-> where (name like '孙_') or (chinese+math+english>200 and chinesee<math and english>80);
null查询

order by语句
语法:
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
注意:没有带asc或desc的排序查询,返回的顺序是未定义的。
同学及数学成绩,按数学成绩升序显示:
sql
mysql> select name,math from exam_result order by math asc;
注意:NULL在排序时原则上比任何值都小。
查询同学各门成绩,依次按数学降序,英语升序,语文升序的方式显示:
sql
mysql> select name,math,english,chinese
-> from exam_result
-> order by math desc,english desc,chinese asc;
查询同学及总分,从高到低
sql
mysql> select name,math+chinese+english as total
-> from exam_result
-> order by total desc;
这里order by后总分能用别名是因为,order by是后执行的。
查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示:
sql
mysql> select name,math
-> from exam_result
-> where name like '孙%' or name like '曹%'
-> order by math desc;
limit(分页)
语法:
-- 起始下标为 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;
建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死。
按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页
从开头连续读取3行
sql
mysql> select*from exam_result limit 3;
从第2行开始往下读取4行:
sql
mysql> select*from exam_result limit 2,4;
Update(更新)
语法:
UPDATE table_name SET column = expr [, column = expr ...]
WHERE ...\] \[ORDER BY ...\] \[LIMIT ...
用于对查询到的值进行更新。
将孙悟空同学的数学成绩改为80分
sql
mysql> update exam_result set math=80 where name='孙悟空';
将曹孟德同学的数学成绩改为60分,语文成绩改为70分
sql
mysql> update exam_result set math=60,chinese=70 where name='曹孟德';
将总成绩倒数前三的3位同学的数学成绩加30分
sql
mysql> update exam_result set math=math+30
-> order by math+chinese+english asc
-> limit 3;
将所有同学的语文成绩更新为原来的2倍。
Delete(删除)
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
删除孙悟空同学的考试成绩
sql
mysql> delete from exam_result where name='孙悟空';
删除整张表数据:delete from 表名。
截断表
语法:
TRUNCATE [TABLE] table_name
注意:这个操作慎用
- 只能对整表操作,不能像 DELETE 一样针对部分数据操作。
- 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚。
- 会重置 AUTO_INCREMENT 项。delete不会重置AUTO_INCREMENT。
去重表数据
语法:
INSERT INTO table_name [(column [, column ...])] SELECT...
比如我们有一个表:duplicate_table,要对它去重,
首先创建一个相同的表结构
sql
mysql> create table no_duplicate_table like duplicate_table;
sql
mysql> insert into noduplicate_table select distinct * from duplicate_table;
然后把duplicate_table删除,no_duplicate_table重命名为 duplicate_table。
这样的好处在于把一切都准备就绪,然后统一放入、更新、生效等。
聚合统计
聚合函数
|--------------------------|------------------------|
| 函数 | 说明 |
| COUNT([DISTINCT] expr) | 返回查询到的数据的 数量 |
| SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
| AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
| MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
| MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
测试:
统计班里一共多少学生
sql
mysql> select count(*) from exam_result;
或:
sql
mysql> select count(name) from exam_result;
统计数学成绩总分
sql
mysql> select sum(math) from exam_result;
统计平均总分
sql
mysql> select sum(math+chinese+english)/count(name) from exam_result;
或:
sql
mysql> select avg(math+chinese+english) from exam_result;
返回英语最高分
sql
mysql> select max(english) from exam_result;
返回>70分以上的数学最低分
sql
mysql> select min(math) from exam_result where math>70;
group by句子的使用
语法:
select column1, column2, .. from table group by column;
分组:把一组按条件拆分成多个组 。然后在各自组能做统计。在逻辑上相当于拆分成多张"表"。
测试:

显示每个部门的平均工资和最高工资
sql
select deptno,avg(sal),max(sal) from emp group by deptno;
显示每个部门的每种岗位的平均工资和最低工资
sql
select avg(sal),min(sal),job, deptno from emp group by deptno, job;
显示平均工资低于2000的部门和它的平均工资。having和group by配合使用,对group by结果进行过滤
sql
select avg(sal) as myavg from emp group by deptno having myavg<2000;
having与where的使用方法相同,但它们使用在不同的场景。
- where:对具体任意列进行统计筛选。
- having:对分组聚合后的结果进行条件筛选。