MySQL 8.4 發行說明
純量或欄子查詢會傳回單一值或值的欄。 列子查詢是一種子查詢變體,它會傳回單一列,因此可以傳回多個欄值。列子查詢比較的合法運算子為
= > < >= <= <> != <=>
以下是兩個範例
SELECT * FROM t1
WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
SELECT * FROM t1
WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
對於這兩個查詢,如果資料表 t2
包含一列 id = 10
,則子查詢會傳回單一列。如果此列的 col3
和 col4
值等於 t1
中任何列的 col1
和 col2
值,則 WHERE
運算式為 TRUE
,且每個查詢都會傳回這些 t1
列。如果 t2
列的 col3
和 col4
值不等於任何 t1
列的 col1
和 col2
值,則運算式為 FALSE
,且查詢會傳回空的結果集。如果子查詢未產生任何列,則運算式為未知 (也就是說,NULL
)。如果子查詢產生多列,則會發生錯誤,因為列子查詢最多只能傳回一列。
關於每個運算子如何進行列比較,請參閱第 14.4.2 節,「比較函數和運算子」。
運算式 (1,2)
和 ROW(1,2)
有時稱為列建構子。兩者是等效的。列建構子和子查詢返回的列必須包含相同數量的數值。
列建構子用於與返回兩列或多列的子查詢進行比較。當子查詢返回單一列時,這被視為純量值,而不是列,因此列建構子不能用於返回至少兩列的子查詢。因此,以下查詢會因語法錯誤而失敗。
SELECT * FROM t1 WHERE ROW(1) = (SELECT column1 FROM t2)
列建構子在其他上下文中是合法的。例如,以下兩個語句在語義上是等效的(並且由最佳化器以相同的方式處理)。
SELECT * FROM t1 WHERE (column1,column2) = (1,1);
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
以下查詢回答了請求:「「找出資料表 t1
中也存在於資料表 t2
中的所有列」
SELECT column1,column2,column3
FROM t1
WHERE (column1,column2,column3) IN
(SELECT column1,column2,column3 FROM t2);
有關最佳化器和列建構子的更多資訊,請參閱第 10.2.1.22 節,「列建構子運算式最佳化」