MySQL——7、復合查詢和表的內外連接

復合查詢和表的內外連接

  • 1、基本查詢回顧
  • 2、多表查詢
  • 3、自連接
  • 4、子查詢
    • 4.1、單行子查詢
    • 4.2、多行子查詢
    • 4.3、多列子查詢
    • 4.4、在from子句中使用子查詢
    • 4.5、合并查詢
  • 5、表的內連和外連
    • 5.1、內連接
    • 5.2、外連接
      • 5.2.1、左外連接
      • 5.2.2、右外連接

1、基本查詢回顧

1.1、查詢工資高于500或崗位為MANAGER的雇員,同時還要滿足他們的姓名首字母為大寫的J
在這里插入圖片描述

1.2、按照部門號升序而雇員的工資降序排序
在這里插入圖片描述

1.3、使用年薪進行降序排序
在這里插入圖片描述

1.4、顯示工資最高的員工的名字和工作崗位
在這里插入圖片描述
我們把select聚合統計出來的最高薪資作為另一個select的子句。

1.5、顯示工資高于平均工資的員工信息
在這里插入圖片描述

1.6、顯示每個部門的平均工資和最高工資
在這里插入圖片描述

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

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


2、多表查詢

實際開發中往往數據來自不同的表,所以需要多表查詢。本節我們用一個簡單的公司管理系統,有三張表EMP、DEPT、SALGRADE來演示如何進行多表查詢。

2.1、顯示雇員名、雇員工資以及所在部門的名字。因為上面的數據來自EMP和DEPT表,因此要聯合查詢。
在這里插入圖片描述
首先我們來看在from后面跟兩個表名emp和dept獲取的結果是怎么得到的。
我們可以發現是拿著emp的第一行跟dept的每一行進行組合,接著再拿emp的第二行給dept的每一行進行組合,以此類推。也就是將數據進行窮舉組合,我們稱之為笛卡爾積。
這就是將兩張表組合成一張表,所以本質上還是單表查詢。

在這里插入圖片描述
由于會進行笛卡爾積組合,但是如果部門編號不同的組合就沒有意義,所以加上where子句讓它們兩張表中的部門編號相等。最后我們只需要獲取雇員姓名、雇員薪資、部門名稱即可,如果有沖突需要在前面加上表明.的方式獲取,沒有直接寫屬性名即可。

2.2、顯示部門號為10的部門名,員工名和工資。
在這里插入圖片描述

2.3、顯示各個員工的姓名,工資,及工資級別。
在這里插入圖片描述


3、自連接

自連接是指在同一張表連接查詢。
在這里插入圖片描述
直接對兩張同樣的表做笛卡爾積是不行的,需要進行重命名否則無法辨認。同時可以發現兩張表的組合跟上面不同表的組合一樣。并且注意到,這里是后面的表和前面的表進行組合的,在老版本MySQL中是前面的表和后面的表進行組合。

3.1、顯示員工FORD的上級領導的編號和姓名(mgr是員工領導的編號–empno)
有兩種做法,第一種做法使用子查詢:
在這里插入圖片描述
第二種做法,使用多表查詢:
在這里插入圖片描述
雖然根據上面查詢結果我們發現組合方式發生了變化,但是只要SQL語句是正確的,照樣可以返回結果。


4、子查詢

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

4.1、單行子查詢

單行子查詢:返回一行記錄的子查詢。
如:顯示SMITH同一部門的員工

在這里插入圖片描述

4.2、多行子查詢

多行子查詢:返回一行記錄的子查詢。

4.2.1、in關鍵字;查詢和10號部門的工作崗位相同的雇員的名字,崗位,工資,部門號,但是不包含10自己的。
在這里插入圖片描述
使用in來判斷,job是否在返回的多行子查詢中。
如果我們還需要知道部門的名字呢?

在這里插入圖片描述
MySQL一切皆表,我們上面的查詢結果也是一個表結構,我們把上面的查詢結果另一個查詢的表,并與表dept進行笛卡爾積。
子查詢不僅可以出現在where子句中,還可以出現在from后面。

4.2.2、all關鍵字;顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號。
可以查詢部門30最高工資是多少,然后將其結果作為另一個查詢的子查詢:
在這里插入圖片描述
也可以使用下面這種做法:
在這里插入圖片描述
all在這里表示,sal要大于子查詢結果里的所有sal。

4.2.3、any關鍵字;顯示工資比部門30的任意員工的工資高的員工的姓名、工資和部門號(包含自己部門的員工)
在這里插入圖片描述

4.3、多列子查詢

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

案例:查詢和SMITH的部門和崗位完全相同的所有雇員,不含SMITH本人。
在這里插入圖片描述

4.4、在from子句中使用子查詢

4.4.1、顯示每個高于自己部門平均工資的員工的姓名、部門、工資、平均工資
在這里插入圖片描述
首先分組聚合計算出每個部門的平均薪資,然后讓emp和該表進行笛卡爾積。

拓展:我要的是這些人辦公地點在哪里
在這里插入圖片描述

4.4.2、查找每個部門工資最高的人的姓名、工資、部門、最高工資
思路:先分組聚合統計出每個部門最高薪資,然后將該表和emp表進行笛卡爾積,篩選出部門相等和薪資相等的信息,最后需要什么數據拿什么數據即可。
在這里插入圖片描述

4.4.3、顯示每個部門的信息(部門名,編號,地址)和人員數量
多表查詢,首先根據部門號聚合統計出每個部門的人數,然后將臨時表和dept表做笛卡爾積,篩選條件為部門編號相等,然后將需要的信息拿出來即可。
在這里插入圖片描述

另一種做法,不推薦!
在這里插入圖片描述
解決多表問題的本質:想辦法將多表轉換成單表,MySQL中所有select的問題都可以轉換成單表問題。

4.5、合并查詢

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

4.5.1、union該操作符用于取得兩個結果集的并集。當使用該操作符時,會自動去掉結果集中的重復行。
案例:將工資大于2500或職位是MANAGER的人找出來。

在這里插入圖片描述

4.5.2、union all該操作符用于取得兩個結果集的并集。當使用該操作符時,不會去掉結果集中的重復行。
案例:將工資大于2500或職位是MANAGER的人找出來。

在這里插入圖片描述

注意:使用union/union all必須保證兩個查詢的列數是相同的。
在這里插入圖片描述


5、表的內連和外連

5.1、內連接

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

在這里插入圖片描述
案例:顯示SMITH的名字和部門名稱。
采用之前的寫法:
在這里插入圖片描述
采用上面的語法:
在這里插入圖片描述

5.2、外連接

外連接分為左外連接和右外連接。

5.2.1、左外連接

如果聯合查詢,左側的表完全顯示我們就說是左外連接。
在這里插入圖片描述

首先創建兩張表方便我們進行測試:

-- 建兩張表
create table stu (id int, name varchar(30)); -- 學生表
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
create table exam (id int, grade int); -- 成績表
insert into exam values(1, 56),(2,76),(11, 8);

查詢所有學生的成績,如果這個學生沒有成績,也要將學生的個人信息顯示出來。
在這里插入圖片描述
如圖,左側全部顯示,右側如果沒有匹配的就會補NULL。

5.2.2、右外連接

如果聯合查詢,右側的表完全顯示我們就說是右外連接。
在這里插入圖片描述
對stu表和exam表聯合查詢,把所有的成績都顯示出來,即使這個成績沒有學生與它對應,也要顯示出來
在這里插入圖片描述

列出部門名稱和這些部門的員工信息,同時列出沒有員工的部門。
在這里插入圖片描述

或者采用右外連接:
在這里插入圖片描述

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

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

相關文章

MYSQL故障排查和環境優化

一、MySQL故障排查 1. 單實例常見故障 (1)連接失敗類問題 ERROR 2002 (HY000): Cant connect to MySQL server 原因:MySQL未啟動或端口被防火墻攔截。 解決:啟動MySQL服務(systemctl start mysqld)或開放…

7GB顯存如何部署bf16精度的DeepSeek-R1 70B大模型?

構建RAG混合開發---PythonAIJavaEEVue.js前端的實踐-CSDN博客 服務容錯治理框架resilience4j&sentinel基礎應用---微服務的限流/熔斷/降級解決方案-CSDN博客 conda管理python環境-CSDN博客 快速搭建對象存儲服務 - Minio,并解決臨時地址暴露ip、短鏈接請求改…

數字圖像處理——圖像壓縮

背景 圖像壓縮是一種減少圖像文件大小的技術,旨在在保持視覺質量的同時降低存儲和傳輸成本。隨著數字圖像的廣泛應用,圖像壓縮在多個領域如互聯網、移動通信、醫學影像和衛星圖像處理中變得至關重要。 技術總覽 當下圖像壓縮JPEG幾乎一統天下&#xff…

抖音視頻怎么去掉抖音號水印

你是不是經常遇到這樣的煩惱?看到喜歡的抖音視頻,想保存下來分享給朋友或二次創作,卻被抖音號水印擋住了畫面?別著急,今天教你幾種超簡單的方法,輕松去除水印,高清無水印視頻一鍵保存&#xff0…

RISC-V 開發板 MUSE Pi Pro PCIE 測試以及 fio 崩潰問題解決

視頻講解: RISC-V 開發板 MUSE Pi Pro PCIE 測試以及 fio 崩潰問題解決 板子上有一個m.2的pcie插槽,k1有三個pcie控制器,pcie0和usb3復用一個phy,所以實際開發板就兩個,測試的話,上一個nvme硬盤&#xff0c…

超級管理員租戶資源初始化與授權管理設計方案

背景說明 在多租戶系統中,資源(如功能模塊、系統菜單、服務能力等)需按租戶維度進行授權管理。超級管理員在創建新租戶時,需要初始化該租戶的資源授權信息。 兩種可選方案 方案描述方案 A:前端傳入選中的資源列表創…

stm32week16

stm32學習 十一.中斷 4.使用中斷 EXTI的配置步驟: 使能GPIO時鐘設置GPIO輸入模式使能AFIO/SYSCFG時鐘設置EXTI和IO對應關系設置EXTI屏蔽,上/下沿設置NVIC設計中斷服務函數 HAL庫的使用: 使能GPIO時鐘:__HAL_RCC_GPIOx_CLK_EN…

什么是RDMA?

什么是RDMA? RDMA(RemoteDirect Memory Access)技術全稱遠程直接內存訪問,就是為了解決網絡傳輸中服務器端數據處理的延遲而產生的。它將數據直接從一臺計算機的內存傳輸到另一臺計算機,無需雙方操作系統的介入。這允許高吞吐、低延遲的網絡…

golang 安裝gin包、創建路由基本總結

文章目錄 一、安裝gin包和熱加載包二、路由簡單場景總結 一、安裝gin包和熱加載包 首先終端新建一個main.go然后go mod init ‘項目名稱’執行以下命令 安裝gin包 go get -u github.com/gin-gonic/gin終端安裝熱加載包 go get github.com/pilu/fresh終端輸入fresh 運行 &…

【數據結構篇】鏈式結構二叉樹

目錄: 一 二叉鏈的概念與結構: 1.1 概念: 1.2 結構: 二 二叉鏈的實現: 2.1 二叉樹的構建: 2.2 二叉樹的遍歷: 2.2.1 前序遍歷: 2.2.2 中序遍歷: 2.2.3 后序遍歷…

【MySQL】02.數據庫基礎

1. 數據庫的引入 之前存儲數據用文件就可以了,為什么還要弄個數據庫? 文件存儲存在安全性問題,文件不利于數據查詢和管理,文件不利于存儲海量數據,文件在程序中控制不方便。而為了解決上述問題,專家們設計出更加利于…

什么是 Langchain 以及其核心組件

LangChain 官方文檔:LangChain 一、什么是Langchain LangChain 是一個用于構建基于LLM的應用框架,它提供了對 LLM API 的封裝和擴展,使開發者能夠更方便地構建復雜的應用。 個人理解:用類比的方法來說,LangChain類似…

博客系統功能測試

博客系統網址:http://8.137.19.140:9090/blog_list.html 主要測試內容 功能測試、界面測試、性能測試、易用性測試、安全測試、兼容性測試、弱網測試、安裝卸載測試、壓力測試… 測試方法及目的 利用selenium和python編寫測試腳本,對博客系統進行的相關…

項目制作流程

一、使用 CRA 創建項目 npx create-react-app name 二、按照業務規范整理項目目錄 (重點src目錄) 三、安裝插件 npm install sass -Dnpm install antd --savenpm install react-router-dom 四、配置基礎路由 Router 1. 安裝路由包 react-router-dom …

ngx_http_random_index_module 模塊概述

一、使用場景 隨機內容分發 當同一目錄下存放多份等價內容(如多張輪播圖、不同版本靜態頁面等)時,可通過隨機索引實現負載均衡或流量分散。A/B 測試 通過目錄請求自動隨機分配用戶到不同測試組,無需后端邏輯參與。動態“首頁”選…

智能權限守護者:基于Python描述符的動態角色控制實現

智能權限守護者:基于Python描述符的動態角色控制實現 引言:當描述符遇見權限管理 在Python的魔法方法體系中,描述符(Descriptor)以其優雅的屬性訪問控制機制著稱。當我們將描述符與RBAC(基于角色的訪問控制)模型結合,就能創造出既靈活又安全的動態權限管理系統。本文…

Linux 的 UDP 網絡編程 -- 回顯服務器,翻譯服務器

目錄 1. 回顯服務器 -- echo server 1.1 相關函數介紹 1.1.1 socket() 1.1.2 bind() 1.1.3 recvfrom() 1.1.4 sendto() 1.1.5 inet_ntoa() 1.1.6 inet_addr() 1.2 Udp 服務端的封裝 -- UdpServer.hpp 1.3 服務端代碼 -- UdpServer.cc 1.4 客戶端代碼 -- UdpClient.…

Linux 內核等待機制詳解:prepare_to_wait_exclusive 與 TASK_INTERRUPTIBLE

1. prepare_to_wait_exclusive 函數解析 1.1 核心作用 prepare_to_wait_exclusive 是 Linux 內核中用于將進程以獨占方式加入等待隊列的關鍵函數,其主要功能包括: 標記獨占等待:通過設置 WQ_FLAG_EXCLUSIVE 標志,表明此等待條目是獨占的。 安全入隊:在自旋鎖保護下,將條…

【Android構建系統】了解Soong構建系統

背景介紹 在Android7.0之前,Android使用GNU Make描述和執行build規則。Android7.0引入了Soong構建系統,彌補Make構建系統在Android層面變慢、容易出錯、無法擴展且難以測試等缺點。 Soong利用Kati GNU Make克隆工具和Ninja構建系統組件來加速Android的…

信息學奧賽一本通 1539:簡單題 | 洛谷 P5057 [CQOI2006] 簡單題

【題目鏈接】 ybt 1539:簡單題 洛谷 P5057 [CQOI2006] 簡單題 【題目考點】 1. 樹狀數組 模板題及講解:洛谷 P3374 【模板】樹狀數組 【解題思路】 解法1:樹狀數組 該有01構成數組初值都為0。 某位置的元素被修改奇數次后值為1&#x…