【半夜學習MySQL】復合查詢(含多表查詢、自連接、單行/多行子查詢、多列子查詢、合并查詢等詳解)

在這里插入圖片描述

🏠關于專欄:半夜學習MySQL專欄用于記錄MySQL數據相關內容。
🎯每天努力一點點,技術變化看得見

文章目錄

  • 回顧基本查詢
  • 多表查詢
  • 自連接
  • 子查詢
    • 單行子查詢
    • 多行子查詢
    • 多列子查詢
    • 在from子句中使用子查詢
    • 合并查詢


回顧基本查詢

下面使用幾個案例,一起回顧之前文章所介紹的基本查詢↓↓↓
案例1: 查詢工資高于500或崗位為MANAGER的雇員,同時還要滿足他們的姓名售資委大寫的J

select * from emp where (sal>500 or job='MANAGER') and substring(ename,1,1)='J';

在這里插入圖片描述
案例2: 按照部門號升序而雇員工資降序排列

select * from emp order by deptno asc, sal desc;

在這里插入圖片描述
案例3: 對年薪進行降序排列

select ename, sal*12+ifnull(comm,0) as '年薪' from emp order by '年薪' desc;

在這里插入圖片描述
案例4: 顯示工資最高的員工的名字和工作崗位

select ename, job from emp where sal=(select max(sal) from emp);

在這里插入圖片描述
案例5: 顯示工資高于平均工資的員工信息

select ename, sal from emp where sal>(select avg(sal) from emp);

在這里插入圖片描述
案例6: 顯示每個部門的平均工資和最高工資

select deptno, avg(sal), max(sal) from emp group by deptno;

在這里插入圖片描述
案例7: 顯示平均工資低于2000的部門號和它的平均工資

select deptno, avg(sal) as avgsal from emp group by deptno having avgsal<2000;

在這里插入圖片描述
案例8: 顯示每種崗位的雇員總數,平均工資

select count(*) as '雇員總數', format(avg(sal), 2) as '平均工資' from emp group by job;

在這里插入圖片描述
回顧完的這些查詢操作,都是對一張表進行查詢,但在實際開發中是遠遠不夠的。下面我們就一起來了解學習以下復合查詢。

多表查詢

實際開發中的數據往往來自不同的表,所以需要多表查詢。這里介紹多表查詢使用的oracle9i自帶的scott庫下的emp、dept、salegrade表。先看一下這三張表吧↓↓↓
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

多表查詢通過案例的方式進行介紹

案例1: 顯示雇員名、雇員工資及其所在部門的名字。
☆ps:雇員名、雇員工資來自emp表,而部門名字在dept表中。我們可以嘗試讓emp表和dept表組合。

select * from emp, dept;

在這里插入圖片描述
上述組合中:
Ⅰ 從第一張表中選出第一條巨鹿和第二個表的所有集合進行組合;
Ⅱ 然后從第一張表中取第二條數據,和第二張表中的所有記錄組合
Ⅲ 不加過來條件,得到的上圖結果稱為笛卡爾積

但上圖中那么多記錄,我們只需要emp表中的dept等于dept表中的deptno字段的記錄

select emp.ename, emp.sal, dept.dname from emp, dept where emp.deptno=dept.deptno;

在這里插入圖片描述
案例2: 顯示部門號為10的部門名、員工名和工資

select dname, ename, sal from emp, dept where emp.deptno=dept.deptno and emp.deptno=10;

在這里插入圖片描述
案例3: 顯示各個員工的姓名、工資及工資級別

select ename, sal, grade from emp, salgrade where emp.sal between losal and hisal;

在這里插入圖片描述

自連接

上面介紹的是多張表的連接操作,那能否實現一張表實現自己和自己連接呢?這就是自連接。下面圖演示的就是dept表自身和自身的連接↓↓↓
在這里插入圖片描述

案例: 顯示員工FORD的上級領導的編號和姓名(emp表中mgr表示的是領導的編號)
●方法1:使用子查詢的方式

select empno, ename from emp where empno=(select mgr from emp where ename='FORD');

在這里插入圖片描述
●使用多表查詢(自連接查詢)

select leader.empno, leader.ename from emp leader, emp worker where leader.empno=worker.mgr and worker.ename='FORD';

在這里插入圖片描述

子查詢

子查詢是嵌入到其他sql語句中的select查詢語句,也叫做嵌套查詢。下文對子查詢的多種情況做出介紹↓↓↓

單行子查詢

子查詢語句返回一行記錄的查詢,稱為單行子查詢
示例: 顯示SMITH同一部門的員工
☆思路:要知道與SMITH同部門的員工,就要先知道SMITH位于哪個部門↓↓↓

select deptno from emp where ename='SMITH';

在這里插入圖片描述
由上可知SMITH位于20號部門,下面可以找出20號部門的所有員工↓↓↓

select * from emp where deptno=20;

在這里插入圖片描述
將第一個查詢結果嵌入第二個查詢的where子句中,這就構成嵌套查詢語句↓↓↓

select * from emp where deptno=(select deptno from emp where ename='SMITH');

在這里插入圖片描述

多行子查詢

如果子查詢返回的結果多條記錄,該子查詢稱為多行子查詢。

● in關鍵字:查詢和10號部門的工作崗位相同的雇員的名字、崗位、工資、部門號,但是不包含10號部門員工

select ename, job, sal, deptno from emp where job in (select job from emp where deptno=10) and deptno<>10;

在這里插入圖片描述

●all關鍵字:顯示工資部門30的所有員工的工資都高的員工的姓名、工資和部門號

select ename, sal, deptno from emp where sal > all(select sal from emp where deptno=30);

在這里插入圖片描述
★ps:上述all子句,等同于select max(sal) from emp where depth=30

●any關鍵字:顯示工資比30號部門的任意員工高的員工的姓名、工資和部門號(不包含30號部門的員工)

select ename,sal,deptno from emp where sal > any(select sal from emp where deptno=30) and deptno<>30;

在這里插入圖片描述
★ps:上述any子句,等同于select min(sal) from emp where depth=30

多列子查詢

單行子查詢是指子查詢結果只返回單列、單行數據;多行子查詢是指返回單列多行數據,都是針對單列而言的。而多列子查詢則是指查詢返回多個列數據的子查詢語句。

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

select * from emp where (deptno, job) = (select deptno, job from emp where ename='SMITH') and ename<>'SMITH';

在這里插入圖片描述
★ps:使用多列子查詢,需要保證判斷條件左右兩側列數相同,且列名順序相同。

在from子句中使用子查詢

子查詢語句出現在from子句中,這里可以使用一個數據查詢的技巧,即把子查詢當作一個臨時表使用。

案例1: 顯示每個高于自己部門平均工資的員工的姓名、部門、工資、平均工資
☆思路:要求高于部門平均工資的信息,首先就需要先查詢各個部門的平均工資是多少。

select deptno, avg(sal) from emp group by deptno;

在這里插入圖片描述
☆思路:讓emp表的每條記錄和上述子查詢結果做笛卡兒積,使用where限定每條記錄后面跟的平均工資是該員工所處部門的平均工資

select * from emp, (select deptno, avg(sal) from emp group by deptno) avgtable where emp.deptno = avgtable.deptno;

在這里插入圖片描述
☆思路:最后使用where條件限定當前行中的sal要高于平均工資

select * from emp, (select deptno, avg(sal) as agvsal from emp group by deptno) avgtable where emp.deptno = avgtable.deptno and sal > agvsal;

在這里插入圖片描述

案例2: 查找各個部門工資最高的人的姓名、工資、部門和最高工資
☆思路:首先需要找出各個部門的最高工資

select deptno, max(sal) from emp group by deptno;

在這里插入圖片描述
☆ps:讓emp表和上述子查詢做笛卡兒積,并使用where條件限定只顯示與emp表當前行記錄的部門的平均工資。

select * from emp, (select deptno, max(sal) from emp group by deptno) maxsal where emp.deptno=maxsal.deptno;

在這里插入圖片描述
☆思路:最后只要挑選出等于emp表中sal等于最高工資的行即可。

select * from emp, (select deptno, max(sal) ms from emp group by deptno) maxsal where emp.deptno=maxsal.deptno and sal=ms;

在這里插入圖片描述
案例3: 顯示各個部門的信息(部門名、編號、地址)和人員數量
●方法1:使用多表查詢

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

在這里插入圖片描述
★ps:由于使用group by的查詢語句,只能顯示出現group by中的列字段、聚合函數。故這里將不需要進行排序的deptno.dname,、dept.loc一并放入了group by語句中

●方法2:使用子查詢

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

在這里插入圖片描述

合并查詢

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

●union
該操作符用于取得兩個結果集的并集,它會自動去掉結果集中的重復記錄。

案例: 將工資大于2500或職位為MANAGER的人顯示出來

select * from emp where sal > 2500;
select * from emp where job='MANAGER';
select * from emp where sal > 2500 union select * from emp where job='MANAGER';

在這里插入圖片描述
上述結果與select * from emp where sal>2500 or job='MANAGER';效果相同↓↓↓
在這里插入圖片描述

●union all
該操作符用于取兩個結果集的并集,但它并不會去除重復行↓↓↓

select * from emp where sal > 2500 union all select * from emp where job='MANAGER';

在這里插入圖片描述
★ps:由于union all不會去除重復行,故上面結果中BLAKE、JONES出現了兩次。

🎈歡迎進入半夜學習MySQL專欄,查看更多文章。
如果上述內容有任何問題,歡迎在下方留言區指正b( ̄▽ ̄)d

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

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

相關文章

計算機網絡 -- 序列化與反序列化

一 協議的重要性 我們都知道&#xff0c;在進行網絡通信的過程中&#xff0c;通信的雙方可以是不同的設備&#xff0c;不同的平臺&#xff0c;不同的平臺&#xff0c;比如說&#xff0c;手機用戶和電腦用戶進行通信&#xff0c;ios系統和安卓系統進行通信。 自己的數據&#xf…

抖店商品詳情API接口(店鋪|標題|主圖|價格|SKU屬性等)

抖店商品詳情API接口(店鋪|標題|主圖|價格|SKU屬性等) 抖店商品詳情API接口是指通過調用抖音開放平臺提供的接口&#xff0c;獲取抖店上商品的詳細信息的方法。 抖店開放平臺提供了一系列的接口&#xff0c;可以用于獲取商品的基本信息、價格、庫存、銷量、評價等各種信息。以…

UIKit之圖片瀏覽器

功能需求 實現一個圖片瀏覽器&#xff0c;點擊左右按鈕可以切換背景圖&#xff0c;且更新背景圖對應的索引頁和圖片描述內容。 分析&#xff1a; 實現一個UIView的子類即可&#xff0c;該子類包含多個按鈕。 實現步驟&#xff1a; 使用OC語言&#xff0c;故創建cocoa Touch類…

數據庫的存儲過程、函數與觸發器

使用下面的場景來引入 1.創建表 CREATE DATABASE staff; USE staff; CREATE TABLE employee(id INT NOT NULL AUTO_INCREMENT,userName VARCHAR(255),birthDate DATE,idCard VARCHAR(255),loginName VARCHAR(255),PASSWORD VARCHAR(255),mobile VARCHAR(255),email VARCHAR(2…

開源連鎖收銀系統哪個好

針對開源連鎖收銀系統的選擇&#xff0c;商淘云是一個備受關注的候選。商淘云以其功能豐富、易于定制和穩定性等優勢&#xff0c;吸引了眾多企業和開發者的關注。下面將從四個方面探討商淘云開源連鎖收銀系統的優勢&#xff1a; 首先&#xff0c;商淘云提供了豐富的功能模塊。作…

如何查看SNMP設備的OID

什么是OID和MIB OID OID 代表對象標識符。 OID 唯一地標識 MIB 層次結構中的托管對象。 這可以被描述為一棵樹&#xff0c;其級別由不同的組織分配。MIB MIB&#xff08;管理信息基&#xff09;提供數字化OID到可讀文本的映射。 使用MIB Browser掃描OID 我的設備是一臺UPS SN…

【Uniapp小程序】onShareAppMessage異步處理請求完后再分享

分享按鈕 <button type"primary" open-type"share">保存并分享 </button>修改onShareAppMessage saveImage為promise方法 async onShareAppMessage() {const saveRes await saveImage();if (saveRes.code 200) {return {title: "tit…

每日兩題 / 236. 二叉樹的最近公共祖先 124. 二叉樹中的最大路徑和(LeetCode熱題100)

236. 二叉樹的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; dfs統計根節點到p&#xff0c;q節點的路徑&#xff0c;兩條路徑中最后一個相同節點就是公共祖先 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

windows部署騰訊tmagic-editor02-Runtime

創建editor項目 將上一教程中的hello-world復制過來&#xff0c;改名hello-editor 創建runtime項目 和hello-editor同級 pnpm create vite刪除src/components/HelloWorld.vue 按鈕需要用的ts types依賴 pnpm add tmagic/schema tmagic/stage實現runtime 將hello-editor中…

【C語言】5.C語言函數(2)

文章目錄 7.嵌套調?和鏈式訪問7.1 嵌套調?7.2 鏈式訪問 8.函數的聲明和定義8.1 單個?件8.2 多個?件8.3 static 和 extern8.3.1 static 修飾局部變量8.3.2 static 修飾全局變量8.3.3 static 修飾函數 7.嵌套調?和鏈式訪問 7.1 嵌套調? 嵌套調用就是函數之間的互相調用。…

Docker安裝Mosquitto

在物聯網項目中&#xff0c;我們經常用到MQTT協議&#xff0c;用MQTT協議做交互就需要部署一個MQTT服務&#xff0c;而mosquitto是一個常用的MQTT應用服務&#xff0c; Mosquitto是一個實現了消息推送協議MQTT v3.1的開源消息代理軟件。MQTT&#xff08;Message Queuing Teleme…

python的幾個關于文本文件的demo腳本

部分來自WeTab AI PRO 1.在文末添加一行文字 def add_endline(filename, texts): # 文本末尾增加一行with open(filename, a) as file:file.write(f\n{texts})file.close() 當使用 open() 函數打開文件時&#xff0c;第二個參數指定了文件的打開模式。常見的文件打開模式包…

【LeetCode】每日一題 2024_5_14 完成所有任務需要的最少輪數(哈希)

文章目錄 LeetCode&#xff1f;啟動&#xff01;&#xff01;&#xff01;題目&#xff1a;完成所有任務需要的最少輪數題目描述代碼與解題思路 每天進步一點點 LeetCode&#xff1f;啟動&#xff01;&#xff01;&#xff01; 題目&#xff1a;完成所有任務需要的最少輪數 題…

拿到測試點如何跑

首先你要知道你測試點文件的位置,然后你要創建一個接收結果的文件,將你代碼中的std::cin替換成infile,std::cout替換成outfile即可 #include <fstream> int main() {// 打開輸入文件std::ifstream infile("C:\\Users\\Downloads\\P4779_1.in");// 打開輸出文件…

OpenCV 圖像退化與增強

退化 濾波 img_averagingcv2.blur(img2,(3,3)) #均值濾波 img_median cv2.medianBlur(img2,3) #中值濾波高斯模糊 result cv2.GaussianBlur(source, (11,11), 0)高斯噪聲 def add_noise_Guass(img, mean0, var0.01): # 添加高斯噪聲img np.array(img / 255, dtypefloat…

麒麟 V10 安裝docker2

1. 查看系統版本 2.安裝docker-ce 添加源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安裝docker yum install docker-ce --allowerasing 重啟docker systemctl start docker 3.安裝nvidia-container-runtime 添…

el-tooltip 提示框樣式修改?

【element-plus el-tooltip官網地址&#xff1a; Tooltip 文字提示 | Element Plus】 <el-tooltippopper-class"Tooltip":content"content"placement"top"effect"light" ><span class"content">{{ content }}&l…

【TypeScript的JSX簡介以及使用方法】

TypeScript 是 JavaScript 的一個超集&#xff0c;它添加了靜態類型檢查和面向對象編程的特性。JSX 是一種 JavaScript 的語法擴展&#xff0c;主要用于 React 組件的聲明性渲染。TypeScript 完美地支持 JSX&#xff0c;并允許你為 React 組件和它們的 props 添加類型注解。 T…

C中Mysql的基本api接口

一、初始化參數返回值 二、鏈接服務器三、執行SQL語句注意事項 四、獲取結果集4.1mysql_affected_rows和mysql_num_rows4.2mysql_store_result與mysql_free_result注意事項注意事項整體的工作流程 4.3mysql_use_result&#xff08;&#xff09;4.4mysql_field_count&#xff08…

001 側邊欄 地址增刪改查 默認地址代碼沒完善

文章目錄 user_index.htmlmyaccount_style.cssmyaccount_scripts.jsaddress_edit.htmlReceiverAddressReceiverAddressControllerReceiverAddressServiceImplIReceiverAddressServiceRFshopAppApplicationServletInitializerpom.xmlReceiverAddressMapper.xmlReceiverAddressMa…