MySQL復雜查詢


一、基本介紹-為什么需要多表查詢

 

說明: 我們在實際開發中,必然會遇到,數據來自不同的表,這時,我們就需要使用多表聯合查詢。

      快速入門案例

   

 

        ?顯示雇員名,雇員工資及所在部門的名字

  分析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 會實際影響結果集,有意義.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM