MySQL数据库精研之旅第五期:CRUD的趣味探索(中)

专栏:MySQL数据库成长记

个人主页:手握风云

目录

一、Retrieve检索

[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. 示例)

二、Update修改

[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` = '李四';
相关推荐
·薯条大王42 分钟前
MySQL联合查询
数据库·mysql
morris1313 小时前
【redis】redis实现分布式锁
数据库·redis·缓存·分布式锁
hycccccch3 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
这个懒人4 小时前
深入解析Translog机制:Elasticsearch的数据守护者
数据库·elasticsearch·nosql·translog
Yan-英杰4 小时前
【百日精通JAVA | SQL篇 | 第二篇】数据库操作
服务器·数据库·sql
NineData4 小时前
NineData云原生智能数据管理平台新功能发布|2025年3月版
数据库
百代繁华一朝都-绮罗生6 小时前
检查是否存在占用内存过大的SQL
数据库·sql
吾日三省吾码6 小时前
Python 脚本:自动化你的日常任务
数据库·python·自动化
CZIDC6 小时前
win11 系统环境下 新安装 WSL ubuntu + ssh + gnome 桌面环境
数据库·ubuntu·ssh
直裾6 小时前
Mapreduce的使用
大数据·数据库·mapreduce