【MySQL】復合查詢與內外連接

目錄

一、復合查詢

1、基本查詢回顧:

2、多表查詢:

3、自連接:

4、子查詢:

單列子查詢

多行子查詢:

多列子查詢:

在from語句中使用子查詢:

5、合并查詢:

union:

union all:

二、內外連接:

1、內連接:

2、外連接:

左外連接:

右外連接:


這里依然是使用經典數據表:員工表(emp)、部門表(dept)和工資等級表(salgrade)

如下是員工表,分別是empno員工號/ename員工姓名/job工作/mgr上級編號/hiredate受雇日期/sal薪金/comm傭金/deptno所屬部門編號

如下是部門表,分別是deptno部門編號,dname部門名稱,loc部門所在地

如下是薪資等級:

一、復合查詢

1、基本查詢回顧:

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

select * from emp where (sal>500 or job='MANAGER') and ename like 'J%';

除了用模糊匹配,還有字符串切割也可以

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

查詢員工信息,按部門號升序而員工工資降序顯示

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

查詢員工信息,按年薪降序顯示

select * from emp order by 12*sal+ifnull(comm,0) desc;

員工的年薪為月工資*12+年終獎,但是這里不能夠直接12*sal+comm,因為comm可能為NULL,此時如果用NULL運算就會使結果為空

所以需要使用函數ifnull,如果comm為NULL就將其設置為0

查詢工資最高的員工的姓名和崗位

首先查看工資最高是誰,這里使用聚合函數:

select max(sal) from emp;

當查詢到最高工資的人后,可以將這個結果放到where語句中作為判斷條件,也就是說where語句中可以進行查詢:

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

查詢工資高于平均工資的員工信息

首先依然是查詢員工的平均工資:

select avg(sal) from emp;

接著將這個語句嵌套在where中作為判斷:

select * from emp where sal>(select avg(sal) from emp);

查詢每個部門的平均工資和最高工資

既然是每個部門,就需要進行分組

select deptno,avg(sal) 平均工資,max(sal) 最高工資 from emp group by deptno;

查詢平均工資低于2000的部門號和它的平均工資

select deptno,avg(sal) 平均工資 from emp group by deptno having avg(sal)<2000;

這里因為是進行分組查詢,不能使用where,需要使用having來進行條件判斷

查詢每種崗位的雇員總數和平均工資

人數用count()函數進行統計

select job,count(*) 人數,avg(sal) 平均工資 from emp group by job;

2、多表查詢:

在上述基本查詢中,都是在單表中進行查詢的,但是在實際開發中,更多的是多個表綜合起來進行查詢的,這就叫做多表查詢

笛卡爾積:
在進行多表查詢的時候,將多個表名放在from后面并用逗號隔開,這是,MySQL就會對這些表取笛卡爾積,組成一張新表

進行笛卡爾積轉化后:

笛卡爾積的本質是拿著第一張表的信息 依次 和第二張表的所有信息進行組合,這樣形成地一張表

多表查詢的本質:對給的多張表取笛卡爾積,然后對笛卡爾積后的表進行查詢

在進行笛卡爾積的多張表中可能會存在相同的列名,這時在選中列名時需要通過(表名.列明)的方式進行指明

顯示雇員名,雇員工資以及所在部門的名字

這里雇員名和雇員工資是在同一張表中的,但是所在部門名字是在另一張表中的,所以需要對這兩張表進行笛卡爾積,然后在進行查詢即可

通過上述圖片可以看到,比如Smith他的部門號有兩個,這里是取相等的,其他的就是沒有意義的數據,所以需要進行初步篩選:

select * from emp,dept where emp.deptno=dept.deptno;

最后在將*修改為所需即可

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

顯示部門號為10的部門名、員工名和員工工資

這里部門名和其他是在不同的表中的

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

顯示各個員工的姓名、工資和工資級別

這里工資級別和其他是不同的表中:

需要where增加的條件是工資處于最低和最高之間工資篩選出來,才有意義

3、自連接:

自連接是在同一張表進行連接查詢,也就是說對同一張表進行取笛卡爾積,

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

子查詢解決:

首先找到FORD的上級領導的編號,

select mgr from emp where ename='FORD';

接著通過嵌套找到對應編號的姓名

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

自連接解決:

員工表中的mgr字段能夠將表中員工的信息和員工領導的信息關聯起來

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

這里是對同一張表進行取笛卡爾積的,所以需要對其取別名來區別開來

4、子查詢:

子查詢是指嵌入在其他sql語句中的select語句,也叫嵌套查詢

子查詢可分為單行子查詢,多行子查詢,多列子查詢,以及在from子句中使用的子查詢

單列子查詢

顯示SMITH同一部門的員工

首先顯示SMITH的部門

select deptno from emp where ename='SMITH';

接著將這個語句嵌套在where判斷中,作為嵌套的子語句,再來查詢對應的員工

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

多行子查詢:

回多行單列數據的子查詢

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

首先查詢10號部門的工作崗位,這里要進行去重,因為可能不同的人在同一個部門有著相同的工作崗位

這里查出來和之前不同的是這里查詢的是單列多行的,只要崗位和這里面一個相同就可以,用in關鍵字

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

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

先查詢30號部門的所有員工的工資,因為工資可能相等,所以這里最好去重

接著在進行嵌套,為了保證所查出來的工資比30號部門的所有員工的工資高,這里使用all關鍵字

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

首先查詢30號部門的員工的工資:

select distinct sal from emp where deptno=30;

接著通過關鍵字any進行員工的查看:

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

多列子查詢:

這是返回多列多行的查詢

顯示和SMITH的部門和崗位完全相同的員工,不包含SMITH本人

首先顯示SMITH的部門和崗位:

select deptno,job from emp where ename='SMITH';

接著通過復合查詢,將上述的查詢放在where后面作為子查詢

這里是采用的多列查詢,所以在where后面匹配的時候通過括號進行多列匹配,并且在后面記得保證名字不能為SMITH

也就是說,多列子查詢在where匹配的時候要用括號將多列數據進行比較,并且如果數據是多行的,也可以使用in,all,any關鍵字

在from語句中使用子查詢:

我們知道from后面跟著的是表,在MySQL下一切皆表,所以可以將一個查詢結果當做臨時表,放在from語句的后面

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

首先查詢每一個部門其自己的平均工資:

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

接著將如上表和員工表取笛卡爾積,然后再通過部門號相等刪除部分無效數據,最后where篩選出高于自己部門平均工資的員工的數據

mysql> select ename,emp.deptno,sal,平均工資-> from emp,(select deptno,avg(sal) 平均工資 from emp group by deptno) newtable-> where emp.deptno=newtable.deptno and sal>平均工資;

注意:在from子句的查詢中,必須給子查詢所生成的臨時表取一個別名,否則查詢結果會出錯找不到對應的字段,并且如果兩張表中有相同的字段,要指定其是在哪張表的,否則也會報錯

顯示每個部門工資最高的員工的姓名、工資、部門和部門的最高工資

首先查詢每個部門的最高工資的員工:

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

接著將上述表和員工表進行笛卡爾積,在進行篩選即可

mysql> select ename,sal,emp.deptno,最高工資-> from emp,(select deptno,max(sal) 最高工資 from emp group by deptno) newtable-> where emp.deptno=newtable.deptno and sal=最高工資;

5、合并查詢:

為了合并多個select查詢結果,可以通過操作符union和union all進行合并查詢

union:

用于取得兩個查詢結果的并集,union會自動去掉結果集中的重復行

顯示工資大于2500或職位是MANAGER的員工

首先查詢工資大于2500員工:

select * from emp where sal>2500;

接著查詢職位是MANAGER的員工:

select * from emp where job='MANAGER';

為了完成上述,可以使用or關鍵字:

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

或者使用union關鍵字:

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

union all:

該操作符用于取得兩個結果集的并集,與union不同的是,這個不會對結果進行去重:

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

注意:待合并的兩個查詢結果的列的數量必須一致,否則無法合并

二、內外連接:

表的連接分為內連接和外連接

1、內連接:

內連接實際上就是利用where子句對兩種表形成的笛卡兒積進行篩選,我們前面學習的查詢都是內連接,也是在開發過程中使用的最多的連接查詢

語法:

select 字段 from 表1 inner join 表2 on 連接條件 and 其他條件;
顯示 SMITH 的名字和部門名稱

其實完成上述查詢可以不使用內連接,用以前學習的已經夠了,只是內連接能夠讓我們的查詢邏輯更清楚

在上述的查詢中,我們可以使用以前學習的笛卡爾積

select emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno and emp.ename='SMITH';

除了笛卡爾積這種寫的方式,我們還可以用內連接的寫法:

select ename,dname from emp inner join dept on emp.deptno=dept.deptno and ename='SMITH';

2、外連接:

左外連接:

如果想讓左側的表完全顯示,右側的表如果和左側的表沒有匹配的就去掉,就使用左外連接,其語法和內連接一模一樣只是將inner這個關鍵字修改為left

select 字段 from 表1 left join 表2 on 連接條件 and 其他條件;

示例:

首先創建一個測試表:

查詢所有學生的成績,如果這個學生沒有成績,也要將學生的個人信息顯示出來
select * from stu left join exam on stu.id=exam.id;

盡管在exam這個右側表中,沒有王五趙六的成績信息,但是他們仍然被顯示出來了,左連接更偏向于左邊的表

右外連接:

右外連接和左外連接就是相反的了,比如上述要求我們改為:

查詢所有成績,如果這個成績沒有對應的學生,也要將這個成績顯示出來

select * from stu right join exam on stu.id=exam.id;

但事實上,左外連接和右外連接是可以相互轉換的

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

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

相關文章

后端工程師需要掌握哪些基礎技能

后端工程師是構建系統核心邏輯的關鍵角色&#xff0c;需要掌握從基礎到進階的完整技術棧。以下是結合國內實際開發需求的技能樹整理&#xff0c;附帶學習建議&#xff1a; 一、編程語言&#xff08;至少精通1-2種&#xff09; # 國內主流選擇&#xff08;按優先級排序&#x…

萬字重談C++——繼承篇

繼承的概念及定義 繼承的概念 繼承&#xff08;Inheritance&#xff09;機制作為面向對象程序設計中最核心的代碼復用方式&#xff0c;它不僅允許開發人員在保留基礎類特性的前提下進行功能擴展&#xff08;從而創建新的派生類&#xff09;&#xff0c;更重要的是體現了面向對…

移動光貓 UNG853H 獲取超級管理員賬號密碼

注&#xff1a;電腦連接光貓&#xff0c;網線不要接2口&#xff08;2口一般是IPTV網口&#xff09; 首先瀏覽器打開 192.168.1.1&#xff0c;使用光貓背面的用戶名密碼登錄。&#xff08;user用戶名&#xff09; 然后在瀏覽器中另開一個窗口打開以下地址&#xff1a; http://…

ActiveMQ 可靠性保障:消息確認與重發機制(二)

ActiveMQ 重發機制 重發機制的原理與觸發條件 ActiveMQ 的重發機制是確保消息可靠傳輸的重要手段。當消息發送到 ActiveMQ 服務器后&#xff0c;如果消費者由于某些原因未能成功處理消息&#xff0c;ActiveMQ 會依據配置的重發策略&#xff0c;將消息重新放入隊列或主題中&am…

oceanbase設置密碼

docker run -p 2881:2881 --name oceanbase-ce -e MODEmini -d oceanbase/oceanbase-ce:4.2.1.10-110010012025041414 先進入鏡像再連接數據庫的方式 進入鏡像 docker exec -it oceanbase-ce bash 修改數據庫密碼 ALTER USER ‘root’ IDENTIFIED BY ‘123456’; 無密碼 obc…

使用Python和Pandas實現的Azure Synapse Dedicated SQL pool權限檢查與SQL生成用于IT審計

下面是使用 Python Pandas 來提取和展示 Azure Synapse Dedicated SQL Pool 中權限信息的完整過程&#xff0c;同時將其功能以自然語言描述&#xff0c;并自動構造所有權限設置的 SQL 語句&#xff1a; ? 步驟 1&#xff1a;從數據庫讀取權限信息 我們從數據庫中提取與用戶、…

tiktok web X-Bogus X-Gnarly 分析

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向過程 部分python代碼 import req…

目標文件的段結構及核心組件詳解

目標文件&#xff08;如 .o 或 .obj&#xff09;是編譯器生成的中間文件&#xff0c;其結構遵循 ELF&#xff08;Linux&#xff09;或 COFF&#xff08;Windows&#xff09;格式。以下是其核心段&#xff08;Section&#xff09;和關鍵機制的詳細解析&#xff1a; 1. 目標文件的…

【軟件設計師:復習】上午題核心知識點總結(一)

一、數據結構與算法(高頻) 1. 線性數據結構 數組與鏈表 數組:隨機訪問(O(1))、插入/刪除(O(n))、內存連續。鏈表:單向鏈表、雙向鏈表、循環鏈表;插入/刪除(O(1))、隨機訪問(O(n))。典型問題: 合并兩個有序鏈表(LeetCode 21)。鏈表反轉(迭代/遞歸實現)。棧與…

【ROS2】 核心概念2——功能包package

官方英文文檔&#xff1a;Creating a package — ROS 2 Documentation: Humble documentation 中文參考&#xff1a;古月ROS2 功能包講解 - 圖書資源 省流&#xff0c;就學習一個命令 ros2 pkg create --build-type <build-type> <package_name> ROS2的重要概念…

Java內存對象實現聚合查詢

文章目錄 什么是聚合查詢excel表格演示插入透視表透視表操作 sql聚合查詢創建表和插入數據按照國家業務類型設備類型統計總銷量按設備類型統計總銷量 Java內存對象聚合查詢普通對象方式創建對象聚合查詢條件查詢方法調用方式結果 Record對象方式Recor對象創建對象聚合查詢條件查…

VSCode開發調試Python入門實踐(Windows10)

我的Windows10上的python環境是免安裝直接解壓的Python3.8.x老版本&#xff0c;可參見《Windows下Python3.8環境快速安裝部署。 1. 安裝VSCode 在Windows 10系統上安裝Visual Studio Code&#xff08;VS Code&#xff09;是一個簡單的過程&#xff0c;以下是詳細的安裝方法與…

Tomcat DOS漏洞復現(CVE-2025-31650)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 前…

使用Qt QAxObject解決Visual Fox Pro數據庫亂碼問題

文章目錄 使用Qt QAxObject解決Visual Fox Pro數據庫亂碼問題一、問題背景&#xff1a;ODBC讀取DBF文件的編碼困境二、核心方案&#xff1a;通過QAxObject調用ADO操作DBF1. 技術選型&#xff1a;為什么選擇ADO&#xff1f;2. 核心代碼解析&#xff1a;QueryDataByAdodb函數3. 連…

HTTP知識速通

一.HTTP的基礎概念 首先了解HTTP協議&#xff0c;他是目前主要使用在應用層的一種協議 http被稱為超文本傳輸協議 而https則是安全的超文本傳輸協議 本章節的內容首先就是對http做一個簡單的了解。 HTTP是一種應用層協議&#xff0c;是基于TCP/IP協議來傳遞信息的。 其中…

制作一款打飛機游戲26:精靈編輯器

雖然我們基本上已經重建了Axel編輯器&#xff0c;但我不想直接使用它。我想創建一個真正適合我們當前目的的編輯器&#xff0c;那就是編輯精靈&#xff08;sprites&#xff09;。這將是今天的一個大目標——創建一個基于模板的編輯器&#xff0c;用它作為我們實際編輯器的起點。…

mac下載homebrew 安裝和使用git

mac下載homebrew 安裝和使用git 本人最近從windows換成mac&#xff0c;記錄一下用homebrew安裝git的過程 打開終端 command 空格&#xff0c;搜索終端 安裝homebrew 在終端中輸入下面命令&#xff0c;來安裝homebrew /bin/bash -c "$(curl -fsSL https://raw.githu…

【LeetCode Hot100】圖論篇

前言 本文用于整理LeetCode Hot100中題目解答&#xff0c;因題目比較簡單且更多是為了面試快速寫出正確思路&#xff0c;只做簡單題意解讀和一句話題解方便記憶。但代碼會全部給出&#xff0c;方便大家整理代碼思路。 200. 島嶼數量 一句話題意 求所有上下左右的‘1’的連通塊…

《社交類應用開發:React Native與Flutter的抉擇》

社交類應用以令人目不暇接的速度更新迭代。新功能不斷涌現&#xff0c;從更智能的算法推薦到多樣化的互動形式&#xff0c;從增強的隱私保護到跨平臺的無縫體驗&#xff0c;每一次更新都旨在滿足用戶日益增長且多變的需求。面對如此高頻的更新需求&#xff0c;選擇合適的跨端框…

關于3D的一些基礎知識

什么是2D/3D? 2D&#xff08;二維&#xff09;和3D&#xff08;三維&#xff09;是描述空間維度的概念&#xff0c;它們的核心區別在于空間維度、視覺表現和應用場景。以下是詳細對比&#xff1a; 1. 定義與維度 ? 2D&#xff08;二維&#xff09; ? 定義&#xff1a;僅包…