09-Oracle分組查詢
阿新 • • 發佈:2021-08-05
分組查詢
聚合函式
概念
聚合函式對一組值執行計算並返回單一的值。除 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 後 取別名;