1. 程式人生 > >oracle, group by, having

oracle, group by, having

組查詢
所謂組查詢即將資料按照某列或者某些列相同的值進行分組,然後對改組的資料進行組函式運用
語法:
select ...
from ...
where ...
group by col_name,col_name
having ...
order by...


group by col_name:即將資料按照col_name相同值進行分組
組函式常見有5個:
avg:求平均值
count:求總數
max:最大值
min:最小值

sum:求和

分組函式的最大特點:把資料按照某個條件分完組之後,組函式可以分別對每個組中的資料進行運算

select    ...
from      ...
where     ...
group by  ...
having    ...
order by  ...

執行順序:
where條件篩選-->group by分組-->組函式-->having條件篩選-->order by排序

where和having:
   1.where和having都是做條件篩選的
   2.where執行的時間比having要早
   3.where後面不能出現組函式
   4.having後面可以出現組函式
   5.where語句要跟著from後面
   6.having語句要跟著group by後面

group by和having
   1.group by可以單獨存在,後面可以不出現having語句
   2.having不能單獨存在,有需要的話,必須出現在group by後面

select、having和group by
   1.select或者having語句後面如果出現了組函式,那麼其他的沒有被組函式修飾的列就一定要出現在group by的後面.

order by
   1.order by如果需要的話,就一定要寫在sql語句的最後面
   2.order by後也可以出現組函式

需求:檢視所有部門的部門工資,按照部門工資的降序排序
select dept_id,sum(salary) dept_salary
from s_emp
group by dept_id
order by dept_salary desc;
練習:檢視各個部門的最高工資
      檢視各個部門的員工數
      檢視各個部門的平均工資
      檢視各個部門的最低工資

注意1:沒有出現在group by子句中和組函式中的列,不能出現在select子句中
如:
select dept_id,last_name,max(salary)
from s_emp
group by dept_id;
(錯誤)並不能找到工資最大的員工名字
注意2:當group by子句中出現多列的時候,表示按照從左至右的順序進行分組,即先按照第一列分組,然後再第一列分好的組裡面 按照第二列進行分組,以此類推。
注意3:如果限制條件中出現了組函式,該條件必須放到having子句中,不能放在where子句中
需求:檢視部門平均工資大於1000的部門id
select dept_id,avg(salary)
from s_emp
group by dept_id

having avg(salary) > 1000;

case:

查詢每個部門的平均工資?對平均工資降序排序.平均工資大於1400.
select avg(salary)
from s_emp
group by dept_id
having avg(salary)>1400
order by avg(salary) desc;

查詢各個部門各個職稱的平均薪水和最大薪水,
並且平均薪水大於2000的部門id。
select dept_id,title,avg(salary),max(salary)
from s_emp
group by dept_id,title
having avg(salary)>2000;

查詢title中不包含VP字串的每個職位的平
均薪水,並對平均薪水進行降序排列,並且每個職位
的總薪水大於5000。
select avg(salary),title
from s_emp
where title not like '%VP%'
group by title
having sum(salary)>5000
order by avg(salary) desc;

查詢41號部門的平均工資
select avg(salary)
from s_emp
where dept_id=41
group by dept_id;

select avg(salary)
from s_emp
group by dept_id
having dept_id=41;

select avg(salary)
from s_emp
where dept_id=41;

select avg(salary),dept_id
from s_emp
where dept_id=41
group by dept_id;

檢視部門平均工資大於32號部門平均工資的部門id

select avg(se.salary)
from s_emp se
where se.dept_id=32;

select se.dept_id
from s_emp se
group by dept_id
having avg(se.salary)>(
select avg(se.salary)
from s_emp se
where se.dept_id=32
);

查詢工資大於Smith所在部門平均工資的員工的資訊  

select avg(salary)
from s_emp se
group by dept_id
having se.dept_id=(
select dept_id
from s_emp
where last_name='Smith'
);

select id,last_name,salary
from s_emp
where salary>(
select avg(salary)
from s_emp se
group by dept_id
having se.dept_id=(
select dept_id
from s_emp
where last_name='Smith'
)
);