天天看點

14、oracle:where,group by,having,order by

oracle中的where,group by,having,order by很容易混淆和弄錯,這裡找到一篇很好的文章

本文來自:http://dong-shuai22-126-com.iteye.com/blog/1564971

"group by 字段清單" 

表示根據後面的字段來分組,如果隻有1個字段,那隻是根據這個字段的值來進行一次分組就可以了;若後面有多個字段,那表示根據多字段的值來進行層次分組,分組層次從左到右,即先按第1個字段分組,然後在第1個字段值相同的記錄中,再根據第2個字段的值進行分組;接着第2個字段值相同的記錄中,再根據第3個字段的值進行分組......依次類推。 

一.資料分組(group by ): 

select 列a,聚合函數(聚合函數規範) from 表明 

where 過濾條件 

group by 列a 

group by 字句也和where條件語句結合在一起使用。當結合在一起時,where在前,group by 在後。即先對select xx from xx的記錄集合用where進行篩選,然後再使用group by 對篩選後的結果進行分組。 

二.使用having字句對分組後的結果進行篩選,文法和where差不多:having 條件表達式 

需要注意having和where的用法差別: 

1.having隻能用在group by之後,對分組後的結果進行篩選(即使用having的前提條件是分組)。 

2.where肯定在group by 之前,即也在having之前。 

3.where後的條件表達式裡不允許使用聚合函數,而having可以。 

三、當一個查詢語句同時出現了where,group by,having,order by的時候,執行順序和編寫順序是: 

1.執行where xx對全表資料做篩選,傳回第1個結果集。 

2.針對第1個結果集使用group by分組,傳回第2個結果集。 

3.針對第2個結果集中的每1組資料執行select xx,有幾組就執行幾次,傳回第3個結果集。 

4.針對第3個結集執行having xx進行篩選,傳回第4個結果集。 

5.針對第4個結果集排序。 

例子: 

完成一個複雜的查詢語句,需求如下: 

按由高到低的順序顯示個人平均分在70分以上的學生姓名和平均分,為了盡可能地提高平均分,在計算平均分前不包括分數在60分以下的成績,并且也不計算賤人(jr)的成績。 

分析: 

1.要求顯示學生姓名和平均分 

是以确定第1步select s_name,avg(score) from student 

2.計算平均分前不包括分數在60分以下的成績,并且也不計算賤人(jr)的成績 

是以确定第2步 where score>=60 and s_name!=’jr’ 

3.顯示個人平均分 

相同名字的學生(同一個學生)考了多門科目 是以按姓名分組 

确定第3步 group by s_name 

4.顯示個人平均分在70分以上 

是以确定第4步 having avg(s_score)>=70 

5.按由高到低的順序 

是以确定第5步 order by avg(s_score) desc