一、基本介紹-為什么需要多表查詢
說明: 我們在實際開發中,必然會遇到,數據來自不同的表,這時,我們就需要使用多表聯合查詢。
快速入門案例
?顯示雇員名,雇員工資及所在部門的名字
分析1: 因為上面的數據來自 emp 表和 dept 因此聯合查詢
select * from emp,dept
加強: ?顯示雇員名,雇員工資及所在部門的名字, 顯示工資的級別
思考(1) 一共要用到 3 張表 [emp, dept, salgrade]
select * from emp, dept, salgrade;
再次過濾
增加一個過濾條件即可
可以根據需要選擇我們要的字段
說明:如果我們顯示額字段名,沒有沖突【沒有相同的,則可以不要表名】.
?如何顯示部門號為10的部門名、員工名和工資
select dept.dname,emp.sal from emp , detp where emp.deptno = dept.deptno and dept.deptno=10
顯示各個員工的姓名,工資,及其工資的級別
二、自連接
基本介紹
案例說明
比如顯示’FORD’的上級名字
思路: 我們先查詢到'ford' 的上級的編號
思路: 當得到 'ford' 上級編號后,就可以通過這個編號,獲取到這個人的所有信息
要求大家使用多表查詢.
顯示所有員工的上級名字
三、子查詢
基本介紹:
Where型子查詢:內層的查詢結果最為外層sql的比較條件。如果 where 列=(內層sql),則內層sql返回的必是單行單列,單個值,如果 where 列 in (內層sql), 則內層sql只返回單列,可以多行.
Form型子查詢:把select后的結果集取個別名當做表來用。
Exists型子查詢:先獲取外層sql所有數據,並把數據帶入到內查詢條件中,看能否查到數據。
示例:查詢欄目表,看cat_id對應的商品是否存在,如果存在,則這行記錄就要,否則不要;
關鍵字主要包括:in not in = != exists not exists等
如果子查詢記錄數唯一,還可以用 = 代替 in;
四、子查詢的分類
案例說明
請思考:如何顯示與SMITH同一部門的所有員工?
練習:如何查詢和部門10的工作相同的雇員的名字、崗位、工資、部門號, 但是不含10自己的.
綜合查詢
說明: 在 ecs_goods 表中查看 ,要求顯示 每個類別中,價格最高的商品的名稱和價格。
思路:
先根據 類別和 價格進行排序處理
把上面的結果,看做是一個臨時表,然后對其進行分組
五、all/any關鍵字的使用
案例說明:
請思考:如何顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號
請思考:如何顯示工資比部門30的任意一個員工的工資高的員工的姓名、工資和部門號
六、多列子查詢
基本介紹:
說明: 多列子查詢就是指,我們的子查詢的結果是多列,而不是單列 。
請查詢和宋江數學,英語,語文 完全相同的學生
七、在from 子句中使用子查詢
基本介紹: 即你的子查詢出現在from 子句中.這里要用到數據查詢的小技巧,把一個子查詢當作一個臨時表使用
案例說明:
請思考:如何顯示高於自己部門平均工資的員工的信息
思路: 先獲取到各個部門的平均工資,然后將其看成臨時表,具體 sql語句如下
第二種解決方法
請思考:查找每個部門工資最高的人的詳細資料 ?
思路: 先查詢到每個部門工資最高的人.
練習:
方法: 多表查詢,子查詢
第二種方式,使用了子查詢
八、自我復制(蠕蟲復制)
基本介紹:
有時,為了對某個sql語句進行效率測試,我們需要海量數據時,可以使用此法為表創建海量數據
案例說明
我們希望把emp 表的數據,快速的變成80000
步驟如下[自我復制]
九、刪除某個表中的重復記錄
要求,將上面表中重復的記錄刪除.
思路
先創建一張空表(temp_hsp100),空表的結構和 hsp100一樣.
把hsp100進行 distinct ,把數據導入到 (temp_hsp100)
刪除 hsp100
將temp_hsp100 改成 hsp100
十、union合並查詢
基本介紹: 有時在實際應用中,為了合並多個select語句的結果,可以使用集合操作符號 union , union all
注意:只要各語句取出的字段數要相同,字段名不是必須相同,會以第一個sql的字段名為准
案例說明
union 使用: 該操作符用於取得兩個結果集的並集。當使用該操作符時,會自動去掉結果集中重復行。過濾會比較費時,推薦使用union all
union all 使用: 該操作符用於取得兩個結果集的並集。當使用該操作符時,不會自動去掉結果集中重復行。
思考如下,內層語句的desc怎么沒發揮作用呢?
思考如下語句:
(SELECT goods_id,cat_id,goods_name,shop_price FROM goods WHERE cat_id = 4 ORDER BY shop_price DESC)
UNION
(SELECT goods_id,cat_id,goods_name,shop_price FROM goods WHERE cat_id = 5 ORDER BY shop_price DESC)
order by shop_price asc;
外層語句還要對最終結果,再次排序.
因此,內層的語句的排序,就沒有意義.
因此:內層的order by 語句單獨使用,不會影響結果集,僅排序,
在執行期間,就被Mysql的代碼分析器給優化掉了.
內層的order by 必須能夠影響結果集時,才有意義.
比如 配合limit 使用. 如下例.
查出: 第3個欄目下,價格前3高的商品,和第4個欄目下,價格前2高的商品.
用union來完成,這一次:內層的order by 發揮了作用,因為有limit ,order 會實際影響結果集,有意義.