欢迎光临
个人知识库,ERP、IT知识分享和应用

SQL - Order By如何处理NULL

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升序排列)

未经允许不得转载:Blog.XiaoMing.Xyz » SQL - Order By如何处理NULL

登录

找回密码

注册