搜尋
首頁資料庫mysql教程什麼是mysql子查詢?如何利用子查詢進行過濾?

子查詢

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';

輸出:

什麼是mysql子查詢?如何利用子查詢進行過濾?

下一步,查詢具有訂單20005和20007 的客戶ID。利用IN子句,寫出如下的SELECT 語句:

輸入:

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

#輸出:

什麼是mysql子查詢?如何利用子查詢進行過濾?

現在,把第一個查詢(傳回訂單號碼的那一個)變成子查詢組合兩個查詢。請看下面的SELECT 語句:

#輸入:

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

輸出:

什麼是mysql子查詢?如何利用子查詢進行過濾?

分析:在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'));

輸出:

什麼是mysql子查詢?如何利用子查詢進行過濾?

分析:為了執行上述SELECT 語句,MySQL其實必須執行3個SELECT語句。最裡邊的子查詢傳回訂單號碼列表,此列表用於其外面的子查詢的 WHERE 子句。外面的子查詢傳回客戶ID列表,此客戶ID列表用於最外層查詢的 WHERE 子句。最外層查詢確實傳回所需的資料。

可見,在 WHERE 子句中使用子查詢能夠寫出功能很強且靈活的SQL語句。對於能嵌套的子查詢的數目沒有限制,不過在實際使用時由於效能的限制,不能嵌套太多的子查詢。

列必須符合 在 WHERE 子句中使用子查詢(如這裡所示),應該保證 SELECT 語句具有與 WHERE 子句中相同數目的欄位。通常,子查詢將返回單一列並且與單一列匹配,但如果需要也可以使用多個列。

雖然子查詢一般與 IN 運算子結合使用,但也可以用來測試等於( = )、不等於( )等。

子查詢和效能 這裡給出的程式碼有效並獲得所需的結果。但是,使用子查詢並不總是執行這種類型的資料檢索的最有效的方法。更多的論述,請參閱第15章,其中將再次給出這個例子。

【相關推薦】

  1. mysql建立計算欄位使用子查詢

  2. mysql中什麼是聯結和關係表?

  3. 為什麼使用聯結和如何建立聯結

  4. #MySQL中WHERE子句重要性和如何連結多個表格

以上是什麼是mysql子查詢?如何利用子查詢進行過濾?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何在MySQL中刪除或修改現有視圖?如何在MySQL中刪除或修改現有視圖?May 16, 2025 am 12:11 AM

todropaviewInmySQL,使用“ dropviewifexistsview_name;” andTomodifyAview,使用“ createOrreplaceViewViewViewview_nameAsSelect ...”。 whendroppingaview,asew dectivectenciesanduse和showcreateateviewViewview_name;“ tounderStanditSsstructure.whenModifying

MySQL視圖:我可以使用哪些設計模式?MySQL視圖:我可以使用哪些設計模式?May 16, 2025 am 12:10 AM

mySqlViewScaneFectectialized unizedesignpatternslikeadapter,Decorator,Factory,andObserver.1)adapterPatternadaptSdataForomDifferentTablesIntoAunifiendView.2)decoratorPatternenhancateDataWithCalcalcualdCalcalculenfields.3)fieldfields.3)

在MySQL中使用視圖的優點是什麼?在MySQL中使用視圖的優點是什麼?May 16, 2025 am 12:09 AM

查看InMysqlareBeneForsImplifyingComplexqueries,增強安全性,確保dataConsistency,andOptimizingPerformance.1)他們simimplifycomplexqueriesbleiesbyEncapsbyEnculatingThemintoreusableviews.2)viewsEnenenhancesecuritybyControllityByControllingDataAcces.3)

如何在MySQL中創建一個簡單的視圖?如何在MySQL中創建一個簡單的視圖?May 16, 2025 am 12:08 AM

toCreateAsimpleViewInmySQL,USEthecReateaTeviewStatement.1)defitEtheetEtheTeViewWithCreatEaTeviewView_nameas.2)指定usethectstatementTorivedesireddata.3)usethectStatementTorivedesireddata.3)usetheviewlikeatlikeatlikeatlikeatlikeatlikeatable.views.viewssimplplifefifydataaccessandenenanceberity but consisterfort,butconserfort,consoncontorfinft

MySQL創建用戶語句:示例和常見錯誤MySQL創建用戶語句:示例和常見錯誤May 16, 2025 am 12:04 AM

1)foralocaluser:createUser'localuser'@'@'localhost'Indidendify'securepassword'; 2)foraremoteuser:creationuser's creationuser'Remoteer'Remoteer'Remoteer'Remoteer'Remoteer'Remoteer'Remoteer'Remoteer'Rocaluser'@'localhost'Indidendify'seceledify'Securepassword'; 2)

在MySQL中使用視圖的局限性是什麼?在MySQL中使用視圖的局限性是什麼?May 14, 2025 am 12:10 AM

mysqlviewshavelimitations:1)他們不使用Supportallsqloperations,限制DatamanipulationThroughViewSwithJoinsOrsubqueries.2)他們canimpactperformance,尤其是withcomplexcomplexclexeriesorlargedatasets.3)

確保您的MySQL數據庫:添加用戶並授予特權確保您的MySQL數據庫:添加用戶並授予特權May 14, 2025 am 12:09 AM

porthusermanagementinmysqliscialforenhancingsEcurityAndsingsmenting效率databaseoperation.1)usecReateusertoAddusers,指定connectionsourcewith@'localhost'or@'%'。

哪些因素會影響我可以在MySQL中使用的觸發器數量?哪些因素會影響我可以在MySQL中使用的觸發器數量?May 14, 2025 am 12:08 AM

mysqldoes notimposeahardlimitontriggers,butacticalfactorsdeterminetheireffactective:1)serverConfiguration impactactStriggerGermanagement; 2)複雜的TriggerSincreaseSySystemsystem load; 3)largertablesslowtriggerperfermance; 4)highConconcConcrencerCancancancancanceTigrignecentign; 5); 5)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

北端:融合系統,解釋
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
4 週前By尊渡假赌尊渡假赌尊渡假赌
<🎜>掩蓋:探險33-如何獲得完美的色度催化劑
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用