专栏:MySQL数据库成长记
个人主页:手握风云
目录
一、Retrieve检索
1.1. Where条件查询
1.2. 示例
1.3. Order by排序
1.4. 示例
1.5. 分页查询
1.6. 示例
二、Update修改
2.1. 语法
2.2. 示例
一、Retrieve检索
1.1. Where条件查询
- 语法
SELECTselect_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. 示例
- 基本查询
-- 查询英语成绩低于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条件进行运算。
select `name`,chinese + math + English as total from exam where chinese + math + English < 230;
至于原因:查询结果是根据表中的列或者是根据表中列进行运算的结果,from用来确定是在哪个表里面查,先经过where条件过滤,再返回到查询列表中得到我们想要的结果。也就是说,先通过from在哪个表里面找数据,再通过where条件筛选数据行,最后通过select把过滤的结果显示出来。
- AND和OR
-- 查询语文成绩大于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运算符进行计算。
- 范围查询
-- 查询英语成绩在[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的查询
-- 查询英语成绩为null的记录
insert into exam values (6,'王强',69,78,null);
select * from exam where English is null;
select * from exam where English <=> null;
select * from exam where English is not null;
NULL与任何值运算结果都为NULL;过滤NULL时不要使用等于号(=)与不等于号(!= , <>)。
1.3. Order by排序
- 语法
-- ASC为升序
-- DESC为降序
-- 不写默认为ASCSELECT ... FROM table_name [WHERE ...] ORDER BY {col_name | expr } [ASC|DESC], ... ;
1.4. 示例
- 数学成绩升序排列
select * from exam order by math asc;
- 英语成绩降序排列
select * from exam order by English desc;
其中null会被看作最小的。指定了排序的列,返回的结果集是针对当前排序列进行排序的结果,排序是在额外的空间中进行的(使用的是临时表的空间)。
- 查询同学各门成绩,依次按数学降序,英语升序,语⽂升序的方式显示
-- 不同列之间用逗号隔开
select * from exam order by math desc,english asc,chinese asc;
以上顺序是要在先对数学成绩进行排序,在此基础上,再对英语成绩进行排序,再对语文成绩进行排序。
1.5. 分页查询
select * from 表名
上面这条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. 示例
-- 从第0行开始,查询前3条记录,返回最终的结果集
select * from exam limit 3;
-- 先执行排序,再执行limit
select * from exam order by id desc limit 2;
-- 从第2条,向后查询2条
select * from exam limit 2,2;
-- 如果超过记录数的范围则会返回空
select * from exam limit 6,2;
-- 从第0行开始,偏移3行查询
select * from exam limit 3 offset 0;
总页数的计算:数据库中数据的总条数/每页要显示的记录数,如果有余数,总页数要+1。start:当前的页数-1。最后一页有多少条就返回多少条。
二、Update修改
2.1. 语法
UPDATE [LOW_PRIORITY] [IGNORE] 表名SET assignment [, assignment] ...[WHERE where_condition][ORDER BY ...]-- 对多少行进行修改[LIMIT row_count
列名一定要与数据类型匹配。
2.2. 示例
-- 将张三的数学成绩变为80分
update exam set math = 80 where `name` = '张三';
当我们不写where条件时,会把全部的数据都会更新,所以说update也是一个危险操作。
-- 将李四的语文成绩修改为80,数学成绩修改为75
update exam set chinese = 80,math = 75 where `name` = '李四';