Linux下學【MySQL】中如何實現:多表查詢(配sql+實操圖+案例鞏固 通俗易懂版~)

在這里插入圖片描述
每日激勵:“不設限和自我肯定的心態:I can do all things。 — Stephen Curry”

緒論?:
本章是MySQL篇中,非常實用性的篇章,相信在實際工作中對于表的查詢,很多時候會涉及多表的查詢,在多表查詢的時候光是前面的篇章可能無法完成,所以本章來了,本章將主要結合:子查詢 + 笛卡爾積 的方式來解決多表查詢問題,下一章將更新MySQL索引敬請期待~
————————
早關注不迷路,話不多說安全帶系好,發車啦(建議電腦觀看)。


復合查詢

前面我們講解的mysql表的查詢都是對一張表進行查詢,在實際開發中這遠遠不夠,所以復合查詢就是同時查詢多個表中的內容。

1. 回顧查詢基本操作

下面將通過幾個具體情況來進行回顧

查詢工資高于500或崗位為MANAGER的雇員,同時還要滿足他們的姓名首字母為大寫的J(where、or/and 、like)

分析查詢目標:

  1. 工資高于500 / 崗位為MANAGER的雇員(查詢)select * from emp where sal > 500 or job = 'MANAGER'
  2. 姓名首字母為大寫的... and ename lik 'J%'; / and substring(ename,1,1) = 'J'
    以下表數據來操作:
    在這里插入圖片描述
select * from emp where sal > 500 or job = 'MANAGER' and ename lik 'J%';  / and substring(ename,1,1) = 'J'

在這里插入圖片描述

按照部門號升序而雇員的工資降序排序(order by asc/desc)

比較簡單就不分析了,其中要注意的就是對于要進行排序的字段來說:那個在前面那個排序 優先級就較高

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

在這里插入圖片描述

使用年薪進行降序排序(select 自定義添加新列、ifnull、order by)

年薪 = 月薪sal * 12 + 獎金comm
獲取某個人并創建新列(在select后面直接創建要求并可以創建別名)
在這里插入圖片描述
其中任何值和NULL運算都會變成NULL(此處該人的comm為NULL)
在這里插入圖片描述
此時就要將這種情況避免(使用ifnull)

select sal*12+ifnull(comm,0) 年薪 from emp;

在這里插入圖片描述
在加上名稱和月薪,獎金,年薪,這樣跟好看
在這里插入圖片描述
在進行排序得到年薪的降序(order by desc)
在這里插入圖片描述

顯示工資最高的員工的名字和工作崗位(select 內部允許使用 嵌套select、max函數)

  1. 顯示工資最高 select max(sal) from emp; 該情況是在表中不存在的所以需要提前篩選出來!
  2. 員工的名字和工作崗位 select ename job where sal=..
select ename,job where sal=(select max(sal) from emp);`

在這里插入圖片描述

顯示工資高于平均工資的員工信息(select嵌套 + avg函數)

  1. 平均工資select avg(sal) 平均工資 from emp ;
    方法類似同上:
select * from emp where sal > (select avg(sal) from emp);`

在這里插入圖片描述

group by 分組

GROUP BY: 子句用于將查詢結果按照指定的列進行分組,通常與聚合函數一起使用。

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

  1. 平均工資、最高工資select max(sal) ,avg(sal) from emp;
    在這里插入圖片描述
  2. 每個部門(對應著需要分組)goup by deptno
select deptno, max(sal) ,avg(sal) from emp group by deptno;

在這里插入圖片描述
在使用format設置一下小數點:
在這里插入圖片描述

having

HAVING 子句用于對分組后的結果進行條件過濾,類似于 WHERE,但專門用于分組后的篩選。

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

  1. 平均工資(同上)
  2. 平均工資低于2000的部門號(分組)

就需要對分組之后的數據再做篩選(having)出小于2000的部門號:
在這里插入圖片描述

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

  1. 每種崗位(group分組)
  2. 雇員總數,平均工資(篩選內容)
    在這里插入圖片描述

2 多表查詢(多表笛卡爾積)

結合實例,邊練習邊了解邊快速上手學習

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

因為上面的數據(雇員名、雇員工資以及所在部門和部門號為10的)需要來自EMP和DEPT兩張表,因此要聯合查詢
EMP(需要ename、sal
在這里插入圖片描述
DEPT(需要dname):
在這里插入圖片描述
將他們直接使用select結合:
在這里插入圖片描述

對兩張表直接進行整合,他的情況是:將兩表中的數據進行窮舉組合(笛卡爾積)、任何一種組合都包括了,那么此時得到的就是一張新的表了對該表進行操作,就是單表=操作了
在這里插入圖片描述
再對該表進行篩選,選出正確的數據(因為直接窮舉的話,他們的數據是不正確的,我們需要將對應部門的數據進行整合,這個部門編號就相當于一個外鍵的連接作用)
在這里插入圖片描述
然后就得到了正確的兩表結合的數據(如上圖)

回到題目:

  1. 顯示雇員名、雇員工資
  2. 所在部門的名字和部門號為10(在表結合后面再添加部門篩選條件)
select ename, sal,dname from EMP, DEPT where EMP.deptno=DEPT.deptno and DEPT.deptno = 10;

其中需要注意的是deptno的有兩個,所以需要篩選一下
在這里插入圖片描述

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

需要的新表salgrade:
在這里插入圖片描述
結合emp得到新表:
在這里插入圖片描述
需要員工的姓名,工資,及工資級別

其中因為是窮舉的,所以說表是用問題的,而我們找的是正確的工資等級所以結合sal 、losal、hisal 通過between and來進行分級:
在這里插入圖片描述

總結:

在進行多表查詢的時候,將兩張表合并的方式是笛卡爾積式的窮舉結合,這樣可能會導致數據出現問題,所以我們需要進行再次的篩選,得到符合目的的新表,再對這個表進行正常的單表處理即可

自連接

自連接是指在同一張表連接查詢

同一張表進行笛卡爾積:
在這里插入圖片描述
發現:
同一張表并不能直接的進行笛卡爾積合并,但將這張表重命名為兩個名字,就能進行合并了,也就是自連接

那什么情況下會使用自連接呢?

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

mgr是員工領導的編號–empno
此處為什么要使用自連接呢?
因為:員工的領導本質也是員工,本題每個員工的領導只是通過編號來指定的,所以說無法直接找到領導的信息
若想找到某個員工的領導姓名的話,就需要員工信息中的領導的編號和表中的員工編號進行比對篩選才能找到領導的信息
在這里插入圖片描述

  1. 找到FORD的領導編號----empselect mgr from emp where ename='FORD';
  2. 在從emp表中使用領導編號找領導信息—empselect ename,emobo from emp where ename(...);
    子查詢:
select empno,ename from emp where emp.empno=(select mgr from emp where ename='FORD');

在這里插入圖片描述

第二種方式(多表查詢,自查詢):

  1. 將相同的表重命名為兩張表,再進行笛卡爾積合并
  2. 從兩表結合的新表中找到FORD
  3. 在從這兩張表中獲取 判斷 表1中的領導編號 = 表二中的員工編號的 信息

在這里插入圖片描述

子查詢:

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

單行子查詢

  • 顯示SMITH同一部門的員工
select * from EMP WHERE deptno = (select deptno from EMP where ename='smith');

在這里插入圖片描述

多行子查詢

  • 查詢和10號部門的工作崗位相同的雇員的名字,崗位,工資,部門號,但是不包含10自己的
    分析題目:
    在這里插入圖片描述
    10號部門崗位(distinct去重): 在這里插入圖片描述

in 查看是否包含:

篩選出job崗位包含10號部門崗位的相同的雇員的名字,崗位,工資,部門號:
在這里插入圖片描述
其中還不要10號部門的(那么再次篩選 deptno<> 10 、<>就是不等與)
在這里插入圖片描述

  • 進一步拓展(結合前面的理解下):本質就是將上面的結果在重命名為一個張表在和其他表進行合并得到領導名稱
    其中select子查詢還能當成一張表出現在from后面
    在這里插入圖片描述

all:獲取所有信息

  • 顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號
  1. 工資比部門30的所有員工(找到30部門的最高工資進行比較)
  2. 的員工的姓名、工資和部門號(通過前面的最高工資再在表中進行遍歷所有比較)

在這里插入圖片描述
這種本質也可以,但若想更加的具體且通俗易懂
使用all函數,比較所有情況,不需要提前獲取最大的,而是直接比較所有
在這里插入圖片描述

any關鍵字;

  • 顯示工資比部門30的任意員工的工資高的員工的姓名、工資和部門號(包含自己部門的員工)
    很好理解就不過訴了:
    在這里插入圖片描述

多列子查詢

單行子查詢是指子查詢只返回單列,單行數據;多行子查詢是指返回單列多行數據,都是針對單列而言的,而多列子查詢則是指查詢返回多個列數據的子查詢語句
可能有點不太好理解,具體見下面實例:
在這里插入圖片描述

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

注意:
任何時刻,查詢出來的臨時結構,本質在邏輯上也是表結構

子查詢與from

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

  • 顯示每個高于自己部門平均工資的員工的姓名、部門、工資、平均工資
    在這里插入圖片描述
  1. 找到每個部門的平均工資:在這里插入圖片描述
  2. 將原本的表和該表進行笛卡爾積,生成新表(就得到了每個員工和平均工資)在這里插入圖片描述
  3. 那么就變成了單標查詢
    在這里插入圖片描述
  4. 若還需要辦公地址,就再需要表:
    在這里插入圖片描述
  5. 再次結合,并且去掉沒用的值
    在這里插入圖片描述
  6. 再篩選出需要的字段:
    在這里插入圖片描述
select ename, deptno, sal, format(asal,2) from EMP, (select avg(sal) asal, deptno dt from EMP group by deptno) tmp where EMP.sal > tmp.asal and EMP.deptno=tmp.dt;

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

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

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

在這里插入圖片描述
在這里插入圖片描述

select DEPT.deptno, dname, mycnt, loc from DEPT, (select count(*) mycnt, deptno from EMP group by deptno) tmp where DEPT.deptno=tmp.deptno;

在這里插入圖片描述
mysql一切皆表
解決多表問題的本質:想辦法將多表轉化為單表,所以mysql中,所有select的問題全部都可以轉成單標問題!

合并查詢

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

union

該操作符用于取得兩個結果集的并集。當使用該操作符時,會自動去掉結果集中的重復行
在這里插入圖片描述

  • 將工資大于2500或職位是MANAGER的人找出來
    在這里插入圖片描述

union all

該操作符用于取得兩個結果集的并集。當使用該操作符時,不會去掉結果集中的重復行
在這里插入圖片描述

其中注意的話使用union進行拼接的前提是列相同:
在這里插入圖片描述


本章完。預知后事如何,暫聽下回分解。

如果有任何問題歡迎討論哈!

如果覺得這篇文章對你有所幫助的話點點贊吧!

持續更新大量MySQL細致內容,早關注不迷路。

?

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

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

相關文章

【基礎4】插入排序

核心思想 插入排序是一種基于元素比較的原地排序算法&#xff0c;其核心思想是將數組分為“已排序”和“未排序”兩部分&#xff0c;逐個將未排序元素插入到已排序部分的正確位置。 例如撲克牌在理牌的時候&#xff0c;一般會將大小王、2、A、花牌等按大小順序插入到左邊&…

【Flink銀行反欺詐系統設計方案】3.欺詐的7種場景和架構方案、核心表設計

【Flink銀行反欺詐系統設計方案】3.欺詐的7種場景和架構方案、核心表設計 1. **欺詐場景分類與案例說明**1.1 **大額交易欺詐**1.2 **異地交易欺詐**1.3 **高頻交易欺詐**1.4 **異常時間交易欺詐**1.5 **賬戶行為異常**1.6 **設備指紋異常**1.7 **交易金額突變** 2. **普適性軟…

迷你世界腳本生物接口:Creature

生物接口&#xff1a;Creature 彼得兔 更新時間: 2024-05-22 17:51:22 繼承自 Actor 具體函數名及描述如下: 序號 函數名 函數描述 1 getAttr(...) 生物屬性獲取 2 setAttr(...) 生物屬性設置 3 isAdult(...) 判斷該生物是否成年 4 setOxygenNeed(…

深入理解三色標記、CMS、G1垃圾回收器

三色標記算法 簡介 三色標記算法是一種常見的垃圾收集的標記算法&#xff0c;屬于根可達算法的一個分支&#xff0c;垃圾收集器CMS&#xff0c;G1在標記垃圾過程中就使用該算法 三色標記法&#xff08;Tri-color Marking&#xff09;是垃圾回收中用于并發標記存活對象的核心算…

自動駕駛---不依賴地圖的大模型軌跡預測

1 前言 早期傳統自動駕駛方案通常依賴高精地圖&#xff08;HD Map&#xff09;提供道路結構、車道線、交通規則等信息&#xff0c;可參考博客《自動駕駛---方案從有圖邁進無圖》&#xff0c;本質上還是存在問題&#xff1a; 數據依賴性高&#xff1a;地圖構建成本昂貴&#xf…

Xshell及Xftp v8.0安裝與使用-生信工具050

官網 https://www.xshell.com/zh/free-for-home-school/ XShell & Xftp 詳解 1. XShell 介紹 1.1 XShell 是什么&#xff1f; XShell 是一款強大的 Windows 終端模擬器&#xff0c;主要用于遠程管理 Linux、Unix 服務器。它支持 SSH、Telnet、Rlogin 及 SFTP 協議&…

跨域-告別CORS煩惱

跨域-告別CORS煩惱 文章目錄 跨域-告別CORS煩惱[toc]1-參考網址2-思路整理1-核心問題2-個人思考3-腦洞打開4-個人思考-修正版1-個人思考2-腦洞打開 3-知識整理1-什么是跨域一、同源策略簡介什么是源什么是同源是否是同源的判斷哪些操作不受同源策略限制跨域如何跨域 二、CORS 簡…

PE文件結構詳解(DOS頭/NT頭/節表/導入表)使用010 Editor手動解析notepad++.exe的PE結構

一&#xff1a;DOS部分 DOS部分分為DOS MZ文件頭和DOS塊&#xff0c;其中DOS MZ頭實際是一個64位的IMAGE_DOS——HEADER結構體。 DOS MZ頭部結構體的內容如下&#xff0c;我們所需要關注的是前面兩個字節&#xff08;e_magic&#xff09;和后面四個字節&#xff08;e_lfanew&a…

Node JS 調用模型Xenova_all-MiniLM-L6-v2實戰

本篇通過將句子數組轉換為句子的向量表示&#xff0c;并通過平均池化和歸一化處理&#xff0c;生成適合機器學習或深度學習任務使用的特征向量為例&#xff0c;演示通過NodeJS 的方式調用Xenova/all-MiniLM-L6-v2 的過程。 關于 all-MiniLM-L6-v2 的介紹&#xff0c;可以參照上…

【C++學習篇】智能指針

目錄 1. 智能指針的使用場景分析 2. RAII和智能指針的設計思路 3. C標準庫智能指針的使用 4.shared_ptr和weak_ptr 4.1shared_ptr的循環引用問題 4.2 weak_ptr 1. 智能指針的使用場景分析 下?程序中我們可以看到&#xff0c;new了以后&#xff0c;我們也delete了&#xff0c…

IntelliJ IDEA集成MarsCode AI

IntelliJ IDEA集成MarsCode AI IDEA中安裝插件 安裝完畢之后登錄自己的賬號 點擊鏈接&#xff0c;注冊賬號 https://www.marscode.cn/events/s/i5DRGqqo/ 可以選擇不同的模型

日期格式與字符串不匹配bug

異常特征&#xff1a;java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String ### Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.Str…

C++中的無鎖編程

引言 在當今多核處理器普及的時代&#xff0c;并發編程已成為高性能應用程序開發的關鍵技術。傳統的基于鎖的同步機制雖然使用簡單&#xff0c;但往往會帶來性能瓶頸和死鎖風險。無鎖編程&#xff08;Lock-Free Programming&#xff09;作為一種先進的并發編程范式&#xff0c…

FastGPT 引申:借鑒 FastGPT 基于MySQL + ES 實現知識庫(含表結構以及核心代碼)

文章目錄 FastGPT 引申&#xff1a;借鑒 FastGPT 基于MySQL ES 實現知識庫&#xff08;含表結構以及核心代碼&#xff09;一、整體思路二、存儲結構2.1 MySQL 表結構(1) knowledge_base_dataset(2) knowledge_base_data(3) knowledge_base_index(4) ai_kb_relation 2.2 Elasti…

Python學習(十四)pandas庫入門手冊

目錄 一、安裝與導入二、核心數據結構2.1 Series 類型&#xff08;一維數組&#xff09;2.2 DataFrame 類型&#xff08;二維數組&#xff09; 三、數據讀取與寫入3.1 讀取 CSV 和 Excel 文件3.2 寫入數據 四、數據清洗與處理4.1 處理缺失值4.2 數據篩選4.3 數據排序 五、數據分…

【Python 數據結構 4.單向鏈表】

目錄 一、單向鏈表的基本概念 1.單向鏈表的概念 2.單向鏈表的元素插入 元素插入的步驟 3.單向鏈表的元素刪除 元素刪除的步驟 4.單向鏈表的元素查找 元素查找的步驟 5.單向鏈表的元素索引 元素索引的步驟 6.單向鏈表的元素修改 元素修改的步驟 二、Python中的單向鏈表 ?編輯 三…

第1章:項目概述與環境搭建

第1章&#xff1a;項目概述與環境搭建 學習目標 了解YunChangAction靈感記錄應用的整體架構和功能掌握SwiftUI開發環境的配置方法創建項目基礎結構并理解文件組織方式實現應用的啟動屏幕和基本主題設置 理論知識講解 靈感記錄應用概述 靈感記錄應用是一種專門設計用來幫助…

2025.3.3總結

周一這天&#xff0c;我約了績效教練&#xff0c;主要想了解專業類績效的考核方式以及想知道如何拿到一個更好的績效。其他的崗位并不是很清楚&#xff0c;但是專業類的崗位&#xff0c;目前采取絕對考核&#xff0c;管理層和專家崗采取相對考核&#xff0c;有末尾淘汰。 通過…

FastGPT 源碼:基于 LLM 實現 Rerank (含Prompt)

文章目錄 基于 LLM 實現 Rerank函數定義預期輸出實現說明使用建議完整 Prompt 基于 LLM 實現 Rerank 下邊通過設計 Prompt 讓 LLM 實現重排序的功能。 函數定義 class LLMReranker:def __init__(self, llm_client):self.llm llm_clientdef rerank(self, query: str, docume…

LeetCode 1745.分割回文串 IV:動態規劃(用III或II能直接秒)

【LetMeFly】1745.分割回文串 IV&#xff1a;動態規劃&#xff08;用III或II能直接秒&#xff09; 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/palindrome-partitioning-iv/ 給你一個字符串 s &#xff0c;如果可以將它分割成三個 非空 回文子字符串&#xff0c;…