1. 程式人生 > 其它 >09-Oracle分組查詢

09-Oracle分組查詢

分組查詢

聚合函式

概念

​ 聚合函式對一組值執行計算並返回單一的值。除 COUNT 以外,聚合函式忽略空值,如果COUNT函式的應用物件是一個確定列名,並且該列存在空值,此時COUNT仍會忽略空值。

基礎型別:
	1、max() 求最大值
	2、min() 求最小值
	3、sum() 求和
	4、avg() 求平均數
	5、count() 求個數

示例

--1、max() 求最大值
select max(sal) from emp; -- 求emp表中最大工資
--2、min() 求最小值
select min(sal) from emp; -- 求emp表中最底工資
--3、sum() 求和
select sum(sal) from emp; -- 求emp表中的總工資
--4、avg() 求平均數
select avg(sal) from emp; -- 求emp表中的平均工資
--5、count() 求個數
count(*) -- 返回所有欄位行數 不會忽略某欄位空值
count(欄位名/欄位號) -- 返回特定欄位名 會忽略空值 
count(1) -- 一般來講,二維表的第一個欄位為關鍵字,不為空值;使用count(1)也能放回全部行數,因為只需計算一個欄位,所以效率比count(*)高




select count(*) from emp; -- 求emp表中的總人數
select count(1) from emp;

注意

注意:
    1)所有聚合函式都是針對非空值進行的統計(除count外)
	
    2)COUNT()的特殊用法:使用COUNT(*)統計總資料量,若是在確定哪些欄位不含空值的情況下統計總資料量,可以使用COUNT(欄位/欄位號)來統計
	
    3)SUM()和AVG()只針對數值,其他三個可針對任意型別

去重函式

語法

select distinct column1,column2.... from table_name 
  查詢  去除重複  欄位名1,欄位名2.....   從     資料來源

示例

select distinct deptno from emp;

注意

1. distinct 只能緊緊跟在select後面

2. distinct 查詢多個欄位時,這些欄位查詢出的資料完全相同時,才可以去重

去空值函式

去空值函式(對null值處理)

語法

nvl(column,值1)  -- 將colum中的null用 值  去代替  
注意:
	column 與 值1 的資料型別相同  不同型別時需要用到型別轉化


nvl2(column,值1,值2) -- 將colum中的 null 用值1 去代替 , 將 非空值 用值2代替
注意:
	值1可以不與nvl2的資料型別相同,但是值2的資料型別必需與值1的資料型別相同

示例

-- 查詢comm列,如果有空值,把空值設定為空值
select comm,nvl(to_char(comm),'空值') from emp; 
-- 查詢comm列,如果不為空,返回有值,為空時返回空值
select comm,nvl2(comm,'有值','空值') from emp;

分組查詢

​ 資料分組的目的是用來彙總資料或為整個分組顯示單行的彙總資訊。通常在查詢結果集中使用GROUP BY子句對記錄進行分組。在SELECT語句中,GROUP BY子句位於FROM子句之後

語法

​ GROUP BY子句可以基於指定某一列的值將資料集合劃分為多個分組,同一組內所有記錄在分組屬性上具有相同值;也可以基於指定多列的值將資料集合劃分為多個分組。

select column1,column2,... from table_name where condition group by column1 order by column1;
-- 語義:從資料表table_name中根據條件篩選資料,並根據column1分組,查詢資料,並根據column1排序顯示資料;

示例

-- 按照deptno進行分組
select deptno from emp group by deptno;

注意

注意:
    1、對於含有GROUP BY子句的SQL語句,SELECT子句中僅允許出現
      1)GROUP BY中出現過的欄位 
      2)聚合函式
      3)常量

    2、對於不含有GROUP BY 子句,但SELECT子句中含有聚合函式的情況,SELECT子句中除了聚合函式	和常量外,不能再出現其他欄位

    3、分組查詢也有去重效果,但與去重函式有區別
      1)分組查詢是將重複的行聚合在一起
      2)去重是將重複的行取一條出來
      3)distinct 不能出現聚合函式
      4)group by 能出現聚合函式

分組過濾

​ GROUP BY子句經常與聚合函式一起使用。如果SELECT子句中包含聚合函式,則計算每組的彙總值。當用戶指定GROUP BY時,選擇列表中任一非聚合表示式內的所有列都應包含在GROUP BY列表中,或者GROUP BY表示式必須與選擇列表表示式完全匹配。

語法

select column1,column2,... from table_name where condition group by column1 having condition order by column1;

having後可以跟條件:分組後的聚合函式條件,也可以跟欄位條件

示例

select deptno,count(*) from emp group by deptno having count(*) > 3;

注意

WHERE與HAVING的區別和聯絡
    1)都是做篩選條件的

    2)WHERE不必和GROUP BY連用,HAVING必須與GROUP BY連用

    3)WHERE篩選的是針對FROM後表的資料,HAVING針對的是GROUP BY分組之後的資料進行篩選

    4)WHERE中部分條件可以寫在HAVING中,但非常影響執行效率,不建議使用

    5)只有在GROUP BY子句中出現的欄位,才能寫到HAVING子句中

    6)WHERE子句中不可以使用聚合函式,having可以出現聚合函式

執行順序

書寫順序: select => from => where => group by => having => order by
執行順序: from => where => group by => having => select => order by	
		找到資料來源  => where篩選 => 分組 => havin過濾 => 排序   
		
因此能寫在where中的條件都儘量進where中 , 這樣能提高執行效率

CASE ... WHEN ... END 判斷

語法

語法1:
case
  when 條件表示式1 then 
    sql語句1
  when 條件表示式2 then
    sql語句2
  when 條件表示式3 then
    sql語句3
    ......
  else
    sql語句4
end 
語義: 當條件表示式1成立,執行sql語句1,跳過下面所有程式碼
      當條件表示式1不成立,判斷條件表示式2,當條件表示式2成立,執行sql語句2
      當條件表示式1、2不成立,判斷條件表示式3,當條件表示式3成立,執行sql語句3
      當條件表示式1、2、3不成立,執行sql語句4
-------------------------------------------------------------------------------------
語法2:
case 表示式
  when 值1 then
    sql語句1
  when 值2 then
    sql語句2
  when 值3 then
    sql語句3
    ......
  else
    sql語句4
end 
語義: 當表示式滿足值1時,執行sql語句1,
      當表示式不滿足值1,判斷值2,當表示式滿足值2時,執行sql語句2
      當表示式不滿足值1、值2,判斷值3,當表示式滿足值3時,執行sql語句3
      當表示式不滿足值1、值2、值3,執行sql語句4

示例

-- 11.查詢 1982年以前入職的員工,按部門、職員(CLERK)與非職員分組-是否職員,
select deptno,
       case job
         when 'CLERK' then
          '職員'
         else
          '非職員'
       end "是否職員"
  from emp
 where to_char(hiredate, 'yyyy') < '1982'
 group by deptno,
          case job
            when 'CLERK' then
             '職員'
            else
             '非職員'
          end;

注意

CASE ... WHEN ... END 相當於一列,可以在 END 後 取別名;