點擊關註上方「SQL資料庫開發」,
設為「置頂或星標」,第一時間送達乾貨
什麼是子查詢
子查詢(Sub Query)或者說內查詢(Inner Query),也可以稱作嵌套查詢(Nested Query),是一種嵌套在其他 SQL 查詢的 WHERE 子句中的查詢。
子查詢用於為主查詢返回其所需數據,或者對檢索數據進行進一步的限制。
子查詢可以在 SELECT、INSERT、UPDATE 和 DELETE 語句中,同 =、<、>、>=、<=、IN、BETWEEN 等運算符一起使用。
使用子查詢必須遵循以下幾個規則:
子查詢必須括在圓括號中。
子查詢的 SELECT 子句中只能有一個列,除非主查詢中有多個列,用於與子查詢選中的列相比較。
子查詢不能使用 ORDER BY,不過主查詢可以。在子查詢中,GROUP BY 可以起到同 ORDER BY 相同的作用。
返回多行數據的子查詢只能同多值操作符一起使用,比如 IN 操作符。
SELECT 列表中不能包含任何對 BLOB、ARRAY、CLOB 或者 NCLOB 類型值的引用。
子查詢不能直接用在集合函數中。
BETWEEN 操作符不能同子查詢一起使用,但是 BETWEEN 操作符可以用在子查詢中。
通常情況下子查詢都與 SELECT 語句一起使用,其基本語法如下所示:
SELECT column_name [,column_name]
FROM table1 [,table2]
WHERE column_name OPERATOR
(SELECT column_name [,column_name]
FROM table1 [,table2 ]
[WHERE])
考慮 Customers表和Orders表,表中記錄如下所示:
表Customers
表Orders
子查詢實例
現在,讓我們試一下在 SELECT 語句中進行子查詢:
SELECT * FROM Customers
WHERE 客戶ID IN
(SELECT 客戶ID FROM Orders
WHERE 員工ID=9)
上述語句的執行結果如下所示:
上述語句是先獲取訂單表Orders中員工ID=9的發貨記錄,我們發現有兩條記錄,其中這兩條記錄對應的客戶ID是3和4,而在外層客戶Customers表中我們需要找到Orders表中返回的客戶ID是3和4所對應的記錄,那就是我們查詢出的結果了。
注意:在WHERE子句中使用子查詢(如這裡所示),應該保證SELECT語句具有與WHERE子句中相同數目的列。通常,子查詢將返回單個列並且與單個列匹配,但如果需要也可以使用多個列。
子查詢還可以用在 INSERT 語句中。INSERT 語句可以將子查詢返回的數據插入到其他表中。子查詢中選取的數據可以被任何字符、日期或者數值函數所修飾。
其基本語法如下所示:
INSERT INTO
table_name [(column1 [,column2])]
SELECT [*|column1 [,column2]
FROM table1 [,table2]
[WHERE VALUE OPERATOR]
考慮與 Customers表擁有相似結構的 Customers_bak表。現在要將 上面查詢的結果插入到Customers_bak表中
INSERT INTO Customers_bak
SELECT * FROM Customers
WHERE 客戶ID IN
(SELECT 客戶ID FROM Orders
WHERE 員工ID=9)
查詢一下Customers_bak的結果,會發現和上面的結果一致。
子查詢可以用在 UPDATE 語句中。當子查詢同 UPDATE 一起使用的時候,既可以更新單個列,也可更新多個列。
其基本語法如下:
UPDATE table
SET column_name = new_value
[WHERE OPERATOR [VALUE]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[WHERE)]
示例:下面的示例將 Customers表中在Orders表裡有發貨的客戶,他們所在的城市要加一個「市」字。
UPDATE Customers
SET 城市=城市+'市'
WHERE 客戶ID IN
(SELECT 客戶ID FROM Orders)
這將影響4行數據,隨後 Customers表中的記錄將如下所示:
如同前面提到的其他語句一樣,子查詢還可以同 DELETE 語句一起使用。
其基本語法如下所示:
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [VALUE]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[WHERE)]
示例:假設我們想刪除在Orders表中有購買記錄的客戶信息,可以這樣寫
DELETE FROM Customers
WHERE 客戶ID IN
(SELECT 客戶ID FROM Orders)
這將影響4行數據,隨後 Customers表中的記錄將如下所示:
SELECT
`姓名`,
`客戶ID`,
(
SELECT COUNT(*)
FROM orders o
WHERE o.`客戶ID`=c.`客戶ID`
) AS '數量'
FROM customers c
結果為:
這裡使用SELECT COUNT(*)對表中的行進行計數,並且通過提供一條WHERE子句來匹配某個特定的客戶ID 。其中相關就是通過WHERE裡面的匹配條件來確定聯繫的。
點擊「閱讀原文」了解SQL訓練營