數據庫之分組


概念

按照一定標准把數據分成若干部分

語法

from  表名
    where  條件
        group  by  分組標准
        (group標准的要寫在where之后,沒有where寫在from之后)        

 

語句:select  dept_id,count(id)  from  s_emp  group  by  dept_id;
  • 實際執行時先執行from  s_emp
  • 再執行group by  dept_id
  • 最后是統計輸出select  dept_id,count(id)

 

如何對組數據進行過濾

  • where是對表數據進行過濾的。
  • 組數據過濾有特殊的語法——having
  • having要加在group后面

演示:按照部門號分組,統計每個部門的人數,顯示人數大於2的部門並且按部門號降序排列

select dept_id, count(id) from s_emp group by dept_id having count(id)>2 order by dept_id desc;

演示:按照部門號分組,統計每個部門的平均工資,顯示平均工資大於1300的部門

select dept_id, avg(salary) from s_emp group by dept_id having avg(salary)>1300;

 

在分組語句中,select后的字段要么是分組標准,要么是經過合適組函數處理過的內容

舉例:按照部門號分組,統計每個部門的平均工資,顯示平均工資大於1300的部門,還要顯示部門名

select dept_id, avg(salary), name from s_emp e, s_dept d where dept_id=d.id group by dept_id, name having avb(salary)>1300; 

(存在一些問題)匹配顯示次數問題

所以用組函數,因為組函數只會有一個結果, 如果用count:

select dept_id, avg(salary), count(name) from s_emp e, s_dept d where dept_id=d.id group by dept_id having avg(salary)>1300;

 

如果用max:

select dept_id, avg(salary), max(name) from s_emp e, s_dept d where dept_id=d.id group by dept_id having avg(salary)>1300;

 

因為可能會有的部門沒有對應部門名,數據會丟失,則要全部顯示部門表的內容,所以還要加上外連接。

select dept_id, avg(salary), count(name) from s_emp e, s_dept d where dept_id=d.id(+) group by dept_id having avg(aslary)>1300;

 sql語句的執行順序

(1)from   先找到要操作的表

(2)where  會有過濾條件

(3)group  by  分組肯定在having之前

(4)having   對組數據進行過濾  通過下面舉例的別名可以確定having和select的執行順序

(5)select    查詢輸出(語法規則要求select寫前面)

(6)order  by   永遠在最后

演示:按照部門號分組,統計每個部門的人數,要求顯示部門人數大於2的部門,還要求按照人數進行排序

select dept_id, count(id) ac from s_emp group by dept_id having count(id)>2 order by ac;

 


免責聲明!

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



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