列子查詢是指子查詢返回的結果集是 N 行一列,該結果通常來自對表的某個字段查詢返回。
一個列子查詢的例子如下:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1)
該例子在前文《MySQL 子查詢subquery語法與用法實例》已有解釋及數據實例,在此不再贅述。
列子查詢中使用 IN、ANY、SOME 和 ALL 操作符
由於列子查詢返回的結果集是 N 行一列,因此不能直接使用 = > < >= <= <> 這些比較標量結果的操作符。在列子查詢中可以使用 IN、ANY、SOME 和 ALL 操作符:
- IN:在指定項內,同 IN(項1,項2,…)。
- ANY:與比較操作符聯合使用,表示與子查詢返回的任何值比較為 TRUE ,則返回 TRUE 。
- SOME:ANY 的別名,較少使用。
- ALL:與比較操作符聯合使用,表示與子查詢返回的所有值比較都為 TRUE ,則返回 TRUE 。
下面是原始數據表:
s1 |
---|
2 |
10 |
s2 |
---|
5 |
12 |
20 |
ANY 操作符
ANY 關鍵字必須接在一個比較操作符的后面,表示與子查詢返回的任何值比較為 TRUE ,則返回 TRUE 。一個 ANY 例子如下:
SELECT s1 FROM table1 WHERE s1 > ANY (SELECT s2 FROM table2)
查詢返回結果如下所示:
s1 |
---|
10 |
在子查詢中,返回的是 table2 的所有 s2 列結果(5,12,20),然后將 table1 中的 s1 的值與之進行比較,只要大於 s2 的任何值即表示為 TRUE,符合查詢條件。
IN 是 = ANY 的別名,二者相同,但 NOT IN 的別名卻不是 <> ANY 而是 <> SOME。
特殊情況
- 如果 table2 為空表,則 ANY 后的結果為 FALSE;
- 如果子查詢返回如 (NULL,NULL,NULL) 列為空的結果,則 ANY 后的結果為 UNKNOWN 。
ALL 操作符
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 。
注意:對於 table2 空表的情況,下面的語句均返回 NULL:
SELECT s1 FROM table1 WHERE s1 > (SELECT s2 FROM table2) SELECT s1 FROM table1 WHERE s1 > ALL (SELECT MAX(s1) FROM table2)