當(dāng)一個查詢語句同時出現(xiàn)了where,group by,having,order by的時候肿仑,執(zhí)行順序和編寫順序湿硝。
一犀斋、使用count(列名)當(dāng)某列出現(xiàn)null值的時候律胀,count(*)仍然會計算宋光,但是count(列名)不會。
二炭菌、數(shù)據(jù)分組(group by ):
select 列a,聚合函數(shù)(聚合函數(shù)規(guī)范) from 表明 where 過濾條件 group by 列a group by 字句也和where條件語句結(jié)合在一起使用罪佳。當(dāng)結(jié)合在一起時,where在前黑低,group by 在后赘艳。即先對select xx from xx的記錄集合用where進行篩選,然后再使用group by 對篩選后的結(jié)果進行分組克握。
三蕾管、使用having字句對分組后的結(jié)果進行篩選,語法和where差不多:
having 條件表達式 需要注意having和where的用法區(qū)別:
1.having只能用在group by之后菩暗,對分組后的結(jié)果進行篩選(即使用having的前提條件是分組)掰曾。
2.where肯定在group by 之前,即也在having之前停团。
3.where后的條件表達式里不允許使用聚合函數(shù)(count(),sum(),avg(),max(),min())旷坦,而having可以掏熬。
四、當(dāng)一個查詢語句同時出現(xiàn)了where,group by,having,order by的時候秒梅,執(zhí)行順序和編寫順序是:
1.執(zhí)行where xx對全表數(shù)據(jù)做篩選旗芬,返回第1個結(jié)果集。
2.針對第1個結(jié)果集使用group by分組捆蜀,返回第2個結(jié)果集疮丛。
3.針對第2個結(jié)果集中的每1組數(shù)據(jù)執(zhí)行select xx,有幾組就執(zhí)行幾次漱办,返回第3個結(jié)果集这刷。
4.針對第3個結(jié)集執(zhí)行having xx進行篩選,返回第4個結(jié)果集娩井。
5.針對第4個結(jié)果集排序暇屋。
(小清筆記:from --> where --[result 1]--> group by --[result 2]--> select (x N) --[result 3]--> having --[result 4]--> order by --> OUTPUT)
例子:
完成一個復(fù)雜的查詢語句,需求如下:
按由高到低的順序顯示個人平均分在70分以上的學(xué)生姓名和平均分洞辣,為了盡可能地提高平均分咐刨,在計算平均分前不包括分數(shù)在60分以下的成績,并且也不計算賤人(jr)的成績扬霜。
分析:
1.要求顯示學(xué)生姓名和平均分 因此確定第1步select s_name,avg(score) from student
2.計算平均分前不包括分數(shù)在60分以下的成績定鸟,并且也不計算賤人(jr)的成績 因此確定第2步 where score>=60 and s_name!=’jr’
3.顯示個人平均分 相同名字的學(xué)生(同一個學(xué)生)考了多門科目 因此按姓名分組 確定第3步 group by s_name
4.顯示個人平均分在70分以上 因此確定第4步 having avg(s_score)>=70
5.按由高到低的順序 因此確定第5步 order by avg(s_score) desc
原文地址:http://blog.csdn.net/superhosts/article/details/39298529