MySQL —— 復合查詢

一、基本的查詢回顧練習

前面兩章節整理了許多關于查詢用到的語句和關鍵字,以及MySQL的內置函數,我們先用一些簡單的查詢練習去回顧之前的知識

1.?前提準備

同樣是前面用到的用于測試的表格和數據,一張學生表和三張關于雇員信息表

雇員信息表

2. 測試樣例

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

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

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

2.4 顯示工資高于平均工資的人

同樣是利用子查詢,先算到平均工資是多少,然后條件篩選出高于該工資的人

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

要不同部門的顯示平均工資和最高工資,也就是要按部門先分組,再聚合

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

首先,我們要顯示的是部門號和它的平均工資,要求是部門平均工資低于2000,因此還要得到各個部門的平均工資,并且進行條件篩選

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

根據要求,應該要顯示崗位、崗位雇員總數、平均工資,需要按崗位分組,聚合

二、多表查詢

在實際開發中,往往要描述一些較為復雜的系統時,往往數據不止被記錄在一張表格內,例如我們一直在使用的雇員信息表,就有三張,因此我們還需要多表進行查詢

先介紹一個概念——笛卡爾積

笛卡爾積本質就是一種窮舉的策略,在對兩個表進行聯合查詢的時候,實際就是表一的第一條記錄和表二的所有記錄進行拼接,然后是表一第二條記錄和表二的所有記錄拼接,以此類推形成新表,這種窮舉拼接的策略就是兩個表的笛卡爾積

我們在需要用到多個表的數據時,聯合查詢會得到多個表的笛卡爾積,在其中通過條件篩選出我們需要的數據,就是多表查詢,接下來還是利用雇員信息表來練習多表查詢

1. 顯示雇員名、雇員工資以及所在部門的名字

雇員名字和雇員工資在emp表中,而部門名字在dept表中,因此需要聯合查詢

2. 顯示部門號為10的部門名,員工名和工資

首先我們需要顯示部門名,員工名,還有工資,需要聯合查詢,然后是條件篩選出部門號為10的

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

需要顯示的是員工名字,工資和工資級別,因此要用到emp和salgrade這兩個表

三、自查詢

自查詢實際就是一個表自己和自己的笛卡爾積,這種查詢方式也有一定的應用場景,要注意,由于兩個表都是同一張,因此命名上會有沖突,需要對表的名字進行重命名

應用場景

顯示員工FORD的上級領導的編號和姓名

我們要找到員工FORD的領導信息,可以通過FORD信息中的領導編號去找到領導的信息,可以使用子查詢的方式先找到FORD的領導編號,再找領導信息,同時也可以使用自查詢的方式,去條件篩選出領導的信息

四、子查詢

子查詢在前面一些例子中已經用到過了,接下來詳細整理和說明子查詢

1.單行子查詢

單行子查詢就是前面用到的,子查詢結果返回單行記錄的情況

例子:顯示SMITH同一部門的員工

首先我們要通過子查詢先找到SMITH所屬的部門,再進行條件篩選

2.多行子查詢

當子查詢返回結果為多行記錄時,條件篩選的條件是一個集合,此時我們針對不同的情況,有三個關鍵字in、all、any去鏈接篩選條件:

in:表示篩選出該條件集合中的數據

all:表示前面的表達式需要滿足和該集合中所有元素都作用且為true才符合篩選條件

any:表示前面的表達式和該集合中的元素任意一個滿足條件即可符合篩選條件

例子:

a.?查詢和10號部門的工作崗位相同的雇員名字、崗位、工資、部門號,但不包含10號本身

分析:要顯示的是ename、job、sal、deptno,篩選條件是和部門號10相同的崗位,需要先找到和十號部門相同的崗位集合,條件是崗位是該集合其中一個即可符合條件,因此使用in,同時要去掉十號本身

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

分析:要顯示的是員工名字、工資、部門號,條件是比部門30所有員工工資要高,我們可以選擇找到該部門工資最高為多少,但這里為了示范all的使用,我們采用另一種思路,我們先找到30號部門所有員工工資的集合,然后篩選條件為大于該集合中的所有元素,因此用all

c. 顯示工資比部門30的任意員工的工資高的員工的姓名、工資和部門號(結果包括部門30的人)

分析:顯示ename、sal、deptno,要求比部門30的任意員工工資都高,先子查詢找到該部門工資的集合,條件篩選是大于該部門的任意一人,因此使用any連接條件

3.多列子查詢

子查詢返回的結果為多列數據時就叫多列子查詢

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

分析:條件是和SMITH的部門和崗位都完全相同,因此需要先找到SMITH的崗位和部門是什么,該子查詢返回結果是兩列的,此時返回的結果的格式要認為是(v1,v2,...)這種類型,在做條件判斷時,左側也應該是這種格式

4.在from子句中使用子查詢

我們可以將子查詢的結果看作一張臨時表,子查詢的結果同樣可以放在from后面去滿足一些查詢要求

案例:

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

分析:先通過分組子查詢可以查到各個部門的部門平均工資,然后可以對emp和子查詢結果進行笛卡爾積,這樣每個員工信息后面都附加上了其所在部門的平均工資,然后再條件篩選即可

select ename,emp.deptno,sal,avg_sal from emp,(select deptno,avg(sal) as avg_sal from emp group by deptno) as tmp where emp.deptno=tmp.deptno and emp.smp.sal>tmp.avg_sal;

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

分析:先子查詢到每個部門的最高工資,然后再和emp笛卡爾積得到新表進行篩選

select ename,sal,deptno,max_sal from emp,(select deptno dt,max(sal) max_sal from emp group by deptno) tmp where emp.deptno=tmp.dt and emp.sal=tmp.max_sal;

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

分析:我們先將需要的信息都查詢出來,我們需要每個部門的部門名、編號以及地址,這些信息都在dept表上,人員數量則是對emp表格中根據部門不同分組然后聚合

select dept.deptno,dept.dname,dept.loc,num from dept,(select deptno,count(*) as num from emp group by deptno) as tmp where dept.deptno=tmp.deptno;

5.合并查詢

在實際應用中,為了合并多個select的查詢結果,可以使用集合操作符 union 和 union all

(1)union

該操作符用于取得兩個結果集的并集,當使用該操作符時,會自動去掉結果集中的重復行。

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

(2)union all(不去重)

該操作符用于取得兩個結果集的并集,當使用該操作符時,不會去掉結果集中的重復行。

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

總結

本篇更進一步的整理介紹了查詢的操作,對一些復雜的情況進行各種復合查詢的操作,以及提供了大量的練習和樣例

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

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

相關文章

優化數據查詢性能:StarRocks 與 Apache Iceberg 的強強聯合

Apache Iceberg 是一種開源的表格格式,專為在數據湖中存儲大規模分析數據而設計。它與多種大數據生態系統組件高度兼容,相較于傳統的 Hive 表格格式,Iceberg 在設計上提供了更高的性能和更好的可擴展性。它支持 ACID 事務、Schema 演化、數據…

leetcode-設計LRU緩存結構-112

題目要求 思路 雙鏈表哈希表 代碼實現 struct Node{int key, val;Node* next;Node* pre;Node(int _key, int _val): key(_key), val(_val), next(nullptr), pre(nullptr){} };class Solution { public: unordered_map<int, Node*> hash; Node* head; Node* tail; int …

普源DHO924示波器OFFSET設置

一、簡介 示波器是電子工程師常用的測量工具之一&#xff0c;能夠直觀地顯示電路信號的波形和參數。普源DHO924是一款優秀的數字示波器&#xff0c;具有優異的性能和易用性。其中OFFSET功能可以幫助用戶調整信號的垂直位置&#xff0c;使波形更清晰易讀。本文將詳細介紹DHO924…

專注于運動控制芯片、運動控制產品研發、生產與銷售為一體的技術型芯片代理商、方案商——青牛科技

深圳市青牛科技實業有限公司,是專注于運 動控制芯片、運動控制產品研發、生產與銷售為一體的技術型 芯片代理商、方案商。現今代理了國產品牌GLOBALCHIP&#xff0c;芯谷&#xff0c;矽普&#xff0c;TOPPOWER等品牌。其中代理品牌TOPPOWER為電源模塊&#xff0c;他們公司通過了…

cherry-pick的強大之處在于哪里

git cherry-pick 的強大之處在于它提供了一種靈活的方式來應用特定的提交到不同的分支上&#xff0c;而無需合并整個分支或拉取其他不需要的提交。以下是 git cherry-pick 的幾個主要優點和強大之處&#xff1a; 選擇性應用提交&#xff1a;你可以挑選一個或多個特定的提交&…

聲音轉文本(免費工具)

聲音轉文本&#xff1a;解鎖語音技術的無限可能 在當今這個數字化時代&#xff0c;信息的傳遞方式正以前所未有的速度進化。從手動輸入到觸控操作&#xff0c;再到如今的語音交互&#xff0c;技術的發展讓溝通變得更加自然與高效。聲音轉文本&#xff08;Speech-to-Text, STT&…

Plant Simulation驗證AGV算法

Plant Simulation驗證算法也是非常高效且直觀的&#xff0c;一直以來波哥在迭代算法的時候圖形顯示這塊都是使用Openframeworks去做&#xff0c;效果還是非常不錯的。 這里簡要介紹一下openFrameworks&#xff0c;openFrameworks是一個開源的、跨平臺的 C 工具包。旨在開發實時…

LeetCode hot100-49-N

236. 二叉樹的最近公共祖先 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。百度百科中最近公共祖先的定義為&#xff1a;“對于有根樹 T 的兩個節點 p、q&#xff0c;最近公共祖先表示為一個節點 x&#xff0c;滿足 x 是 p、q 的祖先且 x 的深度盡可能大&#xff08;…

爬蟲學習--12.MySQL數據庫的基本操作(下)

MySQL查詢數據 MySQL 數據庫使用SQL SELECT語句來查詢數據。 語法&#xff1a;在MySQL數據庫中查詢數據通用的 SELECT 語法 SELECT 字段1&#xff0c;字段2&#xff0c;……&#xff0c;字段n FROM table_name [WHERE 條件] [LIMIT N] 查詢語句中你可以使用一個或者多個表&…

uni-app項目在微信開發者工具打開時報錯[ app.json 文件內容錯誤] app.json: 在項目根目錄未找到 app.json

uni-app項目在微信開發者工具打開時報錯[ app.json 文件內容錯誤] app.json: 在項目根目錄未找到 app.json 出現這個問題是因為打開的文件地址不對&#xff0c;解決這個問題首先我們要查看是否有unpackage文件夾&#xff0c;如果有&#xff0c;項目直接指向unpackage\dist\dev\…

vue3使用mitt.js進行各種組件間通信

我們在vue工程中&#xff0c;除開vue自帶的什么父子間&#xff0c;祖孫間通信&#xff0c;還有一個非常方便的通信方式&#xff0c;類似Vue2.x 使用 EventBus 進行組件通信&#xff0c;而 Vue3.x 推薦使用 mitt.js。可以實現各個組件間的通信 優點&#xff1a;首先它足夠小&…

【云原生】Kubeadm部署k8s

目錄 一、部署步驟 二、部署kubernetes 2.1、所有節點關閉防火墻 核心防護 iptables規則 swap交換 2.2、修改主機名并添加主機映射 2.3、調整內核參數 三、安裝Docker 3.1、所有節點安裝docker 3.2、所有接點添加鏡像加速器 3.3、開啟docker、并設置開機自啟、查看狀態…

ESP32學習筆記:WS2812B驅動

WS2812B是一款貼片RGB燈。由于采用了單總線通訊&#xff0c;所以需要特別關注下它的通訊時序。 調試細節&#xff1a; 本來以為會是一個比較簡單的調試&#xff0c;結果還是花了很長時間才調試完成。 首先是關于ESP32的納秒級延時確定&#xff0c;當時按照空指令始終調試不出來…

Linux中的計劃任務(crontab)詳解

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《Linux &#xff1a;從菜鳥到飛鳥的逆襲》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、前言 1、Linux的起源與發展 2、什么是計劃任務&#xf…

超詳細的前后端實戰項目(Spring系列加上vue3)(一步步實現+源碼)前端篇(一)

最近想著一步步搭建一個前后端項目&#xff0c;將每一步詳細的做出來。&#xff08;如果有不足或者建議&#xff0c;也希望大佬們指出哦&#xff09; 前端初始化 1.根據vue腳手架創建vue項目 這里可以用很多方法創建vue項目&#xff0c;大家看著創建吧&#xff0c;只要能創建…

k8s 部署mqtt簡介

在Kubernetes&#xff08;K8s&#xff09;中部署MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;服務通常涉及以下幾個步驟&#xff1a; 選擇MQTT Broker MQTT Broker是MQTT消息傳遞的中間件。流行的MQTT Broker包括Mosquitto, HiveMQ, EMQ X等。你需要選擇一…

機器學習面試問題總結 | 貝葉斯網絡

本文給大家帶來的百面算法工程師是機器學習中貝葉斯網路面試總結&#xff0c;文章內總結了常見的提問問題&#xff0c;旨在為廣大學子模擬出更貼合實際的面試問答場景。在這篇文章中&#xff0c;我們還將介紹一些常見的面試問題&#xff0c;并提供參考的回答及其理論基礎&#…

K8S Secret管理之SealedSecrets

1 關于K8S Secret 我們通常將應用程序使用的密碼、API密鑰保存在K8S Secret中&#xff0c;然后應用去引用。對于這些敏感信息&#xff0c;安全性是至關重要的&#xff0c;而傳統的存儲方式可能會導致密鑰在存儲、傳輸或使用過程中受到威脅&#xff0c;例如在git中明文存儲密碼…

FreeRTOS_事件組_學習筆記

事件組 原文鏈接 事件組是一個整數&#xff0c;其中的高8位留給內核&#xff0c;只能用其他位來表示時間 每一位代表一個事件&#xff0c;且每個時間的含義由程序員決定 1為發生&#xff0c;0為未發生 一個/多個任務或ISR都能讀寫這些位 可以等待某一位&#xff0c;也可以等待…

如何理解合約中的引用類型(3)——Mapping

映射&#xff08;mapping&#xff09; 聲明形式&#xff1a;mapping(key type > value type)keytype可以是除枚舉外的幾乎任何基本類型&#xff0c;包括bytes和string&#xff0c;不包括用戶自定義的復雜類型-合約&#xff0c;枚舉&#xff0c;結構&#xff0c;映射value t…