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