文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  列子查詢

15.2.15.5 列子查詢

純量或欄子查詢會傳回單一值或一欄值。 列子查詢是一種子查詢的變體,它會傳回單一列,因此可以傳回多個欄值。列子查詢比較的合法運算子為

=  >  <  >=  <=  <>  !=  <=>

以下為兩個範例

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,則子查詢會回傳單一列。如果此列的 col3col4 值等於 t1 中任何列的 col1col2 值,則 WHERE 運算式為 TRUE,且每個查詢都會回傳那些 t1 列。如果 t2 列的 col3col4 值不等於任何 t1 列的 col1col2 值,則運算式為 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 節,「列建構子運算式最佳化」