?一、基本查詢練習回顧
1、查詢工資高于?500?或崗位為?MANAGER?的雇員,同時還要滿足他們的姓名首字母為大寫的?J
2、按照部門號升序而雇員的工資降序排序
3、使用年薪進行降序排序
4、顯示工資最高的員工的名字和工作崗位
5、顯示工資高于平均工資的員工信息
6、顯示每個部門的平均工資和最高工資
7、顯示平均工資低于2000的部門號和它的平均工資
8、顯示每種崗位的雇員總數,平均工資
二、多表查詢
實際開發中往往數據來自不同的表,所以需要多表查詢。這里我們用一個簡單的公司管理系統,有三張表 emp,dept,salgrade 來演示如何進行多表查詢。
?練習
1、顯示雇員名、雇員工資以及所在部門的名字因為上面的數據來自?emp?和 dept?表,因此要聯合查詢(將數據進行窮舉組合 —— 笛卡爾積)
其實我們只要?emp?表中的?deptno=dept?表中的?deptno?字段的記錄:

2、顯示部門號為?10 的部門名,員工名和工資
3、顯示各個員工的姓名,工資,及工資級別
三、自連接
自連接 是指在同一張表連接查詢。
?練習
1、顯示員工?FORD?的上級領導的編號和姓名(mgr?是員工領導的編號 ——?empno)
(1)使用的子查詢
先找 FORD 的上級領導的編號(emp),再根據領導的編號來找領導的信息(emp)。
(2)使用多表查詢(自查詢)
- 使用到表的別名
from emp e1, emp e2,給自己的表起別名,因為要先做笛卡爾積,所以別名可以先識別。
四、子查詢
子查詢是指嵌入在其他? sql? 語句中的? select? 語句,也叫嵌套查詢。
- 目前學習到的子查詢都在 where 子句中充當判斷條件。
- 任何時刻,查詢出來的臨時結構,本質在邏輯上也是表結構。
1、單行子查詢
返回一行記錄的子查詢。
- 顯示?SMITH?同一部門的員工
2、多行子查詢
返回多行記錄的子查詢。
(1)in 關鍵字
in 關鍵字用來判斷一個對應的列值是否在某個集合當中,只要在集合當中,說明查找成功。
查詢和? 10? 號部門的工作崗位相同的雇員的名字,崗位,工資,部門號,但是不包含? 10? 自己的。

擴展:除了上面的要求以外,還需要顯示出對應員工所屬崗位的名字。

(2)all 關鍵字
all 關鍵字表示與所有的值作比較。
顯示工資比部門? 30? 的所有員工的工資高的員工的姓名、工資和部門號。

另一種寫法:

(3)any 關鍵字
amy 關鍵字表示與任意的值作比較。
顯示工資比部門?30?的任意員工的工資高的員工的姓名、工資和部門號(包含自己部門的員工)。
3、多列子查詢
- 單行子查詢是指子查詢只返回單列,單行數據。
- 多行子查詢是指返回單列多行數據,都是針對單列而言的,而多列子查詢則是指查詢返回多個列數據的子查詢語句。
?練習
查詢和?SMITH?的部門和崗位完全相同的所有雇員,不含?SMITH?本人
4、在?from?子句中使用子查詢
子查詢語句出現在? from? 子句中。
這里要用到數據查詢的技巧,把一個子查詢當做一個臨時表使用。
?練習
(1)顯示每個高于自己部門平均工資的員工的姓名、部門、工資、平均工資
- 獲取各個部門的平均工資,將其看作臨時表

擴展:除了上面的要求以外,還需要顯示出對應部門的辦公地點。

(2)查找每個部門工資最高的人的姓名、工資、部門、最高工資
(3)顯示每個部門的信息(部門名,編號,地址)和人員數量
a. 方法?1:使用多表
解決多表問題的本質:(多表的指導思想)
想辦法將多表轉化為單表,所以在?MySQL 中,所有 select 的問題全都可以轉成單表問題。?
b. 方法 2:使用子查詢(推薦)
- 對 emp 表進行人員統計
- 將上面的表看作臨時表

5、合并查詢
在實際應用中,為了合并多個? select? 的執行結果,可以使用集合操作符 union , union all。
(1)union
該操作符用于取得兩個結果集的并集。當使用該操作符時, 會 自動去掉結果集中的重復行。
練習 —— 將工資大于?2500?或職位是?MANAGER?的人找出來
(2)union all
該操作符用于取得兩個結果集的并集。當使用該操作符時,不會去掉結果集中的重復行。
練習 ——?將工資大于?25000?或職位是?MANAGER 的人找出來
注意:select 如果要使用 union / union all 來拼接兩個結果,前提是必須保證兩個表的列數是相同的。