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'
)
);