mysql基礎知識——子查詢
作者:丶平凡世界
來源:SQL資料庫開發
今天的mysql基礎知識內容,給大家帶來的是子查詢!
什麼是子查詢
子查詢(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 語句一起使用,其基本語法如下所示:
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*FROMCustomers WHERE客戶IDIN (SELECT客戶IDFROMOrders WHERE員工ID=9)
上述語句的執行結果如下所示:
上述語句是先獲取訂單表Orders中員工ID=9的發貨記錄,我們發現有兩條記錄,其中這兩條記錄對應的客戶ID是3和4,而在外層客戶Customers表中我們需要找到Orders表中返回的客戶ID是3和4所對應的記錄,那就是我們查詢出的結果了。
注意:在WHERE子句中使用子查詢(如這裡所示),應該保證SELECT語句具有與WHERE子句中相同數目的列。通常,子查詢將返回單個列並且與單個列匹配,但如果需要也可以使用多個列。
INSERT 子查詢語句
子查詢還可以用在 INSERT 語句中。INSERT 語句可以將子查詢返回的資料插入到其他表中。子查詢中選取的資料可以被任何字元、日期或者數值函式所修飾。
其基本語法如下所示:
INSERT INTO
table_name [(column1 [,column2])]
SELECT [*|column1 [,column2]
FROM table1 [,table2]
[WHERE VALUE OPERATOR]
示例:
考慮與 Customers表擁有相似結構的 Customers_bak表。現在要將 上面查詢的結果插入到Customers_bak表中
INSERTINTOCustomers_bak SELECT*FROMCustomers WHERE客戶IDIN (SELECT客戶IDFROMOrders WHERE員工ID=9)
查詢一下Customers_bak的結果,會發現和上面的結果一致。
UPDATE子查詢語句
子查詢可以用在 UPDATE 語句中。當子查詢同 UPDATE 一起使用的時候,既可以更新單個列,也可更新多個列。
其基本語法如下:
UPDATE table
SET column_name = new_value
[WHERE OPERATOR [VALUE]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[WHERE)]
示例:
下面的示例將 Customers表中在Orders表裡有發貨的客戶,他們所在的城市要加一個“市”字。
UPDATECustomers SET城市=城市+'市' WHERE客戶IDIN (SELECT客戶IDFROMOrders)
這將影響4行資料,隨後 Customers表中的記錄將如下所示:
DELETE 子查詢語句
如同前面提到的其他語句一樣,子查詢還可以同 DELETE 語句一起使用。
其基本語法如下所示:
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [VALUE]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[WHERE)]
示例:
假設我們想刪除在Orders表中有購買記錄的客戶資訊,可以這樣寫
DELETEFROMCustomers WHERE客戶IDIN (SELECT客戶IDFROMOrders)
這將影響4行資料,隨後 Customers表中的記錄將如下所示:
相關子查詢
指涉及外部查詢的子查詢,例如:要查詢每個客戶的訂單數量,我們可以這樣寫:
SELECT `姓名`, `客戶ID`, ( SELECTCOUNT(*) FROMorders o WHEREo.`客戶ID`=c.`客戶ID` )AS'數量' FROMcustomers c
結果:
這裡使用SELECT COUNT(*)對錶中的行進行計數,並且通過提供一條WHERE子句來匹配某個特定的客戶ID 。其中相關就是通過WHERE裡面的匹配條件來確定聯絡的。