什麼是 MySQL 子查詢及其一般類別?
子查詢最好定義為查詢中的查詢。子查詢使您能夠編寫選擇資料的查詢行,這些行的條件實際上是在查詢在執行時執行時開發的。更正式地說,它是在另一個 SELECT 語句的一個子句中使用 SELECT 語句。事實上,一個子查詢可以包含在另一個子查詢中,而另一個子查詢又包含在另一個子查詢中,依此類推。子查詢也可以巢狀在 INSERT、UPDATE 和 DELETE 語句中。子查詢必須用括號括起來。
子查詢可以在允許表示式的地方使用,只要它返回單個值。這意味著返回單個值的子查詢也可以在 FROM 子句列表中作為物件列出。這被稱為內聯檢視,因為當子查詢用作 FROM 子句的一部分時,它被視為虛擬表或檢視。子查詢可以放在主查詢的 FROM 子句、WHERE 子句或 HAVING 子句中。它也稱為內部查詢或內部 SELECT,包含子查詢的查詢稱為外部查詢或外部 SELECT 或容器查詢。以下是其一般類別:
標量子查詢
標量子查詢返回單個值,即一行一列的資料。標量子查詢是一個簡單的運算元,我們幾乎可以在任何允許使用單列或文字的地方使用它。為了說明這一點,我們使用具有以下資料的‘Cars’、‘Customers’和‘Reservations’表:
mysql> Select * from Cars; +------+--------------+---------+ | ID | Name | Price | +------+--------------+---------+ | 1 | Nexa | 750000 | | 2 | Maruti Swift | 450000 | | 3 | BMW | 4450000 | | 4 | VOLVO | 2250000 | | 5 | Alto | 250000 | | 6 | Skoda | 1250000 | | 7 | Toyota | 2400000 | | 8 | Ford | 1100000 | +------+--------------+---------+ 8 rows in set (0.02 sec) mysql> Select * from Customers; +-------------+----------+ | Customer_Id | Name | +-------------+----------+ | 1 | Rahul | | 2 | Yashpal | | 3 | Gaurav | | 4 | Virender | +-------------+----------+ 4 rows in set (0.00 sec) mysql> Select * from Reservations; +------+-------------+------------+ | ID | Customer_id | Day | +------+-------------+------------+ | 1 | 1 | 2017-12-30 | | 2 | 2 | 2017-12-28 | | 3 | 2 | 2017-12-29 | | 4 | 1 | 2017-12-25 | | 5 | 3 | 2017-12-26 | +------+-------------+------------+ 5 rows in set (0.00 sec)
正如我們所知,標量子查詢將返回單個值,以下是標量子查詢:
mysql> Select Name from Customers WHERE Customer_id = (Select Customer_id FROM Reservations WHERE ID = 5); +--------+ | Name | +--------+ | Gaurav | +--------+ 1 row in set (0.06 sec)
表子查詢
表子查詢返回一個結果,其中包含一個或多個行,這些行包含一個或多個列的資料。使用來自‘cars’、‘Customers’和‘Reservations’表的以下查詢是表子查詢的示例:
mysql> Select Name from customers where Customer_id IN (SELECT DISTINCT Customer_id from reservations); +---------+ | Name | +---------+ | Rahul | | Yashpal | | Gaurav | +---------+ 3 rows in set (0.05 sec)
相關子查詢
相關子查詢是一個在 WHERE 子句中使用外部查詢值的子查詢。使用來自‘cars’表的以下查詢是相關子查詢的示例:
mysql> Select Name from cars WHERE Price < (SELECT AVG(Price) from Cars); +--------------+ | Name | +--------------+ | Nexa | | Maruti Swift | | Alto | | Skoda | | Ford | +--------------+ 5 rows in set (0.00 sec) mysql> Select Name from cars WHERE Price > (SELECT AVG(Price) from Cars); +--------+ | Name | +--------+ | BMW | | VOLVO | | Toyota | +--------+ 3 rows in set (0.00 sec)
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP