[MySQL] MySQL復合查詢(多表查詢、子查詢)

? 前面我們學習了MySQL簡單的單表查詢。但是我們發現,在很多情況下單表查詢并不能很好的滿足我們的查詢需求。本篇文章會重點講解MySQL中的多表查詢子查詢一些復雜查詢。希望本篇文章會對你有所幫助。

文章目錄

一、基本查詢回顧

二、多表查詢

2、1 笛卡爾積

2、2 多表查詢練習

三、自連接

四、子查詢

4、1 單行子查詢

4、2 多行子查詢

4、3 多列子查詢

4、4?在from子句中使用子查詢

五、合并查詢


🙋?♂??作者:@Ggggggtm?🙋?♂?

👀?專欄:MySQL?👀

💥?標題:MySQL復合查詢💥

????寄語:與其忙著訴苦,不如低頭趕路,奮路前行,終將遇到一番好風景???

? 在對本篇文章學習之前,首先說明一下本篇文章所用到表的結構和內容。具體如下:

  • 員工表emp:
  • 部門表dept:
  • 薪水表salgrade:

一、基本查詢回顧

查詢工資高于500或崗位為MANAGER的雇員,同時還要滿足他們的姓名首字母為大寫的J?

? 首先確定,上述所需篩選的信息都在一行表中。其次,分析出 工資 > 500 or job = MANAGER。我們先來查詢出滿足?工資 > 500 or job = MANAGER 的員工。具體如下:

? 同時,我們還需要滿足所查詢到的員工的姓名首字母為大寫的J,很明顯是模糊查詢。具體如下圖:

按照部門號升序而雇員的工資降序排序

? 這個需求就是簡單的排序即可。注意所需排序的先后順序。具體如下圖:

使用年薪進行降序排序

? 首先我們需要計算出來年薪。年薪 = 月薪(sal)*12 + 年終獎(comm)。那么我們直接就對其進行排序即可。但是需要注意的是:NULL并不能參與計算,這時候需要內置函數ifnull來進行判斷其是否為NULL,如果為NULL直接加0即可。?具體如下:

顯示工資最高的員工的名字和工作崗位?

? 我們可以很容易的查找到最高工資是多少,然后再根據最高工資去找對應的員工的名字和工作崗位。具體如下圖:

? 上述用了兩條SQL語句確實能夠查詢出我們想要的結果。但是好像不太優雅。能不能用一條語句將所需結果查詢出來呢?答案是可以的。我們可以用子查詢。什么是子查詢呢?在 MySQL 中,子查詢是指在一個查詢語句中嵌套另一個查詢語句。子查詢可以用于過濾結果集、作為計算字段的數據源、與外部查詢進行比較等多種情況。下面我們用子查詢來解決這個需求。具體如下:

顯示工資高于平均工資的員工信息?

? 這個題目的需求與上一個題目的需求很相似。我們可以先獲取平均工資,在查詢比平均工資高的員工,一樣是用子查詢。具體如下:

顯示每個部門的平均工資和最高工資

? 我們看到需求是每個部門,那么首先肯定要按部門號進行分組。其次我們再查詢每個部門的平均工資和最高工資。具體如下圖:

顯示平均工資低于2000的部門號和它的平均工資

? 首先我們很容易可以找到各個部門的平均工資,然后只需要再增加一個條件判斷即可。具體如下:

顯示每種崗位的雇員總數,平均工資??

? 注意是每種崗位,所以需要根據job進行分組查詢。具體如下圖:

二、多表查詢

2、1 笛卡爾積

? 在MySQL中,多表查詢的笛卡爾積(Cartesian Product)是指在沒有使用任何條件或連接的情況下,將兩個或多個表中的所有行進行組合的結果集。這種情況通常是在沒有明確指定連接條件或者WHERE子句的情況下進行的查詢,但在實際應用中,很少需要或者希望獲得笛卡爾積結果。

? 以下是一個簡單的說明以及一個示例來解釋笛卡爾積:

  1. 笛卡爾積的性質: 笛卡爾積將參與查詢的每個表的所有可能組合都返回,即第一個表的每一行都會與第二個表的每一行進行組合,生成的結果集的行數為各個表行數的乘積。

  2. 示例:我們現在將員工表和部門表進行笛卡爾積。具體如下:其實我們也不難看出,規律就是如下圖:

? 但是往往我們用笛卡爾積所獲取的表有很多的數據冗余。因為它會產生大量的冗余數據并且效率低下。為了避免得到笛卡爾積,我們需要正確地使用連接條件(例如使用where條件來篩選掉無用信息)來明確指定表之間的關聯關系。例如,在對上述的員工表和部門表進行笛卡爾積時,一個員工不可能會有多個部門號,所以只有部門號相同的才算是有效的信息。最終有效結果如下圖:

2、2 多表查詢練習

顯示部門號為 10 的部門名,員工名和工資
我們發現員工表中并沒有我們想要的部門名,所以我們需要進行多表查詢。需要將員工表和部門表進行合并查詢。然后在查詢部門號為10的部門名、員工名和工資。具體如下:
這里再說明一下:上述 SQL語句中 from 后 的 t1 和 t2 是對 emp 和 dept 表進行了重命名,后續都可以 用我們重命名的名字去代替表名字。其次是當我們將兩張表拼接到一塊后,表中會有 兩個deptno,所以我們在使用deptno時,需要指定是那個表的

顯示各個員工的姓名,工資,及工資級別

? ?我們發現工資等級只有在薪資表中有,所以我們需要進行多表查詢。當我們將員工表與薪水表進行笛卡爾積后,發現很多數據是冗余的。只有薪資符合它所在的等級區間才是有效的。所以我們的查尋結果如下:

三、自連接

? 我們上述講解的是兩張不同的表進行連接。那么可以自己與自己的表進行連接嗎?答案是可以的!MySQL中的自連接是指在同一張表中進行連接操作。這種連接通常用于將表中的數據與自身進行比較或者組合。自連接可以通過將表與自身進行別名來實現,從而使得查詢可以使用表中的不同行進行比較和操作。?我們看如下例子:

? 通過上圖我們發現,當進行自連接時,如果不對表進行取別名,那么將不能夠進行自連接。必須對表進行取別名。自連接的使用場景是什么呢?我們看如下例子。

?顯示員工FORD的上級領導的編號和姓名(mgr是員工領導的編號--empno

? 員工是在emp表中,上級領導也是員工,也在emp表中。我們可能首先會想到用子查詢來解決,相對簡單。具體如下:

? 但是我們也不難發現,要查詢的兩個條件都是在emp表中,那么我們就可以對emp表進行自連接。我們現在把兩張表想象成一張表是員工表,另一張表是領導表。我們現在需要的有效信息是:員工表中的mgr = 領導表中的empno即可。篩選出有效信息后在選擇員工表中的員工為FORD。具體如下:

四、子查詢

? 子查詢的概念在上文中已經解釋過,這里就不再解釋。在子查詢的子句中,子句查詢出的結果可能不止是一行記錄,也有可能是多行記錄,還有就是多列的情況。下面我們一一來分析一下。

4、1 單行子查詢

顯示 SMITH 同一部門的員工

? 首先將SMITH的部門號查出,然后再將該部門的所有員工篩選出即可。具體如下:

4、2 多行子查詢

查詢和10號部門的工作崗位相同的雇員的名字,崗位,工資,部門號,但是不包含10自己的

? 我們可以先查詢出10號部門的工作崗位,具體如下:

? 然后我們再進行篩選與上圖中崗位相同的雇員的信息。當我們想用子查詢時,發現上圖的崗位并不是一個,那該怎么辦呢?這時候可以用到 in關鍵字in關鍵字用于檢查某個值是否在一組值中。剛好符合我們的需求。具體如下:

顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號

? 題目的要求:找出比30號部門所有員工工資都好的員工信息。也就是比30號部門最高工資還要高的部門。我們首先找出30號部門的員工最高工資,再篩選出薪資比它大的即可。具體如下:

? 我們也可以使用all關鍵字。all關鍵字用于比較外部查詢和子查詢返回的所有值當使用?all關鍵字時,外部查詢的值必須滿足子查詢返回的所有值的條件才會被選中。具體如下:

顯示工資比部門30的任意員工的工資高的員工的姓名、工資和部門號(包含自己部門的員工)
注意:題目中的任意員工,是指的只要有比部門30中的員工工資高的即滿足條件。通俗理解:找出比 部門號30的員工中最低工資 高的員工。這時可以用any關鍵字。 any關鍵字用于比較外部查詢和子查詢返回的任意一個值當使用 any? 時,外部查詢的值只需要滿足子查詢返回的任意一個值的條件即可被選中。具體如下:

4、3 多列子查詢

? 單行子查詢是指子查詢只返回單列,單行數據;多行子查詢是指返回單列多行數據,都是針對單列而言的,而多列子查詢則是指查詢返回多個列數據的子查詢語句。下面我們來看一個例子。

查詢和 SMITH 的部門和崗位完全相同的所有雇員,不含 SMITH 本人

? 我們可以先查詢出來SMITH的部門和崗位。如下圖:

? 我們發現,要和SMITH的部門和崗位完全相同,是多列的情況。這該怎么辦呢?我們看如下:

? 但是題目中還要求了不能包含SMITH本人。所以再把SMITH本人去掉即可。結果如下:

4、4?from子句中使用子查詢

? 我們之前學到的from后都是跟的表的名字。from子句中使用子查詢怎么理解呢?使用子查詢無非就是一個查詢語句中嵌套了一個語句。我們就稱之為子句。那么子句查詢出來的結果我們也可看成一張表,可與其他物理上實力存在的表進行連接。這就是在from子句中使用子查詢的意思下面我們結合實際例子來理解一下。

顯示每個高于自己部門平均工資的員工的姓名、部門、工資、平均工資

? 我們可以很容易得到每個部門的平均工資,具體如下:

? 我們可以把上述所查詢出來的結果當作一個表,再與emp表進行連接即可。具體如下:

? 對我們來說,有用的信息就是emp.deptno = tmp.deptno。那么查詢出來的結果如下:

? 現在我們只需要emp.sal > tmp.平均工資( avg(sal))?即可,就是題目所要求的答案,具體如下:

顯示每個部門的信息(部門名,編號,地址)和人員數量

? 我們發現,部門名和地址都在部門表中,而我們想要統計每個部門的人員數量還需要在emp表中統計。我們先來統計每個部門的人員數量,具體如下:

? 我們再將上述查詢的結果與部門dept表進行連接,得到有用信息如下圖:

? 此時,我們在獲取題目中的所需要的信息就相當容易了。具體如下圖:

查找每個部門工資最高的人的姓名、工資、部門、最高工資

? 首先,我們可以很容易的得到每個部門的最高工資,如下圖:

? 但是怎么獲取工資最高的人的信息呢?這時候可以將我們查詢的結果與emp表連接,再獲取該人的信息就可以了。具體如下:

五、合并查詢

? 在MySQL中,合并查詢指的是將多個查詢結果合并成一個結果集的操作。這可以通過使用union、union?all等操作符來實現。以下是對每種操作符的詳細解釋:

  1. union:union操作符用于將兩個或多個select語句的結果合并為一個結果集,并自動去重。

  2. union?all:與union類似,但不會自動去重。

? 下面我們來看幾個實際例子來理解一下。

將工資大于 2500 或職位是 MANAGER 的人找出來

? 這個例子我們前面已經做過類似的,不再過多解釋,直接看下圖:

? 我們也可以先將工資大于2500的人找出來,如下:

? 再找出來職位是MANAGER的。如下圖:

? 最后用union將他們兩個合并即可。具體如下:

? 我們再來用union all 將他們合并試試。具體如下圖:

? 從上述的對比中,我們也能看出來union是合并并且去重,union all就只是合并。注意:兩個select合并的前提是必須所查詢出來的列數是相同的。實際中,union并不常用,我們只是了解一下即可。

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

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

相關文章

機器學習筆記 - 基于深度學習計算視頻中演員的出鏡時間

一、基本步驟 這里是使用動畫片貓和老鼠進行計算,基本流程如下: 1、導入并讀取視頻,從中提取幀,并將其另存為圖像 2、標記一些圖像以訓練模型(別擔心,我已經為你做好了) 3、根據訓練數據構建我們的模型 4、對剩余圖像進行預測 5、計算湯姆和杰瑞的屏幕時間 二、基礎環境…

教師未來發展前景如何

作為一名教師,我對未來發展的前景也感到有些迷茫。 不過教育行業仍然是一個穩定的職業,但是隨著社會的變化和科技的發展,傳統的教學模式已經逐漸被在線教育、人工智能等新型教學方式所取代。這使得教師的角色和職責也在發生變化,需…

matplot繪圖時圖像太大報錯但能保存

matplot繪圖時,圖像太大,可能在jupyter里面報錯,但是圖像可以保存。 報錯:Image size of 12237479x675 pixels is too large. It must be less than 2^16 in each direction. 在這里插入圖片描述

Linux中用bash寫腳本

本章主要介紹如何使用bash 了解通配符了解變量了解返回值和數值運算判斷語句 grep的用法是“grep 關鍵字 file”,意思是從file中過濾出含有關鍵字的行 例如,grep root /var/log/messages,意思是從/var/log/messages 中過濾出含有root 的行…

SpringIOC第二課,@Bean用法,DI詳解,常見面試題Autowired VS Resource

一、回顧 但是我們之前MVC時候,在頁面上,為什只用Controller,不用其他的呢? 用其他的好使嗎?(我們可以在這里看到,出現404的字樣) Service ResponseBody public class TestController {RequestMapping(&quo…

kubernetes安裝kubesphere

前置默認都安裝了k8s,且k8s都正常 1、nfs文件系統 1.1、安裝nfs-server # 在每個機器。 yum install -y nfs-utils# 在master 執行以下命令 echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports# 執行以下命令,啟動 …

數字化和數智化一字之差,究竟有何異同點?

在2023杭州云棲大會的一展臺內,桌子上放著一顆番茄和一個蛋糕,一旁的機器人手臂融入“通義千問”大模型技術后,變得會“思考”:不僅能描述“看”到了什么,還能確認抓取的是番茄而不是蛋糕。 “傳統的機械臂通常都只能基…

Post Quantum Fuzzy Stealth Signatures and Applications

目錄 筆記后續的研究方向摘要引言貢獻模塊化框架模糊構造實施適用于FIDO Post Quantum Fuzzy Stealth Signatures and Applications CCS 2023 筆記 后續的研究方向 摘要 自比特幣問世以來,基于區塊鏈的加密貨幣中的私人支付一直是學術和工業研究的主題。隱形地址…

cmd命令 常用的命令

網絡工作為常年公司里的背鍋俠,不得不集齊十八般武藝很難甩鍋。像cmd命令這種好用又好上手的技術,就是網絡工程師上班常備技能。 只要按下快捷鍵 winR,輸入cmd回車,然后輸入cmd命令。 像我自己,我就經常用cmd命令檢測…

在UBUNTU上使用Qemu和systemd-nspawn搭建RISC-V輕量級用戶模式開發環境

參考鏈接 使用Qemu和systemd-nspawn搭建RISC-V輕量級用戶模式開發環境 - 知乎 安裝Qemu sudo apt updatesudo apt -y install qemu-user-binfmt qemu-user-static systemd-container sudo apt -y install zstd 配置環境 RISCV_FILEarchriscv-2023-10-09.tar.zstwget -c ht…

浪潮信息KeyarchOS——保衛數字未來的安全防御利器

浪潮信息KeyarchOS——保衛數字未來的安全防御利器 前言 眾所周知,目前流行的操作系統有10余種,每一款操作系統都有自己的特點。作為使用者,我們該如何選擇操作系統。如果你偏重操作系統的安全可信和穩定高效,我推薦你使用浪潮信…

openEuler JDK21 部署 Zookeeper 集群

zookeeper-jdk21 操作系統:openEuler JDK:21 主機名IP地址spark01192.168.171.101spark02192.168.171.102spark03192.168.171.103 安裝 1. 升級內核和軟件 yum -y update2. 安裝常用軟件 yum -y install gcc gcc-c autoconf automake cmake make \zl…

E: 無法獲得鎖 /var/lib/dpkg/lock-frontend。鎖正由進程 6253(apt-get)持有

問題 解決方案 sudo rm /var/lib/dpkg/lock-frontend接著,繼續安裝。

el-from表單實現lable字體大小改變

<el-form-item label"活動名稱" class"my-form"> <el-input v-model"form.name" style"width: 80%;" ></el-input> </el-form-item> <style scoped lang"less"> //給當前頁面所以的lable都字…

Fiddler抓包測試

模擬弱網測試 操作&#xff1a;一、Rules - Customize Rules &#xff08;快捷鍵CtrlR&#xff09;彈出編輯器 二、接著CtrlF查找m_SimulateModem標志位 三、默認上傳300ms&#xff0c;下載150ms 四、更改后&#xff0c;繼續Rules - Performances - Simulate Modem Speeds勾上 …

【復雜網絡建模】——基于Graph Convolutional Networks (GCN)進行鏈接預測

目錄 一、復雜網絡建模 二、圖嵌入方法&#xff08;Graph Convolutional Networks (GCN) &#xff09; 1. 圖表示&#xff1a; 2. 鄰接矩陣&#xff08;Adjacency Matrix&#xff09;&#xff1a; 3. 圖卷積層&#xff08;Graph Convolutional Layer&#xff09;&#xff…

【C語言】7-32 刮刮彩票 分數 20

7-32 刮刮彩票 分數 20 全屏瀏覽題目 切換布局 作者 DAI, Longao 單位 杭州百騰教育科技有限公司 “刮刮彩票”是一款網絡游戲里面的一個小游戲。如圖所示&#xff1a; 每次游戲玩家會拿到一張彩票&#xff0c;上面會有 9 個數字&#xff0c;分別為數字 1 到數字 9&#xf…

Python 中 Thread 線程的用法

使用thread一直沒記錄過&#xff0c;最近又忘記具體用法了&#xff0c;記錄下 Thread()是Python標準庫中threading模塊的一個類&#xff0c;它可以用來創建和管理線程。線程是一種并發執行的方式&#xff0c;可以讓你的程序在等待某些事件的同時&#xff0c;執行其他的任務。例…

排序-插入排序與希爾排序

文章目錄 一、插入排序二、希爾排序 一、插入排序 思路&#xff1a; 當插入第i(i>1)個元素時&#xff0c;前面的array[0],array[1],…,array[i-1]已經排好序&#xff0c;此時用array[i]的排序碼與array[i-1],array[i-2],…的排序碼順序進行比較&#xff0c;找到插入位置即將…

Qt Rsa 加解密方法使用(pkcs1, pkcs8, 以及文件存儲和內存存儲密鑰)

Qt RSA 加解密 完整使用 密鑰格式&#xff1a; pkcs#1pkcs#8 如何區分密鑰對是PKCS1還是PKCS8&#xff1f; 通常PKCS1密鑰對的開始部分為&#xff1a;-----BEGIN RSA PRIVATE KEY-----或 -----BEGIN RSA PUBLIC KEY-----。而PKCS8密鑰對的開始部分為&#xff1a;-----BEGIN…