MySQL的SQL語句 - 資料操作語句(13)- 子查詢(1)
子查詢
子查詢是另一個語句中的 SELECT 語句。
MySQL 支援 SQL 標準要求的所有子查詢形式和操作,以及一些 MySQL 特有的功能。
下面是子查詢的示例:
1. SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
在本例中,SELECT * FROM t1 ... 是外部查詢(或外部語句),(SELECT column1 FROM t2) 是子查詢。我們說子查詢巢狀在外部查詢中,事實上,可以在其他子查詢中巢狀子查詢,進行多層巢狀。子查詢必須始終出現在括號內。
子查詢的主要優點是:
● 允許結構化查詢,這樣就可以隔離語句的每個部分。
● 提供了執行操作的替代方法,否則將需要複雜的連線和聯合。
● 許多人覺得子查詢比複雜的連線或聯合更易讀。事實上,正是子查詢的創新讓人們稱早期 SQL 為 “結構化查詢語言”
下面是一個示例語句,它顯示了 SQL 標準指定的、MySQL支援的子查詢語法的要點:
1. DELETE FROM t1 2. WHERE s11 > ANY 3. (SELECT COUNT(*) /* no hint */ FROM t2 4. WHERE NOT EXISTS 5. (SELECT * FROM t3 6. WHERE ROW(5*t2.s1,77)= 7. (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM 8. (SELECT * FROM t5) AS t5)));
子查詢可以返回標量(單個值)、單行、單列或表(一列或多列的一行或多行)。這些分別被稱為標量、列、行和表子查詢。返回特定型別結果的子查詢通常只能在特定的上下文中使用,如下節所述。
對可以使用子查詢的語句型別幾乎沒有限制。子查詢可以包含常規 SELECT 語句可以包含的許多關鍵字或子句:DISTINCT、GROUP BY、ORDER BY、LIMIT、聯接、索引提示、UNION 結果、註釋、函式等。
從 MySQL 8.0.19 開始,可以在子查詢中使用 TABLE 和 VALUES 語句。使用 VALUES 的子查詢通常是子查詢的囉嗦寫法,可以使用集合表示法或 SELECT 或 TABLE 語法更緊湊地重寫這些子查詢;假設表 ts 是使用 CREATE TABLE ts VALUES ROW(2), ROW(4), ROW(6) 語句建立的,下面顯示的語句都是等效的:
1. SELECT * FROM tt
2. WHERE b > ANY (VALUES ROW(2), ROW(4), ROW(6));
3.
4. SELECT * FROM tt
5. WHERE b > ANY (2, 4, 6);
6.
7. SELECT * FROM tt
8. WHERE b > ANY (SELECT * FROM ts);
9.
10. SELECT * FROM tt
11. WHERE b > ANY (TABLE ts);
TABLE 子查詢的示例將在後面介紹。
子查詢的外部語句可以是:SELECT、INSERT、UPDATE、DELETE、SET 或 DO。
官方網址: