明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

什么是mysql子查詢(xún)?如何使用子查詢(xún)進(jìn)行過(guò)濾?

[摘要]子查詢(xún)MySQL 4.1引入了對(duì)子查詢(xún)的支持,所以要想使用本章描述的SQL,必須使用MySQL 4.1或更高級(jí)的版本。SELECT語(yǔ)句 是SQL的查詢(xún)。迄今為止我們所看到的所有 SELECT 語(yǔ)句都是簡(jiǎn)單查詢(xún),即從單個(gè)數(shù)據(jù)庫(kù)表中檢索數(shù)據(jù)的單條語(yǔ)句。查詢(xún)(query) 任何SQL語(yǔ)句都是查詢(xún)。但此術(shù)...
子查詢(xún)

MySQL 4.1引入了對(duì)子查詢(xún)的支持,所以要想使用本章描述的SQL,必須使用MySQL 4.1或更高級(jí)的版本。

SELECT語(yǔ)句 是SQL的查詢(xún)。迄今為止我們所看到的所有 SELECT 語(yǔ)句都是簡(jiǎn)單查詢(xún),即從單個(gè)數(shù)據(jù)庫(kù)表中檢索數(shù)據(jù)的單條語(yǔ)句。

查詢(xún)(query) 任何SQL語(yǔ)句都是查詢(xún)。但此術(shù)語(yǔ)一般指 SELECT語(yǔ)句。

SQL還允許創(chuàng)建子查詢(xún)(subquery),即嵌套在其他查詢(xún)中的查詢(xún)。為什么要這樣做呢?理解這個(gè)概念的最好方法是考察幾個(gè)例子。

利用子查詢(xún)進(jìn)行過(guò)濾

本書(shū)所有章中使用的數(shù)據(jù)庫(kù)表都是關(guān)系表(關(guān)于每個(gè)表及關(guān)系的描述,請(qǐng)參閱附錄B)。訂單存儲(chǔ)在兩個(gè)表中。對(duì)于包含訂單號(hào)、客戶(hù)ID、訂單日期的每個(gè)訂單, orders 表存儲(chǔ)一行。各訂單的物品存儲(chǔ)在相關(guān)的orderitems 表中。 orders 表不存儲(chǔ)客戶(hù)信息。它只存儲(chǔ)客戶(hù)的ID。實(shí)際的客戶(hù)信息存儲(chǔ)在 customers 表中。現(xiàn)在,假如需要列出訂購(gòu)物品 TNT2 的所有客戶(hù),應(yīng)該怎樣檢索?下面列出具體的步驟。

(1) 檢索包含物品 TNT2 的所有訂單的編號(hào)。

(2) 檢索具有前一步驟列出的訂單編號(hào)的所有客戶(hù)的ID。

(3) 檢索前一步驟返回的所有客戶(hù)ID的客戶(hù)信息。

上述每個(gè)步驟都可以單獨(dú)作為一個(gè)查詢(xún)來(lái)執(zhí)行?梢园岩粭l SELECT語(yǔ)句返回的結(jié)果用于另一條 SELECT 語(yǔ)句的 WHERE 子句。

也可以使用子查詢(xún)來(lái)把3個(gè)查詢(xún)組合成一條語(yǔ)句。

第一條 SELECT 語(yǔ)句的含義很明確,對(duì)于 prod_id 為 TNT2 的所有訂單物品,它檢索其 order_num 列。輸出列出兩個(gè)包含此物品的訂單:

輸入:

select order_num from orderitems where prod_id = 'TNT2';

輸出:

QQ截圖20170510092853.png

下一步,查詢(xún)具有訂單 20005 和 20007 的客戶(hù)ID。利用 IN子句,編寫(xiě)如下的 SELECT 語(yǔ)句:

輸入:

select cust_id from orders where order_num in (20005,20007);

輸出:

QQ截圖20170510095439.png

現(xiàn)在,把第一個(gè)查詢(xún)(返回訂單號(hào)的那一個(gè))變?yōu)樽硬樵?xún)組合兩個(gè)查詢(xún)。請(qǐng)看下面的 SELECT 語(yǔ)句:

輸入:

select cust_id from orders where order_num in (select order_num from orderitems where prod_id = 'TNT2');

輸出:

QQ截圖20170510095439.png

分析:在 SELECT 語(yǔ)句中,子查詢(xún)總是從內(nèi)向外處理。在處理上面的SELECT 語(yǔ)句時(shí),MySQL實(shí)際上執(zhí)行了兩個(gè)操作。

首先,它執(zhí)行下面的查詢(xún):

select order_num from orderitems where prod_id = 'TNT2';

此查詢(xún)返回兩個(gè)訂單號(hào): 20005 和 20007 。然后,這兩個(gè)值以 IN 操作符要求的逗號(hào)分隔的格式傳遞給外部查詢(xún)的 WHERE 子句。外部查詢(xún)變成:

select cust_id from orders where order_num in (20005,20007);

可以看到,輸出是正確的并且與前面硬編碼 WHERE 子句所返回的值相同。

格式化SQL 包含子查詢(xún)的 SELECT 語(yǔ)句難以閱讀和調(diào)試,特別是它們較為復(fù)雜時(shí)更是如此。如上所示把子查詢(xún)分解為多行并且適當(dāng)?shù)剡M(jìn)行縮進(jìn),能極大地簡(jiǎn)化子查詢(xún)的使用。

現(xiàn)在得到了訂購(gòu)物品 TNT2 的所有客戶(hù)的ID。下一步是檢索這些客戶(hù)ID的客戶(hù)信息。檢索兩列的SQL語(yǔ)句為:

輸入:

select cust_name,cust_contact from customers where cust_id in (10001,10004);

可以把其中的 WHERE 子句轉(zhuǎn)換為子查詢(xún)而不是硬編碼這些客戶(hù)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'));

輸出:

QQ截圖20170510100155.png

分析:為了執(zhí)行上述 SELECT 語(yǔ)句,MySQL實(shí)際上必須執(zhí)行3條 SELECT語(yǔ)句。最里邊的子查詢(xún)返回訂單號(hào)列表,此列表用于其外面的子查詢(xún)的 WHERE 子句。外面的子查詢(xún)返回客戶(hù)ID列表,此客戶(hù)ID列表用于最外層查詢(xún)的 WHERE 子句。最外層查詢(xún)確實(shí)返回所需的數(shù)據(jù)。

可見(jiàn),在 WHERE 子句中使用子查詢(xún)能夠編寫(xiě)出功能很強(qiáng)并且很靈活的SQL語(yǔ)句。對(duì)于能嵌套的子查詢(xún)的數(shù)目沒(méi)有限制,不過(guò)在實(shí)際使用時(shí)由于性能的限制,不能嵌套太多的子查詢(xún)。

列必須匹配 在 WHERE 子句中使用子查詢(xún)(如這里所示),應(yīng)該保證 SELECT 語(yǔ)句具有與 WHERE 子句中相同數(shù)目的列。通常,子查詢(xún)將返回單個(gè)列并且與單個(gè)列匹配,但如果需要也可以使用多個(gè)列。

雖然子查詢(xún)一般與 IN 操作符結(jié)合使用,但也可以用于測(cè)試等于( = )、不等于( <> )等。

子查詢(xún)和性能 這里給出的代碼有效并獲得所需的結(jié)果。但是,使用子查詢(xún)并不總是執(zhí)行這種類(lèi)型的數(shù)據(jù)檢索的最有效的方法。更多的論述,請(qǐng)參閱第15章,其中將再次給出這個(gè)例子。

【相關(guān)推薦】

  1. mysql創(chuàng)建計(jì)算字段使用子查詢(xún)

  2. mysql中什么是聯(lián)結(jié)和關(guān)系表?

  3. 為什么使用聯(lián)結(jié)和如何創(chuàng)建聯(lián)結(jié)

  4. MySQL中WHERE子句重要性和如何聯(lián)結(jié)多個(gè)表

以上就是什么是mysql子查詢(xún)?如何利用子查詢(xún)進(jìn)行過(guò)濾?的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門(mén)到精通的SQL知識(shí)。