码迷,mamicode.com
首页 > 数据库 > 详细

MySQL的SQL语句 - 数据操作语句(13)- 子查询(5)

时间:2020-12-09 11:37:35      阅读:9      评论:0      收藏:0      [点我收藏+]

标签:空值   数据操作   网址   操作   使用   ofo   意思   相同   ref   

包含 ALL 的子查询

语法:

1. operand comparison_operator ALL (subquery)

关键词 ALL 必须跟在比较运算符之后,意思是“如果子查询返回的列中的所有值的比较都为真,则返回 TRUE”。例如:

1. SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);

假设表 t1 中有一行包含 (10)。如果表 t2 包含 (-5,0,+5),则表达式为 TRUE,因为 10 大于 t2 中的所有三个值。如果表 t2 包含 (12,6,NULL,-100),则表达式为 FALSE,因为表 t2 中有一个大于 10 的值 12。如果表 t2 包含 (0,NULL,1),则表达式是未知的(即 NULL)。

最后,如果表 t2 为空,则表达式为 TRUE。因此,当表 t2 为空时,以下表达式为真:

1. SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);

但当表 t2 为空时,此表达式为 NULL:

1. SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2);

此外,当表 t2 为空时,以下表达式为 NULL:

1. SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);

通常,包含空值的表和空表是“边缘情况”。写子查询时,请始终考虑是否考虑了这两种可能性。

NOT IN 是 <> ALL 的别名。因此,这两个语句是相同的:

1. SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2);
2. SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);

MySQL 8.0.19 支持 TABLE 语句。与 IN、ANY 和 SOME 一样,只要满足以下两个条件,就可以对 TABLE 使用 ALL 和 NOT IN:

● 子查询中的表只包含一列

● 子查询不依赖于列表达式

例如,假设表 t2 由一个列组成,那么前面显示的最后两个语句可以使用 TABLE t2 编写,如下所示:

1. SELECT s1 FROM t1 WHERE s1 <> ALL (TABLE t2);
2.SELECT s1 FROM t1 WHERE s1 NOT IN (TABLE t2);

像 SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2) 这样的查询不能使用 TABLE t2 编写,因为子查询依赖于列表达式。

官方网址:
https://dev.mysql.com/doc/refman/8.0/en/all-subqueries.html

MySQL的SQL语句 - 数据操作语句(13)- 子查询(5)

标签:空值   数据操作   网址   操作   使用   ofo   意思   相同   ref   

原文地址:https://blog.51cto.com/15023289/2559615

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!