1> SQL – Order By如何处理NULL
问题来了。执行SQL语句
SELECT * FROM tbl ORDER BY x, y
如果用来排序的列x、y当中有NULL值,那么它们的顺序是怎样的呢?
不同的数据库有不同的答案,目前的主流数据库大致分为两派。
一、NULL最大派
这一派包括PostgreSQL、Oracle、DB2等。它们的原则是,排序时NULL比其他的值都要大。
最大派还有一个共性,就是都支持NULLS FIST/LAST关键字。它可以强制指定NULL在排序结果中的位置。NULLS FIRST会将所有NULL放到排序结果的最前面,NULLS LAST则将NULL放到所有结果的后面。两种情况都无视排序是升序的还是降序的。
用法如下
SELECT * FROM tbl ORDER BY x NULLS FIRST, y DESC NULLS LAST
二、NULL最小派
最小派认为排序时NULL小于所有的值。属于这一派的有MySQL、SQL Server等。还有Apache Hive也是这一派……如果你认为它是数据库的话。
上面三个最小派成员都不支持NULLS FIRST/LAST关键字。如果你有什么想不开,非要改变NULL的默认排序,只能运用一些技巧了。比如这样
SELECT * FROM tbl ORDER BY IF(ISNULL(x), 1, 0)
这里使用了IF和ISNULL两个函数,相当于创建了一个新列。如果x是NULL,这一列是1;如果x不是NULL,这一列是0。对新列排序,相当于NULL变成了最大值。
最小派里还有一个另类人物,SparkSQL。它不是数据库,但是支持SQL。SparkSQL也将NULL视为最小,同时它也支持NULLS FIRST/LAST。
2> sql server 中order by 中关于null值处理
sqlserver 认为 null 最小。
升序排列:null 值默认排在最前。
要想排后面,则:order by case when col is null then 1 else 0 end ,col
降序排列:null 值默认排在最后。
要想排在前面,则:order by case when col is null then 0 else 1 end , col desc
1、on 、where、having中把unknown当作FALSE处理,使用筛选器为unknown的行会排除在外,
而check约束中的unknown的值被当做true,假设一个check约束中要求salary大于0,插入salary为null
的行可以被接受 NUll > 0 的结果为unknown
2、unique约束、排序、分组认为两个NULL是相等的
如果表的一列被定义为unique约束,将不能插入两个为NULL值得行
group by 把所有null分为一组
order by 把所有的null值排列在一起
select distinct top col from t order by col
先执行distinct –》order by –》top
3> sql中order by对null值的排序
在mysql中认为null在排序时为最小值,即ASC排序时在最前面,DESC排序时在最后
oracle中认为null在排序时为最大值,即ASC排序时在最后面,DESC排序时在最前
order by在进行多个字段排序时,如 select * from 表名 where 条件 order by id ASC,age DESC
先是按 id 升序排列 (优先)
如果 id 字段 有些是一样的话 再按age 降序排列 (前提是满足id升序排列)