MySQL基礎(chǔ)知識(shí)——子查詢
點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫(kù)開(kāi)發(fā)”,
設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨
什么是子查詢
子查詢(Sub Query)或者說(shuō)內(nèi)查詢(Inner Query),也可以稱(chēng)作嵌套查詢(Nested Query),是一種嵌套在其他 SQL 查詢的 WHERE 子句中的查詢。
子查詢用于為主查詢返回其所需數(shù)據(jù),或者對(duì)檢索數(shù)據(jù)進(jìn)行進(jìn)一步的限制。
子查詢可以在 SELECT、INSERT、UPDATE 和 DELETE 語(yǔ)句中,同 =、<、>、>=、<=、IN、BETWEEN 等運(yùn)算符一起使用。
使用子查詢必須遵循以下幾個(gè)規(guī)則:
子查詢必須括在圓括號(hào)中。
子查詢的 SELECT 子句中只能有一個(gè)列,除非主查詢中有多個(gè)列,用于與子查詢選中的列相比較。
子查詢不能使用 ORDER BY,不過(guò)主查詢可以。在子查詢中,GROUP BY 可以起到同 ORDER BY 相同的作用。
返回多行數(shù)據(jù)的子查詢只能同多值操作符一起使用,比如 IN 操作符。
SELECT 列表中不能包含任何對(duì) BLOB、ARRAY、CLOB 或者 NCLOB 類(lèi)型值的引用。
子查詢不能直接用在集合函數(shù)中。
BETWEEN 操作符不能同子查詢一起使用,但是 BETWEEN 操作符可以用在子查詢中。
SELECT子查詢語(yǔ)句
通常情況下子查詢都與 SELECT 語(yǔ)句一起使用,其基本語(yǔ)法如下所示:
SELECT column_name [,column_name]
FROM ?table1 [,table2]
WHERE column_name OPERATOR
(SELECT column_name [,column_name] ? ? ?
FROM table1 [,table2 ]
[WHERE])
示例數(shù)據(jù)表
考慮 Customers表和Orders表,表中記錄如下所示:

表Customers

表Orders
子查詢實(shí)例
現(xiàn)在,讓我們?cè)囈幌略?SELECT 語(yǔ)句中進(jìn)行子查詢:
SELECT * FROM Customers
WHERE 客戶ID IN
(SELECT 客戶ID FROM Orders
WHERE 員工ID=9)上述語(yǔ)句的執(zhí)行結(jié)果如下所示:

上述語(yǔ)句是先獲取訂單表Orders中員工ID=9的發(fā)貨記錄,我們發(fā)現(xiàn)有兩條記錄,其中這兩條記錄對(duì)應(yīng)的客戶ID是3和4,而在外層客戶Customers表中我們需要找到Orders表中返回的客戶ID是3和4所對(duì)應(yīng)的記錄,那就是我們查詢出的結(jié)果了。
注意:在WHERE子句中使用子查詢(如這里所示),應(yīng)該保證SELECT語(yǔ)句具有與WHERE子句中相同數(shù)目的列。通常,子查詢將返回單個(gè)列并且與單個(gè)列匹配,但如果需要也可以使用多個(gè)列。
INSERT 子查詢語(yǔ)句
子查詢還可以用在 INSERT 語(yǔ)句中。INSERT 語(yǔ)句可以將子查詢返回的數(shù)據(jù)插入到其他表中。子查詢中選取的數(shù)據(jù)可以被任何字符、日期或者數(shù)值函數(shù)所修飾。
其基本語(yǔ)法如下所示:
INSERT INTO?
table_name [(column1 [,column2])] ? ? ? ? ??
SELECT [*|column1 [,column2] ? ? ? ? ??
FROM table1 [,table2]
[WHERE VALUE OPERATOR]
示例:
考慮與 Customers表?yè)碛邢嗨平Y(jié)構(gòu)的 Customers_bak表?,F(xiàn)在要將 上面查詢的結(jié)果插入到Customers_bak表中
INSERT INTO Customers_bak
SELECT * FROM Customers
WHERE 客戶ID IN
(SELECT 客戶ID FROM Orders
WHERE 員工ID=9)查詢一下Customers_bak的結(jié)果,會(huì)發(fā)現(xiàn)和上面的結(jié)果一致。
UPDATE子查詢語(yǔ)句
子查詢可以用在 UPDATE 語(yǔ)句中。當(dāng)子查詢同 UPDATE 一起使用的時(shí)候,既可以更新單個(gè)列,也可更新多個(gè)列。
其基本語(yǔ)法如下:
UPDATE table
SET column_name = new_value
[WHERE OPERATOR [VALUE]
(SELECT COLUMN_NAME ??
FROM TABLE_NAME)
[WHERE)]
示例:
下面的示例將 Customers表中在Orders表里有發(fā)貨的客戶,他們所在的城市要加一個(gè)“市”字。
UPDATE Customers
SET 城市=城市+'市'
WHERE 客戶ID IN
(SELECT 客戶ID FROM Orders)這將影響4行數(shù)據(jù),隨后 Customers表中的記錄將如下所示:

DELETE 子查詢語(yǔ)句
如同前面提到的其他語(yǔ)句一樣,子查詢還可以同 DELETE 語(yǔ)句一起使用。
其基本語(yǔ)法如下所示:
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [VALUE]
(SELECT COLUMN_NAME ??
FROM TABLE_NAME)
[WHERE)]
示例:
假設(shè)我們想刪除在Orders表中有購(gòu)買(mǎi)記錄的客戶信息,可以這樣寫(xiě)
DELETE FROM Customers
WHERE 客戶ID IN
(SELECT 客戶ID FROM Orders)這將影響4行數(shù)據(jù),隨后 Customers表中的記錄將如下所示:

SELECT?
`姓名`,
`客戶ID`,
(
SELECT?COUNT(*)
FROM?orders o
WHERE?o.`客戶ID`=c.`客戶ID`?
) AS?'數(shù)量'
FROM?customers c結(jié)果為:

這里使用SELECT COUNT(*)對(duì)表中的行進(jìn)行計(jì)數(shù),并且通過(guò)提供一條WHERE子句來(lái)匹配某個(gè)特定的客戶ID 。其中相關(guān)就是通過(guò)WHERE里面的匹配條件來(lái)確定聯(lián)系的。
——End——
后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨 后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。 推薦閱讀
為什么阿里巴巴禁止使用存儲(chǔ)過(guò)程? 一份非常完整的 MySQL 規(guī)范,速速收藏! 數(shù)據(jù)庫(kù)中為什么不推薦使用外鍵約束 阿里規(guī)定超過(guò)3張表,禁止JOIN,為何? MySQL 常用命令手冊(cè)
這是一個(gè)能學(xué)到技術(shù)的公眾號(hào),歡迎關(guān)注
點(diǎn)擊「閱讀原文」了解SQL訓(xùn)練營(yíng)
