查询语句中select from 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后的條件表達式里不允許使用聚合函數,而having可以。?
四、當一個查詢語句同時出現了where,group?by,having,order?by的時候,執行順序和編寫順序是:?
1.執行where?xx對全表數據做篩選,返回第1個結果集。?
2.針對第1個結果集使用group?by分組,返回第2個結果集。?
4.針對第2個結集執行having?xx進行篩選,返回第3個結果集。
3.針對第3個結果集中的每1組數據執行select?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?
五、索引??
1.索引是單獨的數據庫對象,索引也需要被維護。?2.索引可以提高查詢速度,但會降增刪改的速度。?3.通過一定的查詢觸發,并不是越多越好。?什么時候不適合用索引??
1.當增刪改的操作大于查詢的操作時。?2.查詢的語句大于所有語句的三分之一時。?
創建索引語法:create?index?索引名?on?表明?(列名)?刪除索引語法:drop?index?索引名
總結
以上是生活随笔為你收集整理的查询语句中select from where group by having order by的执行顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [翻译]01-ASP.NET MVC 3
- 下一篇: typeof instanceof