MySQL之復(fù)合查詢解讀
一、基本查詢練習(xí)回顧
1、查詢工資高于 500 或崗位為 MANAGER 的雇員,同時(shí)還要滿足他們的姓名首字母為大寫的 J
2、按照部門號(hào)升序而雇員的工資降序排序
3、使用年薪進(jìn)行降序排序
4、顯示工資最高的員工的名字和工作崗位
5、顯示工資高于平均工資的員工信息
6、顯示每個(gè)部門的平均工資和最高工資
7、顯示平均工資低于2000的部門號(hào)和它的平均工資
8、顯示每種崗位的雇員總數(shù),平均工資
二、多表查詢
實(shí)際開發(fā)中往往數(shù)據(jù)來自不同的表,所以需要多表查詢。這里我們用一個(gè)簡單的公司管理系統(tǒng),有三張表 emp,dept,salgrade 來演示如何進(jìn)行多表查詢。
?練習(xí)
1、顯示雇員名、雇員工資以及所在部門的名字因?yàn)樯厦娴臄?shù)據(jù)來自 emp 和 dept 表,因此要聯(lián)合查詢(將數(shù)據(jù)進(jìn)行窮舉組合 —— 笛卡爾積)
其實(shí)我們只要 emp 表中的 deptno=dept 表中的 deptno 字段的記錄:
2、顯示部門號(hào)為 10 的部門名,員工名和工資
3、顯示各個(gè)員工的姓名,工資,及工資級(jí)別
三、自連接
自連接 是指在同一張表連接查詢。
?練習(xí)
1、顯示員工 FORD 的上級(jí)領(lǐng)導(dǎo)的編號(hào)和姓名(mgr 是員工領(lǐng)導(dǎo)的編號(hào) —— empno)
(1)使用的子查詢
先找 FORD 的上級(jí)領(lǐng)導(dǎo)的編號(hào)(emp),再根據(jù)領(lǐng)導(dǎo)的編號(hào)來找領(lǐng)導(dǎo)的信息(emp)。
(2)使用多表查詢(自查詢)
- 使用到表的別名
from emp e1, emp e2,給自己的表起別名,因?yàn)橐茸龅芽柗e,所以別名可以先識(shí)別。
四、子查詢
子查詢是指嵌入在其他 sql 語句中的 select 語句,也叫嵌套查詢。
- 目前學(xué)習(xí)到的子查詢都在 where 子句中充當(dāng)判斷條件。
- 任何時(shí)刻,查詢出來的臨時(shí)結(jié)構(gòu),本質(zhì)在邏輯上也是表結(jié)構(gòu)。
1、單行子查詢
返回一行記錄的子查詢。
- 顯示 SMITH 同一部門的員工
2、多行子查詢
返回多行記錄的子查詢。
(1)in 關(guān)鍵字
in 關(guān)鍵字用來判斷一個(gè)對(duì)應(yīng)的列值是否在某個(gè)集合當(dāng)中,只要在集合當(dāng)中,說明查找成功。
查詢和 10 號(hào)部門的工作崗位相同的雇員的名字,崗位,工資,部門號(hào),但是不包含 10 自己的。
擴(kuò)展:除了上面的要求以外,還需要顯示出對(duì)應(yīng)員工所屬崗位的名字。
(2)all 關(guān)鍵字
all 關(guān)鍵字表示與所有的值作比較。
顯示工資比部門 30 的所有員工的工資高的員工的姓名、工資和部門號(hào)。
另一種寫法:
(3)any 關(guān)鍵字
amy 關(guān)鍵字表示與任意的值作比較。
顯示工資比部門 30 的任意員工的工資高的員工的姓名、工資和部門號(hào)(包含自己部門的員工)。
3、多列子查詢
- 單行子查詢是指子查詢只返回單列,單行數(shù)據(jù)。
- 多行子查詢是指返回單列多行數(shù)據(jù),都是針對(duì)單列而言的,而多列子查詢則是指查詢返回多個(gè)列數(shù)據(jù)的子查詢語句。
?練習(xí)
查詢和 SMITH 的部門和崗位完全相同的所有雇員,不含 SMITH 本人
4、在 from 子句中使用子查詢
子查詢語句出現(xiàn)在 from 子句中。
這里要用到數(shù)據(jù)查詢的技巧,把一個(gè)子查詢當(dāng)做一個(gè)臨時(shí)表使用。
?練習(xí)
(1)顯示每個(gè)高于自己部門平均工資的員工的姓名、部門、工資、平均工資
獲取各個(gè)部門的平均工資,將其看作臨時(shí)表
擴(kuò)展:除了上面的要求以外,還需要顯示出對(duì)應(yīng)部門的辦公地點(diǎn)。
(2)查找每個(gè)部門工資最高的人的姓名、工資、部門、最高工資
(3)顯示每個(gè)部門的信息(部門名,編號(hào),地址)和人員數(shù)量
a. 方法 1:使用多表
解決多表問題的本質(zhì):(多表的指導(dǎo)思想)
想辦法將多表轉(zhuǎn)化為單表,所以在 MySQL 中,所有 select 的問題全都可以轉(zhuǎn)成單表問題。
b. 方法 2:使用子查詢(推薦)
- 對(duì) emp 表進(jìn)行人員統(tǒng)計(jì)
將上面的表看作臨時(shí)表
5、合并查詢
在實(shí)際應(yīng)用中,為了合并多個(gè) select 的執(zhí)行結(jié)果,可以使用集合操作符 union , union all。
(1)union
該操作符用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí), 會(huì) 自動(dòng)去掉結(jié)果集中的重復(fù)行。
練習(xí) —— 將工資大于 2500 或職位是 MANAGER 的人找出來
(2)union all
該操作符用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),不會(huì)去掉結(jié)果集中的重復(fù)行。
練習(xí) —— 將工資大于 25000 或職位是 MANAGER 的人找出來
注意:select 如果要使用 union / union all 來拼接兩個(gè)結(jié)果,前提是必須保證兩個(gè)表的列數(shù)是相同的。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL中浮點(diǎn)型轉(zhuǎn)字符型可能會(huì)遇的問題詳解
類型轉(zhuǎn)換是我們?nèi)粘i_發(fā)中經(jīng)常會(huì)遇到的一個(gè)需求,最近在將浮點(diǎn)型轉(zhuǎn)換成字符型的時(shí)候就遇到了一個(gè)問題,所以總結(jié)分享出來,下面這篇文章主要給大家介紹了MySQL中關(guān)于浮點(diǎn)型轉(zhuǎn)字符型可能遇到的問題的相關(guān)資料,需要的朋友可以參考下。2017-09-09Mysql中g(shù)roup by 使用中發(fā)現(xiàn)的問題
當(dāng)使用MySQL的GROUP BY語句時(shí),根據(jù)指定的列對(duì)結(jié)果進(jìn)行分組,這種情況通常是由于在 GROUP BY 中選擇的字段與其他非聚合字段不兼容,或者在 SELECT 子句中沒有正確使用聚合函數(shù)所導(dǎo)致的,本文給大家介紹Mysql中g(shù)roup by 使用中發(fā)現(xiàn)的問題,感興趣的朋友跟隨小編一起看看吧2024-06-06Mysql數(shù)據(jù)庫按時(shí)間點(diǎn)恢復(fù)實(shí)戰(zhàn)記錄
如果客戶在某時(shí)間節(jié)點(diǎn)由于誤操作,導(dǎo)致數(shù)據(jù)丟失,RDS管控服務(wù)是如何進(jìn)行恢復(fù)的呢?通過Mysql數(shù)據(jù)庫按時(shí)間點(diǎn)恢復(fù)該如何操作呢,感興趣的朋友跟隨小編一起看看吧2021-06-06Windows安裝MySQL8.0.28.0.msi方式(圖文詳解)
這篇文章主要介紹了Windows安裝MySQL8.0.28.0.msi,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03MySQL三種安裝方式總結(jié)大全(mis、zip、yum)
mysql是一種廣泛使用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(rdbms),它支持多種安裝方式,這篇文章主要介紹了MySQL三種安裝方式(mis、zip、yum)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-08-08用shell寫一個(gè)mysql數(shù)據(jù)備份腳本
本篇文章教給大家用shell寫一個(gè)mysql數(shù)據(jù)備份腳本,這是一個(gè)簡單備份MYSQL數(shù)據(jù)庫的方法,一起跟著學(xué)習(xí)下吧。2017-12-12