diff --git a/ch02: 基础查询与排序.md b/ch02: 基础查询与排序.md index 2100586..06ae66f 100644 --- a/ch02: 基础查询与排序.md +++ b/ch02: 基础查询与排序.md @@ -467,10 +467,37 @@ FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。 其中SELECT的执行顺序在 GROUP BY 子句之后,ORDER BY 子句之前。也就是说,当在ORDER BY中使用别名时,已经知道了SELECT设置的别名存在,但是在GROUP BY中使用别名时还不知道别名的存在,所以不能在ORDER BY中可以使用别名,但是在GROUP BY中不能使用别名 ## -## 2.7.3 ORDER BY 排序列中存在 `NULL` 时,指定其出现在首行或者末行的方式 +## 2.7.3 ORDER BY 排序列中存在 NULL 时,指定其出现在首行或者末行的方式 在MySQL中,`NULL` 值被认为比任何 `非NULL` 值低,因此,当顺序为 ASC(升序)时,`NULL` 值出现在第一位,而当顺序为 DESC(降序)时,则排序在最后。 +如果想指定存在 `NULL` 的行出现在首行或者末行,需要特殊处理。 + +使用如下代码构建示例表: + +```sql +CREATE TABLE user ( + id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(5), + date_login DATE, + PRIMARY KEY (id) +); + +INSERT INTO user(name, date_login) VALUES +(NULL, '2017-03-12'), +('john', NULL), +('david', '2016-12-24'), +('zayne', '2017-03-02'); +``` +既然排序时,`NULL` 的值比 `非NULL` 值低(可以理解为 `0` 或者 `-∞`),那么我们在排序时就要对这个默认情况进行特殊处理以达到想要的效果。 + +一般有如下两种需求: + +- 将 `NULL` 值排在最后,同时将所有 `非NULL` 值按升序排列。 + +对于数字或者日期类型,可以在排序字段前添加一个负号(minus)来得到反向排序。(`-1、-2、-3....-∞`) + + ##