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的聚合键是为了筛选子数据表的,对于聚合键的选择就应该容易明白了。