MySQL 列子查詢及 IN、ANY、SOME 和 ALL 操作符的使用
MySQL 列子查詢
列子查詢是指子查詢返回的結果集是 N 行一列,該結果通常來自對表的某個字段查詢返回。
一個列子查詢的例子如下:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1)
列子查詢中使用 IN、ANY、SOME 和 ALL 操作符
由於列子查詢返回的結果集是 N 行一列,因此不能直接使用 = > < >= <= <> 這些比較標量結果的操作符。在列子查詢中可以使用 IN、ANY、SOME 和 ALL 操作符:
下面是原始數據表:
table1:
s1 2 10
table2:
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)
MySQL 行子查詢
行子查詢是指子查詢返回的結果集是一行 N 列,該子查詢的結果通常是對表的某行數據進行查詢而返回的結果集。
一個行子查詢的例子如下:
SELECT * FROM table1 WHERE (1,2) = (SELECT column1, column2 FROM table2)
在該例子中,在保證子查詢返回單一行數據的前提下,如果 column1=1 且 column2=2 ,則該查詢結果為 TRUE。
MySQL 行構造符
在上面的例子中,WHERE 後面的 (1,2) 被稱為行構造符,也可以寫作 ROW(1,2)。行構造符通常用於與對能返回兩個或兩個以上列的子查詢進行比較。
MySQL 行子查詢實例
下面是用於例子的兩張原始數據表:
article 表:
blog 表:
SQL 如下:
SELECT * FROM article WHERE (title,content,uid) = (SELECT title,content,uid FROM blog WHERE bid=2)
查詢返回結果如下所示:
在該行子查詢例子中,將 article 表 title,content,uid 字段逐一與子查詢返回的行記錄作比較,如果相等則列出這些相等的記錄(理論上可能不止一條)。