Oracle的多表查詢、分組查詢、自連接、子查詢(6)

目錄

 

一.分組查詢  

二.多表查詢的一些概念

三.子查詢

四.分頁查詢


一.分組查詢  

  • -- 查詢各個部門平均工資
    select e.deptno,avg(e.sal)
    from emp e
    group by e.deptno;
    
    -- 查詢工資高於800員工各部門的平均工資
    -- where 需要在group up前,這是分組前各數據的判斷
    select e.deptno,avg(e.sal) -- 查詢的字段除了分組用到的字段其他一律要使用聚合函數作處理(非子查詢情況下)
    from emp e
    where e.sal>800
    group by e.deptno;
    
    -- 查詢工資高於800且部門平均工資大於2000的部門
    select e.deptno,avg(e.sal)
    from emp e
    where e.sal>800
    group by e.deptno
    having avg(e.sal)>2000;

     

二.多表查詢的一些概念

  • 1.迪卡爾積
    •  白話:同時查詢多個表,查詢出的總數據量是每張表數據條數之間的乘積
  • 2.連表查詢
    • A.傳統連表查詢
    • -- 傳統的連表查詢
      -- 內連表查詢數據
      select * 
      from emp e
      inner join dept d 
      on e.deptno=d.deptno;
      
      -- 外聯查詢數據(左右外聯查詢到的數據不一定是一樣的,比如null值)
      -- 左外聯
      select * 
      from emp e
      left join dept d 
      on e.deptno=d.deptno;
      -- 右外聯
      select * 
      from emp e
      right join dept d 
      on e.deptno=d.deptno;

       

    • B.改進後的連表查詢

    • -- 改進的連表查詢(此時查詢的數據都是兩個表相關聯的,如果其中一個值關聯爲空是不會顯示的)
      select * 
      from dept d, emp e
      where d.deptno=e.deptno;

       

    • C.oracle特有的連表查詢

    • -- oracle的聯表查詢
      -- '+'在左相當於右連表查詢,按右邊字段匹配
      -- '+'在右相當於左連表查詢,按左邊字段匹配
      select * 
      from dept d, emp e
      where d.deptno=e.deptno(+);

        

  • 3.自連接,(查詢自身表中字段的一些連接)

    • 1.使用

      • -- 自連接
        -- 打印員工以及員工領到
        select e1.ename,e2.ename
        from emp e1,emp e2
        where e1.mgr = e2.empno

         

    • 2.注意,自連表不能夠出現判斷串值的情況

      • --查詢員工姓名,員工部門名稱,員工領導姓名,員工領導部門名稱
        -- 判斷無串值
        select e1.ename,e2.ename,d1.dname,d2.dname
        from emp e1,emp e2,dept d1,dept d2
        where e1.mgr = e2.empno
        and e1.deptno=d1.deptno
        and e2.deptno = d2.deptno;
        
        -- 以下數據就是串值,
        select e1.ename,e2.ename,d1.dname,d2.dname
        from emp e1,emp e2,dept d1
        where e1.mgr = e2.empno
        and e1.deptno=d1.deptno -- 串值部分,這兩個判斷是and 最後等同於 e1.deptno = e2.deptno 與我們的目的不合,所以需要在添加一個表
        and e2.deptno = d1.deptno;
        
        

          

三.子查詢

  •  1.基本的子查詢
    • -- 查詢出工資和10號部門任意員工一樣的員工信息
      select * 
      from emp 
      where sal 
      in   -- 此處建議使用in,如果子查詢的結果不是唯一那麼就會報錯,一般只有查詢id纔是唯一
      (select sal from emp where deptno = 10)

       

  • 2.連表子查詢

    • -- 查詢每個部門最低工資,最低工資員工姓名,該員工部門名稱
      -- 先查出部門的最低工資
      select deptno,min(sal)
      from emp 
      group by deptno;
      -- 使用連表查詢
      select t.msal,e.ename,d.dname
      from 
         (select deptno,min(sal) msal  -- 子查詢中可以使用別名,因爲from不管怎麼樣都是先執行
                                       -- 因此定義的別名where也是可以使用
         from emp 
         group by deptno) t,emp e,dept d
      where t.msal=e.sal
      and t.deptno = d.deptno;

       

四.分頁查詢

  • -- 分頁查詢
    -- rownum:給所有查詢的數據按照順序提供一個行號(oracle分頁是基於此函數的)
    -- 問題:rownum行號被打亂
    -- 原因:因爲執行順序的問題from>select>order by 
    --       所以rownum賦值行號後,才進行排序
    select rownum, e.* from emp e order by e.sal desc;
    
    -- 將查詢出來的結果在作爲一個表格,這樣就沒有了排序問題
    -- 查詢無結果:因爲rownum不能夠直接判斷大於0的整數,而使用別名又不行,where優先級大於select
    -- 解決辦法:在套一層查詢
    select rownum  ,t.*
    from (select e.* from emp e order by e.sal desc) t
    where rownum<11 and rownum>5;
    
    -- 解決查詢無結果(最終版)
    --此時就可以使用別名了,別名在from中,from優先級大於where
    select * 
    from(
        select rownum rn ,t.*
            from (select  e.* from emp e order by e.sal desc) t
        where rownum<11) 
    where rn>5; 
    
    -- 以後的模板
    -- 以後的模板
    select * 
    from(
        select rownum rn ,t.*
        from (
            select  e.* from emp e order by e.sal desc-- 此處爲各種數據篩選條件
        ) t
        where rownum<11) 
    where rn>5; 
    

     

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章