# 高级查询
# 案例数据
# 模糊查询:like
在MySQL中,我们可以在where子句中使用like运算符来实现模糊查询。like运算符都是放在where子句中使用,并且它一般需要结合通配符来一起使用。
通配符 | 说明 |
---|---|
% | 0个或多个字符 |
_ | 1个字符 |
# 通配符:%
在SQL中,通配符 %
代表的是一个任何长度的字符串(0个或多个字符)。对于“%”来说,它的常用方式有以下3种。
(1)where 列名 like 'string%'
(2)where 列名 like '%string'
(3)where 列名 like '%string%'
示例
查询所有 name
以“瓜”结尾的数据
SELECT * FROM `fruit` where name like '%瓜'
# 通配符:_
在SQL中,通配符“”代表的是一个字符,也就是长度为1的字符串。对于“”来说,它的常用方式有以下3种。
(1)where 列名 like 'string_'。
(2)where 列名 like '_string'。
(3)where 列名 like 'string'
示例
查询所有 name
为两个长度且第二个为“瓜”的数据
SELECT * FROM `fruit` where name like '_瓜'
# 转义通配符:\
我们可以在“%”或“_”的前面加上一个反斜杠“\”,此时该字符就变成了一个普通字符,而不具备通配符的功能。这一点和大多数编程语言中的转义字符是一样的。
# 随机查询:rand()
对于 MySQL 来说,我们可以使用 rand()
函数来实现随机查询。其中,rand
是“random(随机)”的缩写。
select 列名
from 表名
order by rand()
limit n;
2
3
4
# 子查询
子查询,指的是在一条 select
语句中使用另一条 select
语句。一般来说,另一条 select
语句查询的结果往往会作为第一条 select
语句的查询条件。
(1)单值子查询。
(2)多值子查询。
(3)关联子查询。
# 单值子查询
单值子查询,指的是作为子查询的select语句返回的结果是“单个值”,也就是返回1行1列的结果。
**示例:**先查询出最大价格字段,再查询所有数据中匹配最大价值的数据
其中 SELECT MAX(price) FROM fruit
是单值子查询
SELECT * from `fruit` WHERE price = (SELECT MAX(price) FROM fruit);
# 多值子查询
- 多值子查询,指的是作为子查询的
select
语句返回的结果是“多个值”,一般是一列多行。 - 对于多值子查询来说,一般是放在
where
子句中,结合 in、all、any、some 这4个关键字来一起使用。
- all、any、some 这3个关键字必须要和比较运算符一起使用。
- “=any” 等价于 “in”。
- “<>all” 等价于 “not in”
# 操作符 in
in
操作符用于检查一个值是否存在于子查询返回的结果集中。
新增一张表 popular_types 存最受欢迎的水果类型
CREATE TABLE popular_types (
type VARCHAR(50) PRIMARY KEY
);
INSERT INTO popular_types (type) VALUES
('浆果'),
('瓜果');
2
3
4
5
6
7
以下是一个示例:查询所有属于受欢迎类型的水果(浆果、瓜果)
SELECT * FROM fruit
WHERE type IN (SELECT type FROM popular_types);
2
# 操作符 all
用于比较某个值与子查询返回的结果集中的所有值。如果外部查询中的值满足与子查询返回的所有值进行比较的条件,则 ALL
操作符返回 TRUE
。
**示例:**查找价格低于表中所有“浆果”类型水果价格的“瓜果”类型水果
SELECT * FROM fruits f1
WHERE f1.type = '瓜果' AND f1.price < ALL (SELECT f2.price FROM fruits f2 WHERE f2.type = '浆果');
2
# 操作符 any
用于比较某个值与子查询返回的结果集中的任意一个值。如果外部查询中的值满足与子查询返回的任意一个值进行比较的条件,则 ANY
操作符返回 TRUE
。
**示例:**查找价格低于表中任意一个“浆果”类型水果价格的“瓜果”类型水果。
SELECT * FROM fruit f1
WHERE f1.type = '瓜果' AND f1.price < ANY (SELECT f2.price FROM fruit f2 WHERE f2.type = '浆果');
2
# 操作符 some
在 SQL 标准中,SOME
操作符实际上是 ANY
操作符的一个同义词。这意味着在大多数数据库系统(包括 MySQL)中,SOME
和 ANY
可以互换使用,而不会产生不同的结果。
因此,使用 SOME
操作符的多值子查询与使用 ANY
操作符的多值子查询在语法和功能上是相同的。
# 关联子查询
关联子查询,指的是父查询和子查询是“相关联”的,子查询的条件需要依赖于父查询。
特别注意,关联子查询的关联条件判断一定要写在子查询中,而不是写在父查询中
**示例:**查询每种类型中价格最高的水果
SELECT *
FROM fruit f1
WHERE f1.price = (
SELECT MAX(f2.price)
FROM fruit f2
WHERE f2.type = f1.type
);
2
3
4
5
6
7
在这个查询中:
f1
是外部查询的别名,用于引用fruit
表。- 子查询是一个关联子查询,因为它引用了外部查询中的
f1.type
列。 - 子查询查找与
f1
相同类型的水果中的最高价格。 - 外部查询选择那些其价格等于子查询返回的最高价格的水果。