1. 程式人生 > 其它 >MySQL高階查詢(聚合函式與分組查詢)

MySQL高階查詢(聚合函式與分組查詢)

聚合函式:

  聚合函式在資料的查詢分析中,應用十分廣泛。聚合函式可以對資料求和、求最大值和最小值、求平均值等等。

  聚合函式不能出現在where子句中,這是一種語法錯誤,聚合函式執行需要一個數據範圍,而在where子句執行時還未劃出這個範圍。

  1.sum函式由於求和,只能用於數字型別,字元型別的統計結果為0,日期型別統計結果是毫秒數相加

  2.max函式用於獲得非空值的最大值。

  3.min函式用於獲得非空值的最小值。

  4.avg函式用於獲得非空值的平均值,非數字資料統計結果為0。

  5.count(*)用於獲得包含空值的記錄數,count(列名)用於獲得包含非空值的記錄數。

#查詢所有員工工資的平均值
select avg( sal+ifnull(comm,0) ) as avg from t_emp #查詢10,20部門員工的工資總和 select sum(sal) from t_emp where deptno in(10,20); #查詢10,20部門中,月收入最高的員工 select max(sal+ifnull(comm,0)) from t_emp where deptno in(10,20); #查詢員工名字最長的是幾個字元 select max(length(ename)) from t_emp; #查詢員工表中所有記錄的數量 select count(*) from t_emp; #查詢comm欄位中非空的記錄數量
select count(comm) from t_emp; #查詢10和20部門中,底薪超過2000元並且工齡超過15年的員工人數 select count(*) from t_emp where deptno in(10,20) and sal>=2000 and datediff(now(),hiredate)/365>=15;

資料庫表的分組查詢:

  預設情況下彙總函式是對全表範圍內的資料做統計,group by子句的作用是通過一定的規則將一個數據集劃分成若干個小的區域,然後針對每個小區域分別進行資料彙總處理。

  資料庫支援多列分組條件,執行的時候逐級分組。

  查詢語句中如果含有group by子句,那麼select子句中的內容就必須要遵守規定: select子句中可以包括聚合函式,或者group by子句的分組列,其餘內容均不可以出現在select子句中。


   with rollup關鍵字:對彙總結果再次進行彙總計算。  

  group_concat函式可以把分組查詢中的某個欄位拼接成一個字串

#查詢每個部門的平均底薪, round四捨五入到整數位
select deptno,round(avg(sal))
from t_emp group by deptno;
#逐級分組,查詢每個部門裡,每種職位的人員數量和平均底薪
select deptno,job,count(*),avg(sal) as _avg
from t_emp group by deptno,job
order by _avg desc;
#對分組結果集再次做彙總計算,with rollup關鍵字:對彙總結果再次進行彙總計算
select deptno,count(*),avg(sal),sum(sal),max(sal),min(sal)
from t_emp 
group by deptno with rollup;
#查詢每個部門內底薪超過2000元的人數和員工姓名
select deptno,group_concat(ename),count(*)
from t_emp where sal>=2000
group by deptno;

  having子句功能和where子句一樣,實現資料的篩選,having子句只能放在group by後面。

  having子句的特殊用法:按照數字1分組,MySQL會依據select子句中的列進行分組,having子句也可以正常使用

#查詢平均薪資超過2000的部門
select deptno
from t_emp
group by deptno having avg(sal)>=2000;
#查詢每個部門中,1982年以後入職的員工超過2個人的部門編號
select deptno
from t_emp
where hiredate>="1982-01-01"
group by deptno having count(*)>=2;
#having子句的特殊用法
#1代表用select中第1個欄位進行分組
select deptno,count(*) from t_emp
group by 1;
#可以用having替代where的內容,由於執行速度慢不建議這麼寫
select deptno,count(*) from t_emp
group by 1 having deptno in(10,20);