SQL結果排序與HAVING
SQL結果排序
默認SELECT出來的數據是無須排列的,當然,有時候看起來可能像是按照一定順序排列的。然而那只是偶然。
我們如果想要SELECT出來的結果是按照一定順序排列的話,就需要使用到ORDER BY
指令。該指令的使用格式為ORDER BY <排序鍵> <排序規則>
。
其中,排序規則不是必須的,如果不指定排序規則的話,默認就是ASC
升序,如果想要降序的話,就應該使用DESC
。
之前有講到NULL值不能用於比較,因為他的返回值是一個不確定值。而對於ORDER BY
來講,擁有NULL值的行會集中出現在開頭或者結尾。有的DBMS可以選擇其出現的位置。
ORDER BY
的執行出現的返回結果之前的最后一步。同時,即使是SELECT之句中沒有出現過的列也可以作為排序鍵。
排序鍵允許有多個,同時可以對多個排序鍵指定不同的排序規則。
HAVING
與WHERE的作用都是限制數據的條件,但是他們的作用有明顯的不同。
WHERE用來篩選數據記錄,而HAVING用來篩選GROUP BY
之后生成的子數據表。然而有時候我們可以發現使用HAVING或者WHERE的結果並沒有區別,都可以得到自己想要的數據。
但是優先選擇WHERE,因為一般來講他更快。
同時HAVING的聚合鍵允許使用函數以及常數,聚合函數以及GROUP BY
使用的聚合鍵。
總結
現在我們再排一遍語法順序:
SELECT --> FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY
DBMS的執行順序是:
FROM --> WHERE --> GROUP BY --> HAVING --> SELECT --> ORDER BY
我們可以發先語法順序和執行順序還是擁有很大差別的。
同時之前有講到GROUP BY
不能夠使用SELECT子句中定義的別名,從這里就可以看出原因。因為GROUP BY
的執行在SELECT子句之前。然后ORDER BY
是可以使用定義的別名的。
同時HAVING的聚合鍵和WHERE的聚合鍵擁有同樣的限制。我們只要明白HAVING的聚合鍵是為了篩選子數據表的,對於聚合鍵的選擇就應該容易明白了。