浅析sql中IN、ANY、SOME 和 ALL 操作符的使用

一、sql中all、any、some用法

1、All:对所有数据都满足条件,整个条件才成立,例如:5大于所有返回的id

select * from #A where 5>All(select id from #A) 

2、Any:只要有一条数据满足条件,整个条件成立,例如:3大于1,2

二、MySQL 列子查询及 IN、ANY、SOME 和 ALL 操作符的使用

1、MySQL 列子查询

  列子查询是指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回。一个列子查询的例子如下:

SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1)

2、列子查询中使用 IN、ANY、SOME 和 ALL 操作符

  由于列子查询返回的结果集是 N 行一列,因此不能直接使用 = > < >= <= <> 这些比较标量结果的操作符。在列子查询中可以使用 IN、ANY、SOME 和 ALL 操作符:

  • IN:在指定项内,同 IN(项1,项2,…)。
  • ANY:与比较操作符联合使用,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。
  • SOME:ANY 的别名,较少使用。
  • ALL:与比较操作符联合使用,表示与子查询返回的所有值比较都为 TRUE ,则返回 TRUE 。

(1)ANY 关键字必须接在一个比较操作符的后面,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。一个 ANY 例子如下:

SELECT s1 FROM table1 WHERE s1 > ANY (SELECT s2 FROM table2)

  在子查询中,返回的是 table2 的所有 s2 列结果(5,12,20),然后将 table1 中的 s1 的值与之进行比较,只要大于 s2 的任何值即表示为 TRUE,符合查询条件。

  需要注意的是:IN 是 = ANY 的别名,二者相同,但 NOT IN 的别名却不是 <> ANY 而是 <> SOME

  特殊情况:

  • 如果 table2 为空表,则 ANY 后的结果为 FALSE;
  • 如果子查询返回如 (NULL,NULL,NULL) 列为空的结果,则 ANY 后的结果为 UNKNOWN 。

(2)ALL 关键字必须接在一个比较操作符的后面,表示与子查询返回的所有值比较为 TRUE ,则返回 TRUE 。一个 ALL 例子如下

SELECT s1 FROM table1 WHERE s1 > ALL (SELECT s2 FROM table2)

  该查询不会返回任何结果,因为 s1 中没有比 s2 所有值都大的值。当然在该例子查询中,返回了 s2 的所有值,您可以在该子查询中添加任何条件以限制返回的查询结果而无需全部返回。

  需要注意的是:NOT IN 是 <> ALL 的别名,二者相同

  特殊情况:

  • 如果 table2 为空表,则 ALL 后的结果为 TRUE;
  • 如果子查询返回如 (0,NULL,1) 这种尽管 s1 比返回结果都大,但有空行的结果,则 ALL 后的结果为 UNKNOWN 。

 

posted @ 2017-08-31 23:19  古兰精  阅读(1150)  评论(0编辑  收藏  举报