1. 程式人生 > >SQL查詢語句where,group by,having,order by的執行順序和編寫順序

SQL查詢語句where,group by,having,order by的執行順序和編寫順序

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

一、使用count(列名)當某列出現null值的時候,count(*)仍然會計算,但是count(列名)不會。

二、資料分組(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後的條件表示式裡不允許使用聚合函式(count(),sum(),avg(),max(),min()),而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個結果集排序。

(小清筆記:from --> where --[result 1]--> group by --[result 2]--> select (x N) --[result 3]--> having --[result 4]--> order by --> OUTPUT

例子: 完成一個複雜的查詢語句,需求如下: 按由高到低的順序顯示個人平均分在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

作者:Gakki的笑顏 連結:https://www.jianshu.com/p/fe14b97844cf 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。