一、基本介紹-為什麼需要多表查詢
說明: 我們在實際開發中,必然會遇到,資料來自不同的表,這時,我們就需要使用多表聯合查詢。
快速入門案例
?顯示雇員名,雇員工資及所在部門的名字
分析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 會實際影響結果集,有意義.