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

发布于:2025-04-03 ⋅ 阅读:(17) ⋅ 点赞:(0)

专栏: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条件查询

  • 语法
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. 示例

  • 基本查询
-- 查询英语成绩低于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为降序
-- 不写默认为ASC

SELECT ... 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` = '李四';