您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

SQL 子查询2

1. 前言

在上一小节中,我们一起学习了 子的语法,并介绍了 子是如何在 Insert、Select、Update 和 Delete 中使用的。

本小节,我们将继续学习子中的两个特殊关键字语法——ANYALL

本小节测试数据如下,请先在中执行:

DROP TABLE IF EXISTS imooc_user;CREATE TABLE imooc_user(
  id int PRIMARY KEY,
  username varchar(),
  age int,
   int);INSERT INTO imooc_user(id,username,age,) VALUES (,'peter', , ),(,'pedro', , ),(,'jerry', , ),(,'mike', , ),(,'tom', , );DROP TABLE IF EXISTS imooc_user__rank;CREATE TABLE imooc_user__rank(
  id int PRIMARY KEY,
  srank int,
   int);INSERT INTO imooc_user__rank(id,srank,) VALUES (,,),(,,),(,,);

2. ANY 和 ALL

ANY 和 ALL 主要,子返回多条记录而主需要使用单值比较符的问题。

在上一节中,我们谈到如果子返回多条记录,那么主部分只能使用多值比较符,如 In,对于单值比较符,如 > ,则无法工作。

有了 ANY 和 ALL,就可以在一定程度上这个问题,针对子返回的结果,ANY 和 ALL 的作用分别如下:

简单的理解,ALL 和 ANY 让单值比较符跟子结果集中的每一条记录都做比较,ALL 必须满足所有比较才为真,而 ANY 只需满足任意比较则为真。

3. 实践

我们还是以例子来更加详细的说明 ANY 和 ALL 的。

请书写 语句,imooc_user表中分数大于imooc_user__rank表中任意分数的。

分析:

从题干中得出,imooc_user 表中的 对应 imooc_user__rank 中的 ,我们使用 ANY 子,第一步从子中 imooc_user__rank 表中的所有分数项,第二步在主中使用 ANY 与子结果比较。

语句:

整理可得语句如下:

SELECT username FROM imooc_user 
WHERE  > ANY(SELECT  FROM imooc_user__rank);

结果如下:

+----------+
| username |
+----------+
| tom      |
+----------+

tom 的分数为 1000, 大于 imooc_user__rank 表中的最小值 700,而其它的均小于 imooc_user__rank 表中任意分数。

请书写 语句,imooc_user表中分数大于imooc_user__rank表中所有分数的。

分析:

同上,只需将 ANY 换成 ALL 即可。

语句:

整理可得语句如下:

SELECT username FROM imooc_user 
WHERE  > ALL(SELECT  FROM imooc_user__rank);

结果如下:

+----------+
| username |
+----------+

在 imooc_user__rank 表中,最大的分数是 10000,而 imooc_user 表中分数均小于 10000,因此结果为空。

4. 小结

ALL 和 ANY 的使用其实比较少,多加练习理解即可。

子重在积少成多和融汇贯通,请务必多加练习形成自己的知识网。


联系我
置顶