MySQL的子查詢:

目錄

子查詢的相關概念:

子查詢的分類:

角度1:

單行子查詢:

單行比較操作符:

子查詢的空值情況:

多行子查詢:

多行比較操作符:

ANY和ALL的區別:

子查詢為空值的情況:

角度2:

相關(或者關聯)子查詢:

非相關(或者非關聯)子查詢:

EXISTS和NOT EXISTS關鍵字:

EXISTS:

NOT EXISTS:

子查詢的基本使用:

子查詢作為計算字段:

子查詢結果作為臨時表:

子查詢結果作為過濾條件:

舉例:

結論:


子查詢的相關概念:

子查詢是指一個查詢語句嵌套在另一個查詢語句的內部的查詢。SQL中子查詢的使用大大增加了SELECT查詢的能力,因為很多時候查詢需要從結果集中獲取數據,或者需要從同一個表中先計算得出一個數據結果,然后這個數據結果(可能是某一標量,也可能是某個集合)進行比較。

子查詢的稱謂規范:外查詢(主查詢)、內查詢(子查詢)。

子查詢需要使用()包裹,可多層嵌套。通常先執行子查詢,再將結果傳遞給外部查詢。

子查詢放在比較條件的右側,提高可讀性。

子查詢的分類:

角度1:

按照內查詢的結果返回一條還是多條記錄,將子查詢分為:

單行子查詢:

返回一個結果給主查詢進行使用。

單行比較操作符:

操作符

含義

=

等于查詢的數據

>

大于查詢的數據

>=

大于等于查詢的數據

小于等于查詢的數據

<>

不等于查詢的數據

子查詢的空值情況:

子查詢如果查詢的結果為NULL,是不會進行報錯的。外查詢運用這個查詢結果也是NULL值。

多行子查詢:

返回多個結果給主查詢進行使用。

多行比較操作符:

操作符

含義

IN

等于列表中任意一個

ANY

需要和單行比較操作符一起使用,和子查詢返回的某一個值進行比較

ALL

需要和單行比較操作符一起使用,和子查詢返回的所有值進行比較

SOME

實際上是ANY的別名,作用相同,一般常用ANY

ANY和ALL的區別:

?ANY:如果主查詢中的值滿足與子查詢返回的任意一個值之間的比較條件,則條件為真。

ALL:如果主查詢中的值滿足與子查詢返回的所有值之間的比較條件,則條件為真。

子查詢為空值的情況:

內查詢有一個NULL值的話,外查詢的結果為NULL。

角度2:

按照內查詢是否被多次執行,將子查詢分為:

相關(或者關聯)子查詢:

子查詢依賴外部查詢的當前行數據,需結合外部查詢逐步處理。

子查詢需要執行多次,即采用循環的方式,先從外部查詢開始,每次都傳入子查詢進行查詢,然后將結果反饋給外部。

非相關(或者非關聯)子查詢:

子查詢獨立于外部查詢執行,不引用外部查詢的任何字段,可單獨運行并返回固定結果集供外部查詢使用。

子查詢從數據表中查詢了數據結果,如果這個數據結果只執行一次,然后這個數據結果作為主查詢的條件進行執行。

EXISTS和NOT EXISTS關鍵字:

關聯子查詢通常會和EXISTS和NOT EXISTS關鍵字一起使用,用于檢查子查詢是否存在滿足條件的行。

EXISTS和NOT EXISTS基于布爾邏輯判斷數據的存在性而返回具體數據值。

EXISTS:

檢查子查詢是否返回至少一行記錄。

SELECT ...
FROM 主表
WHERE EXISTS (子查詢);

如果子查詢中不存在滿足條件的行:條件返回FALSE,繼續在子查詢中查找。

如果在子查詢中存在滿足條件的行:不在子查詢中繼續查找,條件返回TREU。

NOT EXISTS:

檢查子查詢是否沒有返回任何記錄。

如果子查詢中無結果:返回TRUE,保留改行。

如果子查詢中有結果:返回FALSE,丟棄該行。

SELECT ...
FROM 主表
WHERE NOT EXISTS (子查詢);

子查詢的基本使用:

子查詢作為計算字段:

必須返回單值。

SELECT 字段名1,字段名2,...
FROM 表名
WHERE 字段名3 比較操作符 (SELECT 返回的字段名FROM 表名WHERE 條件(不含聚合函數條件)
);
SELECT 字段名1,(SELECT 返回的字段名FROM 表名WHERE 條件
)
FROM 表名
WHERE 條件;

子查詢結果作為臨時表:

必須指定別名。

SELECT 字段名1,字段名2,...
FROM 表名1 JOIN (SELECT 字段名FROM 表名WHERE 條件
) AS 別名
WHERE 條件;

子查詢結果作為過濾條件:

SELECT 字段名1,字段名2,...
FROM 表名
WHERE 字段名 比較操作符 (SELECT 字段名,(聚合函數)FROM 表名[WHERE 條件(無聚合函數條件)]GROUP BY 非聚合函數字段名HAVING 條件(包含聚合函數條件)
);

舉例:

牛客網SQL題目:

返回購買價格為 10 美元或以上產品的顧客列表_牛客題霸_牛客網

OrderItems表示訂單商品表,含有字段訂單號:order_num、訂單價格:item_price;Orders表代表訂單信息表,含有顧客id:cust_id和訂單號:order_num

OrderItems表

order_numitem_price
a110
a21
a21
a42
a55
a21
a77

Orders表

order_numcust_id
a1cust10
a2cust1
a2cust1
a4cust2
a5cust5
a2cust1
a7cust7

使用子查詢,返回單個訂單的購買價格為 10 美元或以上產品的顧客列表,結果無需排序。

【示例結果】返回顧客id cust_id

cust_id
cust10

因為這里子查詢返回的結果為多個,所以使用多行比較操作符IN。?

SELECT Orders.cust_id
FROM Orders
WHERE Orders.order_num IN (SELECT OrderItems.order_numFROM OrderItemsWHERE OrderItems.item_price >=10
);

牛客網SQL題目:

確定哪些訂單購買了 prod_id 為 BR01 的產品(一_牛客題霸_牛客網

表OrderItems代表訂單商品信息表,prod_id為產品id;Orders表代表訂單表有cust_id代表顧客id和訂單日期order_date

OrderItems表

prod_idorder_num
BR01a0001
BR01a0002
BR02a0003
BR02a0013

Orders表

order_numcust_idorder_date
a0001cust102022-01-01 00:00:00
a0002cust12022-01-01 00:01:00
a0003cust12022-01-02 00:00:00
a0013cust22022-01-01 00:20:00

編寫 SQL 語句,使用子查詢來確定哪些訂單(在 OrderItems 中)購買了 prod_id 為 "BR01" 的產品,然后從 Orders 表中返回每個產品對應的顧客 ID(cust_id)和訂單日期(order_date),按訂購日期對結果進行升序排序。

【示例結果】返回顧客id cust_id和定單日期order_date。

cust_idorder_date
cust102022-01-01 00:00:00
cust12022-01-01 00:01:00
SELECT Orders.cust_id,Orders.order_date
FROM Orders
WHERE Orders.order_num IN (SELECT OrderItems.order_numFROM OrderItemsWHERE OrderItems.prod_id = 'BR01'
)
ORDER BY Orders.order_date ASC;

牛客網SQL題目:

返回購買 prod_id 為 BR01 的產品的所有顧客的電_牛客題霸_牛客網

你想知道訂購 BR01 產品的日期,有表OrderItems代表訂單商品信息表,prod_id為產品id;Orders表代表訂單表有cust_id代表顧客id和訂單日期order_date;Customers表含有cust_email 顧客郵件和cust_id顧客id

OrderItems表

Orders表


Customers表代表顧客信息,cust_id為顧客id,cust_email為顧客email

返回購買 prod_id 為BR01 的產品的所有顧客的電子郵件(Customers 表中的 cust_email),結果無需排序。

提示:這涉及 SELECT 語句,最內層的從 OrderItems 表返回 order_num,中間的從 Customers 表返回 cust_id。

【示例結果】

返回顧客email cust_email

我們先通過Orders表格中的order_num和OrderItems表格中的order_num進行相關的連接,查詢得到想要的prod_id為"BR01"的order_num值。然后再將結果反饋給Customers表來進行相關的查詢。因為這里主要講的是子查詢,所以就使用的子查詢嵌套來表示。

SELECT Customers.cust_email
FROM Customers
WHERE Customers.cust_id IN (SELECT Orders.cust_idFROM OrdersWHERE Orders.order_num IN (SELECT OrderItems.order_numFROM OrderItemsWHERE OrderItems.prod_id = 'BR01')
);

?牛客網SQL題目:

從 Products 表中檢索所有的產品名稱以及對應的銷售總_牛客題霸_牛客網

Products 表中檢索所有的產品名稱:prod_name、產品id:prod_id

prod_idprod_name
a0001egg
a0002sockets
a0013coffee
a0003cola

OrderItems代表訂單商品表,訂單產品:prod_id、售出數量:quantity

prod_idquantity
a0001105
a00021100
a0002200
a00131121
a000310
a000319
a00035

編寫 SQL 語句,從 Products 表中檢索所有的產品名稱(prod_name),以及名為 quant_sold 的計算列,其中包含所售產品的總數(在 OrderItems 表上使用子查詢和 SUM(quantity)檢索)。

【示例結果】返回產品名稱prod_name和產品售出數量總和

prod_namequant_sold
egg105
sockets1300
coffee1121
cola34

?這里將子查詢的結果作為一個臨時表,必須需要對臨時表進行起別名。先通過將Products表格和自身建立連接,得到想要的子查詢結果集,然后再將OrderItems表格建立連接。即可得到想要的結果集。

SELECT Products.prod_name,NewOrderItems.quant_sold
FROM Products JOIN (SELECT OrderItems.prod_id,SUM(OrderItems.quantity) AS quant_soldFROM OrderItemsGROUP BY OrderItems.prod_id
) AS NewOrderItems
ON Products.prod_id = NewOrderItems.prod_id;

牛客網SQL題目:?

返回每個顧客不同訂單的總金額_牛客題霸_牛客網

我們需要一個顧客 ID 列表,其中包含他們已訂購的總金額。

OrderItems表代表訂單信息,OrderItems表有訂單號:order_num和商品售出價格:item_price、商品數量:quantity。


Orders表訂單號:order_num、顧客id:cust_id

編寫 SQL語句,返回顧客 ID(Orders 表中的 cust_id),并使用子查詢返回total_ordered 以便返回每個顧客的訂單總金額,將結果按金額從大到小排序。

【示例結果】返回顧客id cust_id和total_order下單總額

因為要查詢顧客ID所對應的訂單總金額,所以通過OrderItems表格的自連接得到一個按照order_num分組并計算所對應的價格總和的臨時表。通過Orders表格和OrderItems表格進行連接查詢,得到想要的查詢結果集。

SELECT的執行順序:FROM在SELECT之前,并且子查詢先執行,所以能夠直接把NewOrderItems.total_ordered直接放在主查詢SELECT后面。

因為子查詢中含有聚合函數,所以子查詢中的過濾條件應該使用HAVING關鍵字。

SELECT Orders.cust_id,NewOrderItems.total_ordered
FROM Orders JOIN (SELECT OrderItems.order_num,SUM(OrderItems.item_price*OrderItems.quantity) AS total_orderedFROM OrderItemsGROUP BY OrderItems.order_numORDER BY total_ordered DESC
) AS NewOrderItems
ON Orders.order_num = NewOrderItems.order_num;

結論:

?在SELECT中,除了在GROUP BY和LIMIT之外,都能使用子查詢。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94156.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94156.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94156.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python批處理深度解析:構建高效大規模數據處理系統

引言&#xff1a;批處理的現代價值在大數據時代&#xff0c;批處理&#xff08;Batch Processing&#xff09; 作為數據處理的核心范式&#xff0c;正經歷著復興。盡管實時流處理備受關注&#xff0c;但批處理在數據倉庫構建、歷史數據分析、報表生成等場景中仍不可替代。Pytho…

是德科技的BenchVue和納米軟件的ATECLOUD有哪些區別?

是德科技的BenchVue和納米軟件的ATECLOUD雖然都是針對儀器儀表測試的軟件&#xff0c;但是在功能設計、測試場景、技術架構等方面有著明顯的差異。BenchVue&#xff08;是德科技&#xff09;由全球領先的測試測量設備供應商開發&#xff0c;專注于高端儀器控制與數據分析&#…

線上redis的使用

一.String1.緩存玩家單個數據&#xff0c;但是我覺得還是用hash好2.結合過期時間&#xff0c;比如:某個東西結算了&#xff0c;redis記錄一下&#xff0c;并設置過期時間3.分布式鎖二.Hash1.緩存一個單位的數據&#xff0c;比如&#xff1a;聯盟信息2.被封禁的列表&#xff0c;…

【實踐記錄】github倉庫的更新

首先登錄&#xff0c;參考&#xff1a;記一次github連接本地git_如何連接github-CSDN博客 SSH&#xff1a; git config --global user.name "GitHubUsername" git config --global user.email "emailexample.com" ssh-keygen -t ed25519 -C "emailex…

Nature圖形復現—Graphpad繪制帶P值的含數據點的小提琴圖

帶 P 值的含數據點的小提琴圖是一種科研數據可視化圖表&#xff0c;它同時呈現數據的分布特征、原始觀測值和統計顯著性&#xff1a;通過小提琴形狀展示概率密度分布&#xff08;反映數據集中趨勢和離散程度&#xff09;&#xff0c;疊加抖動散點顯示所有原始數據點&#xff08…

mongodb源代碼分析createCollection命令由create.idl變成create_gen.cpp過程

mongodb命令db.createCollection(name, options)創建一個新集合。由于 MongoDB 在命令中首次引用集合時會隱式創建集合&#xff0c;因此此方法主要用于創建使用特定選項的新集合。例如&#xff0c;您使用db.createCollection()創建&#xff1a;固定大小集合&#xff1b;集群化集…

達夢(DM8)常用管理SQL命令(3)

達夢(DM8)常用管理SQL命令(3) 1.表空間 -- 查看表空間信息 SQL> SELECT * FROM v$tablespace;-- 查看數據文件 SQL> SELECT * FROM v$datafile;-- 表空間使用情況 SQL> SELECT df.tablespace_name "表空間名稱",df.bytes/1024/1024 "總大小(MB)&q…

【Django】-5- ORM的其他用法

一、&#x1f680; ORM 新增數據魔法&#xff01;核心目標教你用 Django ORM 給數據庫 新增數據 &#xff01;就像給數據庫 “生小數據寶寶”&#x1f476;方法 1&#xff1a;實例化 Model save&#xff08;一步步喂數據&#xff09;obj Feedback() # 實例化 obj.quality d…

Flink Checkpoint機制:大數據流處理的堅固護盾

引言在大數據技術蓬勃發展的當下&#xff0c;數據處理框架層出不窮&#xff0c;Flink 憑借其卓越的流批一體化處理能力&#xff0c;在大數據流處理領域占據了舉足輕重的地位 。它以高吞吐量、低延遲和精準的一次性語義等特性&#xff0c;成為眾多企業處理實時數據的首選工具。在…

【STM32-HAL】 SPI通信與Flash數據寫入實戰

文章目錄1.參考教程2. 4種時間模式3. 3個編程接口3.1 HAL_StatusTypeDef HAL_SPI_Transmit(...) &#xff1a;3.1.1 參數說明3.1.2 例子3.2 HAL_StatusTypeDef HAL_SPI_Receive(...) &#xff1a;3.2.1參數說明3.2.2 例子3.3 HAL_StatusTypeDef HAL_SPI_TransmitReceive(...) &…

SNR-Aware Low-light Image Enhancement 論文閱讀

信噪比感知的低光照圖像增強 摘要 本文提出了一種新的低光照圖像增強解決方案&#xff0c;通過聯合利用信噪比&#xff08;SNR&#xff09;感知的變換器&#xff08;transformer&#xff09;和卷積模型&#xff0c;以空間變化的操作方式動態增強像素。對于極低信噪比&#xff0…

在 Vue3 中使用 Mammoth.js(在 Web 應用中預覽 Word 文檔)的詳解、常見場景、常見問題及最佳解決方案的綜合指南

一、Mammoth.js 簡介與核心功能 Mammoth.js 是一個專用于將 .docx 文檔轉換為 HTML 的庫,適用于在 Web 應用中預覽 Word 文檔。其核心特點包括: 語義化轉換:基于文檔樣式(如標題、段落)生成簡潔的 HTML 結構,忽略復雜樣式(如居中、首行縮進)。 輕量高效:適用于需要快…

2025 年 VSCode 插件離線下載硬核攻略

微軟 2025 年起關閉 VSCode 官方市場 .vsix 文件直接下載入口&#xff0c;給企業內網開發者帶來極大不便。不過別擔心,今天提供一個下載.vsix文件地址。 VSC插件下載 (dreamsoul.cn) 下載好的.vsix文件后&#xff0c;打開vscode的應用&#xff0c;選擇右上角...打開&#xff…

[leetcode] 位運算

位運算這類題目奇思妙招很多&#xff0c;優化方法更是非常考驗經驗積累。 常用小技能&#xff1a; bit_count()&#xff1a;返回整數的二進制表示中1的個數&#xff0c;e.g. x 7 x.bit_count() # 32.bit_length()&#xff1a;返回整數的二進制表示的長度&#xff0c;e.g. …

關于assert()函數,eval()函數,include

一.assert()函數例子assert("strpos($file, ..) false") or die("Detected hacking attempt!");assert("file_exists($file)") or die("That file doesnt exist!");第一個是會檢驗$file是否有.. &#xff0c;如果有strpos會返回true&…

ICT模擬零件測試方法--電位器測試

ICT模擬零件測試方法–電位器測試 文章目錄ICT模擬零件測試方法--電位器測試電位器測試電位器測試配置電位器測試配置電位器測試注意事項電位器測量選項電位器測試 電位器測試測量從 0.1 歐姆到 10M 歐姆的電阻。 本節介紹&#xff1a; 電位器測試配置電位器測試注意事項電位…

wsl2使用宿主機網絡方法

在Windows的資源管理器的地址欄輸入&#xff1a; %UserProfile% &#xff0c;即可打開當前用戶的主目錄&#xff0c;創建文件&#xff1a; .wslconfig 輸入[experimental]networkingModemirroredautoProxytrue之后重啟WSL 管理員身份運行PowerShell&#xff1a; 停止WSL&#x…

當Windows遠程桌面出現“身份驗證錯誤。要求的函數不受支持”的問題

當Windows遠程桌面出現“身份驗證錯誤。要求的函數不受支持”的問題時&#xff0c;可以參考以下方法解決&#xff1a;修改組策略設置適用于Windows專業版、企業版等有組策略編輯器的系統。1. 按下WinR組合鍵&#xff0c;輸入“gpedit.msc”&#xff0c;打開本地組策略編輯器。2…

零售新范式:開源AI大模型、AI智能名片與S2B2C商城小程序源碼驅動下的圈層滲透革命

摘要&#xff1a;在消費圈層化與渠道碎片化的雙重沖擊下&#xff0c;傳統零售渠道的"廣撒網"模式逐漸失效。阿里巴巴零售通、京東新通路、國美Plus等零售巨頭通過技術賦能重構小店生態&#xff0c;但其本質仍停留于供應鏈效率提升層面。本文創新性提出"開源AI大…

電池自動生產線:科技賦能下的高效制造新范式

在當今科技飛速發展的時代&#xff0c;電池作為眾多電子設備和新能源產業的核心部件&#xff0c;其生產效率與質量至關重要。電池自動生產線的出現&#xff0c;猶如一場及時雨&#xff0c;為電池制造行業帶來了全新的變革與發展機遇。自動化流程&#xff0c;開啟高效生產之門傳…