MySQL復(fù)合查詢的實(shí)現(xiàn)示例
前言:經(jīng)過前面的學(xué)習(xí),MySQL的基本操作都已經(jīng)掌握了。之前介紹的是對(duì)于一張表進(jìn)行查詢,但是僅僅查詢一張表是不夠的,所以從這一篇開始要介紹多張表時(shí)如何查詢。
一.單表查詢(引入子查詢)
(1)查詢工資高于500或崗位為MANAGER的雇員,同時(shí)還要滿足他們的姓名首字母為大寫的J:
這兩種寫法都可以。
(2)按照部門號(hào)升序而雇員的工資降序排序
(3)使用年薪進(jìn)行降序排序
(4)顯示工資最高的員工的名字和工作崗位
max是聚合函數(shù),不能這么用,因此可以將其分開:
這樣分兩步寫看著很不好,因此這里要用到一個(gè)新的查詢:子查詢
即在一個(gè)查詢里嵌套另一個(gè)查詢。
也可以據(jù)此顯示年薪最高的員工的名字和工作崗位:
(5)顯示工資高于平均工資的員工信息
(6)顯示每個(gè)部門的平均工資和最高工資
這里format是最后一步,不要先對(duì)它重命名,后面是無法識(shí)別的。
(7)顯示平均工資低于2000的部門號(hào)和它的平均工資
(8)顯示每種崗位的雇員總數(shù),平均工資
二.多表查詢
(1)顯示雇員名、雇員工資以及所在部門的名字因?yàn)樯厦娴臄?shù)據(jù)來自EMP和DEPT表,因此要聯(lián)合查詢
這里雇員名和雇員工資在emp表(從表)中,而部門名字在dept表(主表)中,emp表只有部門的編號(hào)。
select后面是可以跟多個(gè)表的,后面多個(gè)表會(huì)被合并為一個(gè)表顯示:
多表組合,形成笛卡爾積,本質(zhì)是數(shù)據(jù)的窮舉。
這里只有兩個(gè)deptno相等的才是有效的,但是不能這么寫:
應(yīng)該這樣寫:
因此:
得到了想要查詢的結(jié)果。
解決多表查詢的思路:
① 讀題,確定都和哪些表有關(guān)
② 組合成一張表
③ 將多表查詢,看作成為一張表的查詢
(2)顯示部門號(hào)為10的部門名,員工名和工資
(3)顯示各個(gè)員工的姓名,工資,及工資級(jí)別
三.自連接
自連接是指在同一張表連接查詢。
可以用e1和e2表示兩個(gè)相同的emp表。
例子:顯示員工FORD的上級(jí)領(lǐng)導(dǎo)的編號(hào)和姓名
如果按照之前的方法,是要兩步的,不過這里可以用自連接變成一步。
這樣就變成了一步。
也可以用子查詢的方法變成一步。
四.子查詢
(1)多行單列子查詢
返回多行記錄的子查詢。(這里是對(duì)上面子查詢的擴(kuò)展)
① in:在這個(gè)集合中
查詢和10號(hào)部門的工作崗位相同的雇員的名字,崗位,工資,部門號(hào),但是不包含10自己的。
② all:所有的
顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號(hào)。
不使用all,可以將題目轉(zhuǎn)化為大于30的員工中最高工資的員工。
用all。
③ any:任何一個(gè)
顯示工資比部門30的任意員工的工資高的員工的姓名、工資和部門號(hào)(包含自己部門的員工)
(2)多列子查詢
單行子查詢是指子查詢只返回單列,單行數(shù)據(jù);多行子查詢是指返回單列多行數(shù)據(jù),都是針對(duì)單列而言的,而多列子查詢則是指查詢返回多個(gè)列數(shù)據(jù)的子查詢語句。
例子:查詢和SMITH的部門和崗位完全相同的所有雇員,不含SMITH本人。
(3)在from子句中使用子查詢
子查詢語句出現(xiàn)在from子句中。這里要用到數(shù)據(jù)查詢的技巧,把一個(gè)子查詢當(dāng)做一個(gè)臨時(shí)表使用。
例子①:顯示每個(gè)高于自己部門平均工資的員工的姓名、部門、工資、平均工資
如果想知道其工資等級(jí),就繼續(xù)往上加:
例子②:查找每個(gè)部門工資最高的人的姓名、工資、部門、最高工資
例子③:顯示每個(gè)部門的信息(部門名,編號(hào),地址)和人員數(shù)量
mysql永遠(yuǎn)會(huì)有一張表。
如果我們只有一張表,要進(jìn)行各種select,我們認(rèn)為,所有select查出來的結(jié)果,都是一張表。
如果我們有多張表,進(jìn)行查詢之前,我們可以進(jìn)行整合,也是select,查出來的結(jié)果,也是一張表。
五.合并查詢(union、union all)
為了合并多個(gè)select的執(zhí)行結(jié)果,可以使用集合操作符 union,union all。
- union用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),會(huì)自動(dòng)去掉結(jié)果集中的重復(fù)行。
- union all用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),不會(huì)去掉結(jié)果集中的重復(fù)行。
例子:將工資大于2500或職位是MANAGER的人找出來。
這是不使用union的方法。
使用union將兩個(gè)語句合并在一起。
如果使用union all就不會(huì)去重。
union (all):本質(zhì)是將多次查詢結(jié)果合并成為一個(gè)結(jié)果(就是將多張表合并成為一張表)。
到此這篇關(guān)于MySQL復(fù)合查詢的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MySQL復(fù)合查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)據(jù)結(jié)構(gòu)-樹(三):多路搜索樹B樹、B+樹
這篇文章主要介紹了多路搜索樹B樹、B+樹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04MySql安裝與配置方法(MySQL添加用戶、刪除用戶與授權(quán))
這篇文章主要介紹了MySql安裝與配置方法(MySQL添加用戶、刪除用戶與授權(quán))的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08詳解MySQL用事件調(diào)度器Event Scheduler創(chuàng)建定時(shí)任務(wù)
事件調(diào)度器(Event Scheduler)是在MySQLv5.1.6中新增的一個(gè)功能,它相當(dāng)于一個(gè)定時(shí)器,可以在指定的時(shí)間點(diǎn)執(zhí)行一條SQL語句或一個(gè)語句塊,也可以用于在固定間隔重復(fù)執(zhí)行。下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)在MySQL中如何用事件調(diào)度器Event Scheduler創(chuàng)建定時(shí)任務(wù)2016-08-08MySQL中Nested-Loop Join算法小結(jié)
數(shù)據(jù)庫中JOIN操作的實(shí)現(xiàn)主要有三種:嵌套循環(huán)連接(Nested Loop Join),歸并連接(Merge Join)和散列連接或者哈稀連接(Hash Join)。其中嵌套循環(huán)連接又視情況又有兩種變形:塊嵌套循環(huán)連接和索引嵌套循環(huán)連接。2015-12-12MySQL借助DB實(shí)現(xiàn)分布式鎖思路詳解
這篇文章主要給大家介紹了關(guān)于MySQL借助DB實(shí)現(xiàn)分布式鎖思路的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10MYSQL 左連接右連接和內(nèi)連接的詳解及區(qū)別
這篇文章主要介紹了MYSQL 左連接右連接和內(nèi)連接的詳解及區(qū)別的相關(guān)資料,需要的朋友可以參考下2016-11-11關(guān)于MySQL中savepoint語句使用時(shí)所出現(xiàn)的錯(cuò)誤
這篇文章主要介紹了關(guān)于MySQL中savepoint語句使用時(shí)所出現(xiàn)的錯(cuò)誤,字符串出現(xiàn)e時(shí)所產(chǎn)生的問題也被作為MySQL的bug進(jìn)行過提交,需要的朋友可以參考下2015-05-05