【MySQL】子查詢

文章目錄

  • 子查詢
  • IN運算符
  • 子查詢 VS 連接
  • ALL關鍵字
  • ANY關鍵字
  • 相關子查詢 !
  • EXISTS運算符
  • select子句中的子查詢
  • from子句中的子查詢

子查詢

  • 獲取價格大于id為3的貨物的商品
    • 用到了內查詢,獲取id為3的商品的單價,把結構傳給外查詢
  • 在where子句中編寫子查詢,也可以在from或select子句中編寫。
use sql_store;
select *
from products
where unit_price > (select unit_pricefrom productswhere product_id = 3)

運行結果:
在這里插入圖片描述

  • 練習:查詢工資大于平均工資的員工
use sql_hr;
select *
from employees
where salary > (select avg(salary)from employees)

運行結果:
在這里插入圖片描述

IN運算符

  • in運算符寫子查詢
  • 查詢沒有被訂購過的商品,先在子查詢中找出被訂購過的商品id(注意要去重)。將這個查詢結果作為子查詢,在外層找product_id不在子查詢結果里的數據,就是沒有被訂購過的商品。
use sql_store;
select *
from products
where product_id not in (select distinct product_idfrom order_items
)

在這里插入圖片描述

  • 練習:找到沒有支付過支票的客戶
    • 從invoices中查詢去重后的clientid,將這個結果作為內查詢傳給外查詢,找不在這個內查詢結果中的id,就是沒有支付過支票的顧客
use sql_invoicing;
select *
from clients
where client_id not in (select distinct client_idfrom invoices
)

運行結果:
在這里插入圖片描述

子查詢 VS 連接

  • 在運行時間差不多的情況下,應該選擇最易讀的查詢,要注意代碼的可讀性!
  • 上一個練習題,可以使用外連接進行查詢,但這樣寫可讀性不好。
select *
from clients
left join invoices using (client_id)
where invoice_id is null
  • 練習
    • 找到訂購了貨物id為3的顧客
    • 這道題用 連接查詢 思路更清晰,可讀性更好
-- 用子查詢寫
use sql_store;
select customer_id, first_name, last_name
from customers
where customer_id in (select customer_idfrom order_itemsjoin orders using (order_id)where product_id = 3
)-- 使用連接查詢
select distinct customer_id, first_name, last_name
from customers
join orders using (customer_id)
join order_items using (order_id)
where product_id = 3

ALL關鍵字

  • 查詢大于3號客戶的最大發票的所有數據
use sql_invoicing;
select *
from invoices
where invoice_total > (select max(invoice_total)from invoiceswhere client_id = 3)
  • 用all關鍵字
    • 查詢invoice_total比all后查詢到的所有數據都大的數據,一個一個的跟all后查詢到的結果進行比較
select *
from invoices
where invoice_total > all(select invoice_totalfrom invoiceswhere client_id = 3)

返回結果
在這里插入圖片描述

  • max寫法和all寫法可以相互改寫,兩種寫法的可讀性都較好

ANY關鍵字

  • in 和 = any是等價的。
  • 查詢至少有兩張發票的客戶id
    • 使用count(*)查到所有的信息,根據client_id分組,分組后用having進行條件篩選
select client_id, count(*)
from invoices
group by client_id
having count(*) >= 2
  • 把上述查詢當子查詢,把clients中至少有兩張發票的客戶信息查出來
    • where子句中可以用in,也可以用 = any
    • in 和 = any的效果是一樣的,用哪種都行
-- in
select *
from clients
where client_id in (select client_idfrom invoicesgroup by client_idhaving count(*) >= 2
)
-- = any
select *
from clients
where client_id = any (select client_idfrom invoicesgroup by client_idhaving count(*) >= 2
)

相關子查詢 !

  • 查詢邏輯:先到employees表,對每個員工e執行這段子查詢,計算和e同一個部門的員工的平均工資,如果這名員工e的工資高于平均工資,就會被返回在結果中。依次一條一條的去查詢。
  • 這種查詢成為相關子查詢,子查詢和外查詢存在相關性,引用了外查詢里出現的別名(即e)
  • 使用相關子查詢時,這段子查詢會在主查詢每一行的層面執行,所以相關子查詢經常執行的很慢。
use sql_hr;
select *
from employees e
where salary > (select avg(salary)from employeeswhere office_id = e.office_id)
  • 練習
    • 查詢顧客大于自己平均值的數據
use sql_invoicing;
select *
from invoices i
where invoice_total > (select avg(invoice_total)from invoiceswhere client_id = i.client_id)

EXISTS運算符

  • 獲取在發票表中有發票的客戶
    • 三種寫法:子查詢,外連接,exists相關子查詢
  • 用in,先將in后的子查詢運行結果返回給where。
  • in后的子查詢會生成一個列表,返回給where。如果子查詢查到的過多,會導致列表特別大,這樣會妨礙最佳性能;對于這種情況,用exists能提高效率
select *
from clients
where client_id in (select distinct client_idfrom invoices)
  • 用exists運算符,來查看發票表里是否存在符合這個條件的行
  • 子查詢并沒有給外查詢返回一個結果,它會返回一個指令,說明這個子查詢中是否有符合這個搜索條件的行,每一行外層查詢的數據都到exists后去看是否存在;如果存在,子查詢就會給exists返回true,exists運算符就會在最終結果里添加當前的記錄。
select *
from clients
where exists(select client_idfrom invoiceswhere invoices.client_id = clients.client_id
);

運行結果
在這里插入圖片描述

  • 練習
    • 找到從沒有被訂購過的商品
use sql_store;
select *
from products
where not exists(select product_idfrom order_itemswhere order_items.product_id = products.product_id
)

運行結果
在這里插入圖片描述

select子句中的子查詢

  • 在select子句中用子查詢得到平均值
  • select語句中 在表達式中不能使用列的別名,這樣就只能把select子句中的子查詢再復制一遍,但是這樣很長很麻煩且重復;解決方法是:再轉換成一個子查詢(select invoice_average)
use sql_invoicing;
select invoice_id,invoice_total,(select avg(invoice_total)from invoices) as invoice_avearge,invoice_total - (select invoice_avearge) as difference
from invoices

運行結果
在這里插入圖片描述

  • 練習:得到每個客戶的總發票金額,全部發票的平均值,以及他們的差值
select client_id,name,(select sum(invoice_total)from invoiceswhere client_id = c.client_id) as total_sales,(select avg(invoice_total)from invoices) as average,(select total_sales) - (select average) as difference
from clients c

運行結果
在這里插入圖片描述

from子句中的子查詢

  • 可以把一段查詢生成的表當作另一個查詢的from
select *
from(
select client_id,name,(select sum(invoice_total)from invoiceswhere client_id = c.client_id) as total_sales,(select avg(invoice_total)from invoices) as average,(select total_sales) - (select average) as difference
from clients c
) as hahah
where total_sales is not null

運行結果
在這里插入圖片描述

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

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

相關文章

【python基礎(四)】if語句詳解

文章目錄 一. 一個簡單示例二. 條件測試1. 檢查多個條件1.1. 使用and關聯多個條件1.2. 使用or檢查多個條件1.3. in的判斷 2. 布爾表達式 三. if語句1. 簡單的if語句2. if-else語句3. if-elif-else結構4. 使用多個elif代碼塊5. 省略else代碼塊 四. 使用if語句處理列表1. 檢查特殊…

2023-11-23 LeetCode每日一題(HTML 實體解析器)

2023-11-23每日一題 一、題目編號 1410. HTML 實體解析器二、題目鏈接 點擊跳轉到題目位置 三、題目描述 「HTML 實體解析器」 是一種特殊的解析器,它將 HTML 代碼作為輸入,并用字符本身替換掉所有這些特殊的字符實體。 HTML 里這些特殊字符和它們…

Endnote軟件添加期刊引用格式

在下述網址中,找到你想要添加的期刊,下載引用格式文件(后綴為.ens格式) https://endnote.com/downloads/styles/?wpv_post_searchInformationfusion&wpv_aux_current_post_id12829&wpv_view_count12764-TCPID12829 下載…

SQLY優化

insert優化 1.批量插入 手動事務提交 主鍵順序插入,主鍵順序插入性能高于亂序插入 2.大批量插入數據 如果一次性需要插入大批量數據,使用Insert語句插入性能較低,此時可以使用MYSQL數據庫提供的load指令進行插入 主鍵優化 主鍵設計原則 …

Java實現王者榮耀小游戲

主要功能 鍵盤W,A,S,D鍵:控制玩家上下左右移動。按鈕一:控制英雄發射一個矩形攻擊紅方小兵。按鈕控制英雄發射魅惑技能,傷害小兵并讓小兵停止移動。技能三:攻擊多個敵人并讓小兵停止移動。普攻:對小兵造成基礎傷害。小…

vue3 終端實現 (vue3+xterm+websocket)

目錄 一、xterm介紹 二、效果展示 三、vue文件實現代碼 一、xterm介紹 xterm是一個使用

【C++初階】STL詳解(七)Stack與Queue的模擬實現

本專欄內容為:C學習專欄,分為初階和進階兩部分。 通過本專欄的深入學習,你可以了解并掌握C。 💓博主csdn個人主頁:小小unicorn ?專欄分類:C 🚚代碼倉庫:小小unicorn的代碼倉庫&…

力扣labuladong一刷day17天前綴和數組

力扣labuladong一刷day17天前綴和數組 一、303. 區域和檢索 - 數組不可變 題目鏈接:https://leetcode.cn/problems/range-sum-query-immutable/ 思路:本題即為讓寫一個類用于計算指定區間內的數字和,但如果直接采用for循環的方式&#xff0…

Unity調用dll踩坑記

請用寫一段代碼,讓unity無聲無息的崩潰。 你說這怕是有點難哦,誰會這么不幸呢?不幸的是,我幸運的成為了那個不幸的人。 unity里面調用dll的方式是使用 DllImport ,比如有一個 Hello.dll,里面有一個 char* …

圖片如何去除水印?試試這三種去水印方法!

從事自媒體行業的小伙伴們,你們是否經常為文章配圖而煩惱呢?下載的圖片大部分帶有各種各樣的水印或者多余元素,讓人感到困擾。今天,我要分享三個去水印的妙招,這是新媒體人必備的圖片處理技能,快來一起學起…

【MATLAB源碼-第87期】基于matlab的Q-learning算法柵格地圖路徑規劃,自主選擇起始點和障礙物。

操作環境: MATLAB 2022a 1、算法描述 Q-learning是一種無模型的強化學習算法,適用于有限的馬爾可夫決策過程(MDP)。它的核心是學習一個動作價值函數(action-value function),即Q函數&#xf…

面試官:【js多維數組扁平化去重并排序】

文章目錄 前言方法一方法二方法三方法四總結后言 前言 hello world歡迎來到前端的新世界 😜當前文章系列專欄:JavaScript 🐱?👓博主在前端領域還有很多知識和技術需要掌握,正在不斷努力填補技術短板。(如果出現錯誤&a…

【騰訊云云上實驗室-向量數據庫】Tencent Cloud VectorDB在實戰項目中替換Milvus測試

為什么嘗試使用Tencent Cloud VectorDB替換Milvus向量庫? 亮點:Tencent Cloud VectorDB支持Embedding,免去自己搭建模型的負擔(搭建一個生產環境的模型實在耗費精力和體力)。 騰訊云向量數據庫是什么? 騰…

rsync配置和守護進程實踐

目錄 一、rsync概念 1.rsync簡介 2.rsync特點 3、增量和全局傳輸 二、Rsync工作方式 1.準備好rsync備份服務器 2.本地的數據傳輸模式 3.遠程的數據傳輸模式 4.rsync數據推拉模式 三、實踐 1.準備三臺虛擬機 2.都安裝rsync服務 3.拉取遠程文件 3.推送文件 4.rsyn…

Oracle用戶(User)和表空間(Tablespace)

3. 用戶和表空間 3.1. 用戶 1)概念 Oracle數據庫中,用戶(User)是訪問數據庫的途徑和認證方式,同時,用戶也是數據庫對象的邏輯集合。我們通過數據庫用戶和密碼來登錄數據庫,然后,可以在該用戶下創建和操作數據庫對象。 2)創建和配置 創建Oracle用戶,需要具備創建…

python系統編程

文章目錄 系統編程系統工具概述sys模塊os模塊 腳本運行上下文當前工作路徑命令行參數shell環境變量標準流 文件和目錄工具文件工具目錄工具 并行系統工具進程分支線程 系統編程 系統工具 概述 python系統模塊: 模塊名作用*sys負責導出與怕以后呢解釋器本身相關的組件*os包含…

Django DRF序列化器serializer

以下案例由淺到深&#xff0c;逐步深入&#xff0c;通過實例介紹了序列化器的使用方法&#xff0c;和其中遇到的常見問題的解決。 一、序列化器serializers.Serializer 1、urls.py urlpatterns [path("api/<str:version>/depart/",views.DepartView.as_vie…

緩存雪崩、擊穿、穿透及解決方案_保證緩存和數據庫一致性

文章目錄 緩存雪崩、擊穿、穿透1.緩存雪崩造成緩存雪崩解決緩存雪崩 2. 緩存擊穿造成緩存擊穿解決緩存擊穿 3.緩存穿透造成緩存穿透解決緩存穿透 更新數據時&#xff0c;如何保證數據庫和緩存的一致性&#xff1f;1. 先更新數據庫&#xff1f;先更新緩存&#xff1f;解決方案 2…

【問題解決】RuntimeError: apex.optimizers.FusedSGD requires cuda extension 問題解決

在使用 apex 庫時&#xff0c;按照官方的方式安裝后&#xff0c;雖然安裝成功&#xff0c;但調用的時候會報錯如下&#xff0c;也就是說其實沒有成功安裝可調用 cuda 的 apex&#xff1a; RuntimeError: apex.optimizers.FusedSGD requires cuda extension我找了很多解決方式&…

【藍橋杯省賽真題46】Scratch魔術表演 藍橋杯scratch圖形化編程 中小學生藍橋杯省賽真題講解

目錄 scratch魔術表演 一、題目要求 編程實現 二、案例分析 1、角色分析