天天看點

函數的了解 group by order by了解

函數的分類

單行函數 對每一行記錄都有作用 對每一行記錄都能傳回一個結果

例子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要放在最後

繼續閱讀