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` = '李四';
相关推荐
努力进修1 小时前
【金仓数据库征文】-金仓数据库性能调优 “快准稳” 攻略:实战优化,让数据处理飞起来
数据库·人工智能·金仓数据库 2025 征文·数据库平替用金仓
User_芊芊君子2 小时前
【金仓数据库征文】金仓数据库KingbaseES:千行百业国产化征程中的璀璨之星
数据库·数据库平替用金仓·金仓数据库2025征文
_extraordinary_3 小时前
MySQL 库的操作 -- 增删改查,备份和恢复,系统编码
android·mysql·oracle
mutianhao10243 小时前
SQLAlchemy 2.x 异步查询方法比较
python·mysql·sqlalchemy
User_芊芊君子3 小时前
【金仓数据库征文】金仓数据库KingbaseES:在技术与人文交织中开拓信创未来
数据库·数据库平替用金仓·金仓数据库2025征文
傻啦嘿哟4 小时前
Python正则表达式:用“模式密码“解锁复杂字符串
linux·数据库·mysql
言之。5 小时前
别学了,打会王者吧
java·python·mysql·容器·spark·php·html5
辰哥单片机设计6 小时前
JW01三合一传感器详解(STM32)
数据库·mongodb
小刘同学++6 小时前
Qt使用 SQLite 数据库的基本方法
数据库·qt·sqlite
jack_xu8 小时前
高频面试题:如何保证数据库和es数据一致性
后端·mysql·elasticsearch