1. 程式人生 > 實用技巧 >mysql基礎知識——子查詢

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裡面的匹配條件來確定聯絡的。