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


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

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 節,「列建構子運算式最佳化」