MySQL 9.0 版本注意事項
純量或欄子查詢會傳回單一值或一欄值。 列子查詢是一種子查詢的變體,它會傳回單一列,因此可以傳回多個欄值。列子查詢比較的合法運算子為
= > < >= <= <> != <=>
以下為兩個範例
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 節,「列建構子運算式最佳化」