函數的分類
單行函數 對每一行記錄都有作用 對每一行記錄都能傳回一個結果
例子lower(ename) 對每一個記錄的ename字段都傳回一個結果
多行函數
對一組記錄傳回一個結果
聚合函數就是多行函數
例子lower(ename)
select max(sal)from emp
常用的聚合函數
avg 取平均值
sum 取所有值之和
count(ename) 值的個數 不包含 ename=null的值
count(distinct ename)統計不重複的值
count(*)選中的行數
max() 最高值 适用于數值型 字元型和日期型的列
min()最低值
用聚合函數作用于某一字段時,會忽略所有的null行
group by 用于對查詢的結果分組統計
要想把一個表中的記錄分成若幹組,就需要用group by
select name,sum(age) from student group by name 就是根據名字來分組的
重要的注意點::
select name,age from student group by name會報錯 因為一個名字可能對應多個人 意思就是說會有多個age 這個時候 一個名字對應一行資料
但是age也隻能對應一行 可實際上age可以有多個就有問題了 除非age放在聚合函數
having語句的使用
having子句不能出現字段的别名,隻能使用字段最原始的名字,where和havingi樣都不允許出現字段别名,隻允許出現原始的字段名字
having是用來對分組後的資料進行進一步的過濾 是以使用having時通常先用group by 進行分組
比如 select deptno from emp group by deptno having deptno>10
having 裡面的資料必須時select排序中有的 排序中沒有的 應該放在where放在前面條件中就篩洗了
總結 having子句出現的字段必須是分組後整個組的總體資訊
select deptno, avg(sal) as “平均工資”
from emp
group by deptno
having count(*) > 3 這種情況下 count沒有出現在select卻也可以出現在having 後面
having ename like ‘%A%’這種就不可以 因為ename沒有出現在select中
order by
select *from emp order by deptno 按照deptno升序排序
select *from emp order by deptno desc按照deptno降序排序
select *from emp order by deptno,sal desc 按照deptno升序排序,如果deptno相等 就按照 sal降序排序
不允許再where 子句中使用分組函數執行個體
比如:
select deptno, avg(sal) “平均工資”, count(*) “部門人數”, sum(sal) “部門工資總和”
where avg(sal) > 2000 –error 因為where是對原始的資料過濾 不能使用聚合函數 因為還沒有分組
having sum(sal) > 5000 就是會報錯的,因為where有聚合函數
select語句的基本結構
select select_list
from table_list
join 如果有聚合函數 需要對聚合函數取别名
on
where 不能跟聚合函數
group by
having 後面不能跟别名
order by
where 子句是用來篩選由from子句指定的表的行
group by 是用來将where子句輸出的行分組
select中隻能寫group by裡面的列或者是表的整體資訊,比如count avg之類的函數 前提是有group by
having 是用來篩選分組彙總的行
order by是用來控制最後顯示的效果
在内連接配接裡面 where要放在最後