什么是mysql子查詢?如何使用子查詢進行過濾?
發表時間:2023-08-31 來源:明輝站整理相關軟件相關文章人氣:
[摘要]子查詢MySQL 4.1引入了對子查詢的支持,所以要想使用本章描述的SQL,必須使用MySQL 4.1或更高級的版本。SELECT語句 是SQL的查詢。迄今為止我們所看到的所有 SELECT 語句都是簡單查詢,即從單個數據庫表中檢索數據的單條語句。查詢(query) 任何SQL語句都是查詢。但此術...
子查詢MySQL 4.1引入了對子查詢的支持,所以要想使用本章描述的SQL,必須使用MySQL 4.1或更高級的版本。
SELECT語句 是SQL的查詢。迄今為止我們所看到的所有 SELECT 語句都是簡單查詢,即從單個數據庫表中檢索數據的單條語句。
查詢(query) 任何SQL語句都是查詢。但此術語一般指 SELECT語句。
SQL還允許創建子查詢(subquery),即嵌套在其他查詢中的查詢。為什么要這樣做呢?理解這個概念的最好方法是考察幾個例子。
利用子查詢進行過濾
本書所有章中使用的數據庫表都是關系表(關于每個表及關系的描述,請參閱附錄B)。訂單存儲在兩個表中。對于包含訂單號、客戶ID、訂單日期的每個訂單, orders 表存儲一行。各訂單的物品存儲在相關的orderitems 表中。 orders 表不存儲客戶信息。它只存儲客戶的ID。實際的客戶信息存儲在 customers 表中。現在,假如需要列出訂購物品 TNT2 的所有客戶,應該怎樣檢索?下面列出具體的步驟。
(1) 檢索包含物品 TNT2 的所有訂單的編號。
(2) 檢索具有前一步驟列出的訂單編號的所有客戶的ID。
(3) 檢索前一步驟返回的所有客戶ID的客戶信息。
上述每個步驟都可以單獨作為一個查詢來執行。可以把一條 SELECT語句返回的結果用于另一條 SELECT 語句的 WHERE 子句。
也可以使用子查詢來把3個查詢組合成一條語句。
第一條 SELECT 語句的含義很明確,對于 prod_id 為 TNT2 的所有訂單物品,它檢索其 order_num 列。輸出列出兩個包含此物品的訂單:
輸入:
select order_num from orderitems where prod_id = 'TNT2';
輸出:

下一步,查詢具有訂單 20005 和 20007 的客戶ID。利用 IN子句,編寫如下的 SELECT 語句:
輸入:
select cust_id from orders where order_num in (20005,20007);
輸出:

現在,把第一個查詢(返回訂單號的那一個)變為子查詢組合兩個查詢。請看下面的 SELECT 語句:
輸入:
select cust_id from orders where order_num in (select order_num from orderitems where prod_id = 'TNT2');
輸出:

分析:在 SELECT 語句中,子查詢總是從內向外處理。在處理上面的SELECT 語句時,MySQL實際上執行了兩個操作。
首先,它執行下面的查詢:
select order_num from orderitems where prod_id = 'TNT2';
此查詢返回兩個訂單號: 20005 和 20007 。然后,這兩個值以 IN 操作符要求的逗號分隔的格式傳遞給外部查詢的 WHERE 子句。外部查詢變成:
select cust_id from orders where order_num in (20005,20007);
可以看到,輸出是正確的并且與前面硬編碼 WHERE 子句所返回的值相同。
格式化SQL 包含子查詢的 SELECT 語句難以閱讀和調試,特別是它們較為復雜時更是如此。如上所示把子查詢分解為多行并且適當地進行縮進,能極大地簡化子查詢的使用。
現在得到了訂購物品 TNT2 的所有客戶的ID。下一步是檢索這些客戶ID的客戶信息。檢索兩列的SQL語句為:
輸入:
select cust_name,cust_contact from customers where cust_id in (10001,10004);
可以把其中的 WHERE 子句轉換為子查詢而不是硬編碼這些客戶ID:
輸入:
select cust_name,cust_contact from customers where cust_id in(select cust_id from orders where order_num in(select order_num from orderitems where prod_id = 'TNT2'));
輸出:

分析:為了執行上述 SELECT 語句,MySQL實際上必須執行3條 SELECT語句。最里邊的子查詢返回訂單號列表,此列表用于其外面的子查詢的 WHERE 子句。外面的子查詢返回客戶ID列表,此客戶ID列表用于最外層查詢的 WHERE 子句。最外層查詢確實返回所需的數據。
可見,在 WHERE 子句中使用子查詢能夠編寫出功能很強并且很靈活的SQL語句。對于能嵌套的子查詢的數目沒有限制,不過在實際使用時由于性能的限制,不能嵌套太多的子查詢。
列必須匹配 在 WHERE 子句中使用子查詢(如這里所示),應該保證 SELECT 語句具有與 WHERE 子句中相同數目的列。通常,子查詢將返回單個列并且與單個列匹配,但如果需要也可以使用多個列。
雖然子查詢一般與 IN 操作符結合使用,但也可以用于測試等于( = )、不等于( <> )等。
子查詢和性能 這里給出的代碼有效并獲得所需的結果。但是,使用子查詢并不總是執行這種類型的數據檢索的最有效的方法。更多的論述,請參閱第15章,其中將再次給出這個例子。
【相關推薦】
mysql創建計算字段使用子查詢
mysql中什么是聯結和關系表?
為什么使用聯結和如何創建聯結
MySQL中WHERE子句重要性和如何聯結多個表
以上就是什么是mysql子查詢?如何利用子查詢進行過濾?的詳細內容,更多請關注php中文網其它相關文章!
學習教程快速掌握從入門到精通的SQL知識。