


专栏:MySQL数据库成长记
个人主页:手握风云
目录
[1.1. Where条件查询](#1.1. Where条件查询)
[1.2. 示例](#1.2. 示例)
[1.3. Order by排序](#1.3. Order by排序)
[1.4. 示例](#1.4. 示例)
[1.5. 分页查询](#1.5. 分页查询)
[1.6. 示例](#1.6. 示例)
[2.1. 语法](#2.1. 语法)
[2.2. 示例](#2.2. 示例)
一、Retrieve检索
1.1. Where条件查询
- 语法
sql
SELECT
select_expr [, select_expr] ... [FROM table_references]
WHERE where_condition
- 比较运算符
|-------------------------|---------------------------------------------------------------|
| 运算符 | 说明 |
| >,>=,<,<= | 大于、大于等于、小于、等于 |
| = | 等于,对于NULL的比较不安全,⽐如NULL = NULL结果还是NULL |
| <=> | 等于,对于NULL的比较j是安全的,⽐如NULL NULL结果是TRUE(1) |
| !=,<> | 不等于 |
| value BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果a0 <= value <= a1,返回TRUE或1,NOT BETWEEN则取反 |
| value IN (option, ...) | 如果value 在optoin列表中,则返回TRUE(1),NOT IN则取反 |
| IS NULL | 为空 |
| IS NOT NULL | 不为空 |
| LIKE | 模糊匹配,% 表示任意多个(包括0个)字符;_ 表示任意⼀个字符,NOT LIKE则取反 |
- 逻辑运算符
|-----|----------|
| 运算符 | 说明 |
| AND | 相当于 && |
| OR | 相当于 || |
| NOT | 相当于 ! |
1.2. 示例
- 基本查询
sql
-- 查询英语成绩低于80分的人
select `name`,English from exam where English < 80;
-- 查询语文成绩高于英语成绩的人
select `name`,chinese,English from exam where chinese > English;
-- 总分低于230分的同学
select `name`,chinese + math + English from exam where chinese + math + English < 230;
-- 别名
select `name`,chinese + math + English as total from exam where chinese + math + English < 230;



先读取表中的每行记录,然后把WHERE条件应用到每行记录上进行运算,把符合条件的数据行放在临时表中,最后返回给客户端。并且两个列的值是在同一个数据中的,不能进行跨行比较,比如王五的语文成绩不能与钱七的英语成绩进行比较。
如果我们也是可以为查询结果取别名的,在表达式后面加上as "别名",或者as可以省去,直接空格+"别名"。但需要注意,别名不能在WHERE条件进行运算。
sql
select `name`,chinese + math + English as total from exam where chinese + math + English < 230;

至于原因:查询结果是根据表中的列或者是根据表中列进行运算的结果,from用来确定是在哪个表里面查,先经过where条件过滤,再返回到查询列表中得到我们想要的结果。也就是说,先通过from在哪个表里面找数据,再通过where条件筛选数据行,最后通过select把过滤的结果显示出来。
- AND和OR
sql
-- 查询语文成绩大于70分且英语成绩大于70分的同学
select `name`,chinese,English from exam where chinese > 70 and English > 70;
-- 查询语文成绩大于80分或数学成绩大于80分的同学
select `name`,chinese,math from exam where chinese > 80 or math > 80;


在没有括号的情况下,AND运算符会先于OR运算符进行计算。
- 范围查询
sql
-- 查询英语成绩在[70,80]
select `name`,English from exam where English between 70 and 80;
-- 语文成绩为71、74、76的同学
select `name`,chinese from exam where chinese in (71,74,76);


- NULL的查询
sql
-- 查询英语成绩为null的记录
insert into exam values (6,'王强',69,78,null);
select * from exam where English is null;
select * from exam where English <=> null;

sql
select * from exam where English is not null;

NULL与任何值运算结果都为NULL;过滤NULL时不要使用等于号(=)与不等于号(!= , <>)。
1.3. Order by排序
- 语法
sql
-- ASC为升序
-- DESC为降序
-- 不写默认为ASC
SELECT ... FROM table_name [WHERE ...] ORDER BY {col_name | expr } [ASC|DESC], ... ;
1.4. 示例
- 数学成绩升序排列
sql
select * from exam order by math asc;

- 英语成绩降序排列
sql
select * from exam order by English desc;

其中null会被看作最小的。指定了排序的列,返回的结果集是针对当前排序列进行排序的结果,排序是在额外的空间中进行的(使用的是临时表的空间)。
- 查询同学各门成绩,依次按数学降序,英语升序,语⽂升序的方式显示
sql
-- 不同列之间用逗号隔开
select * from exam order by math desc,english asc,chinese asc;

以上顺序是要在先对数学成绩进行排序,在此基础上,再对英语成绩进行排序,再对语文成绩进行排序。
1.5. 分页查询
sql
select * from 表名
上面这条SQL语句不能有效地去限制结果集的个数,这样的查询是不安全的,因为这样查询,结果集过大有可能会把服务器的资源消耗殆尽。而分页查询的目的就是为了限制返回集结果大小,这样就可以有效减少服务器的压力,同时也有较好的用户体验。

- 语法
sql
-- 起始下标为 0
-- 从 0 开始,筛选 num 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num;
-- 从 start 开始,筛选 num 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT start, num;
-- 从 start 开始,筛选 num 条结果,⽐第⼆种⽤法更明确,建议使⽤
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num OFFSET start;
1.6. 示例
sql
-- 从第0行开始,查询前3条记录,返回最终的结果集
select * from exam limit 3;

sql
-- 先执行排序,再执行limit
select * from exam order by id desc limit 2;

sql
-- 从第2条,向后查询2条
select * from exam limit 2,2;

sql
-- 如果超过记录数的范围则会返回空
select * from exam limit 6,2;

sql
-- 从第0行开始,偏移3行查询
select * from exam limit 3 offset 0;

总页数的计算:数据库中数据的总条数/每页要显示的记录数,如果有余数,总页数要+1。start:当前的页数-1。最后一页有多少条就返回多少条。
二、Update修改
2.1. 语法
sql
UPDATE [LOW_PRIORITY] [IGNORE] 表名
SET assignment [, assignment] ...
[WHERE where_condition]
[ORDER BY ...]
-- 对多少行进行修改
[LIMIT row_count
列名一定要与数据类型匹配。
2.2. 示例
sql
-- 将张三的数学成绩变为80分
update exam set math = 80 where `name` = '张三';

当我们不写where条件时,会把全部的数据都会更新,所以说update也是一个危险操作。
sql
-- 将李四的语文成绩修改为80,数学成绩修改为75
update exam set chinese = 80,math = 75 where `name` = '李四';
