當(dāng)一個查詢語句同時出現(xiàn)了where,group by,having,order by的時候,執(zhí)行順序和編寫順序。
count(列名)
使用count(列名)當(dāng)某列出現(xiàn)null值的時候,count(*)仍然會計算典予,但是count(列名)不會
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差不多
1.having只能用在group by之后抄瑟,對分組后的結(jié)果進行篩選(即使用having的前提條件是分組)凡泣。
2.where肯定在group by 之前,即也在having之前皮假。
3.where后的條件表達式里不允許使用聚合函數(shù)(count(),sum(),avg(),max(),min())鞋拟,而having可以。
執(zhí)行順序和編寫順序
當(dāng)一個查詢語句同時出現(xiàn)了where,group by,having,order by的時候
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