问题来了。执行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。

SQL - Order By如何处理NULL的更多相关文章

  1. sql求和涉及到null值

    SQL ISNULL().NVL().IFNULL() 和 COALESCE() 函数 请看下面的 "Products" 表: P_Id ProductName UnitPrice ...

  2. 在SQL Server里如何处理死锁

    在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL ...

  3. SQL Server里如何处理死锁

    在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL ...

  4. 【原创】6. 在MYSQL++中实现SQL语法中的NULL

    这次要说明的是在MYSQL++中为了实现SQL中的NULL而做出的一系列的举措.我的感觉是Null<T, B>类型通常出现在SSQLS和template Query中比较多. 1. 什么是 ...

  5. org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.

    今天报了这个异常,这是页面报的 org.springframework.dao.DataIntegrityViolationException: could not execute statement ...

  6. SQL ORDER BY 关键字

    SQL ORDER BY 关键字 ORDER BY 关键字用于对结果集进行排序. SQL ORDER BY 关键字 ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序. ORDER BY ...

  7. SQL中IS NOT NULL与!=NULL的区别

    平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS ...

  8. SQL-W3School-基础:SQL ORDER BY 子句

    ylbtech-SQL-W3School-基础:SQL ORDER BY 子句 1.返回顶部 1. ORDER BY 语句用于对结果集进行排序. ORDER BY 语句 ORDER BY 语句用于根据 ...

  9. SQL Server里如何处理死锁 (转)

    http://www.cnblogs.com/woodytu/p/6437049.html 在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以 ...

随机推荐

  1. Netty_TCP拆包粘包解决方案

    一.问题 熟悉tcp编程的可能都知道,无论是服务器端还是客户端,当我们读取或者发送数据的时候,都需要考虑TCP底层的粘包/拆包机制. TCP是一个“流”协议,所谓流就是没有界限的遗传数据,大家可以想象 ...

  2. linux线程及互斥锁

    进程是资源管理的最小单元,线程是程序执行的最小单元.在操作系统的设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销. 就像进程有一个PID一样,每个线程也有 ...

  3. SSM-MyBatis-04:Mybatis中使用properties整合jdbc.properties

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------properties整合jdbc.properties首先准备好jdbc.properties,里面的key值写 ...

  4. Mysql 30条军规

    一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...

  5. 理解Flexbox弹性盒子

    http://www.w3cplus.com/css3/understanding-flexbox-everything-you-need-to-know.html参考文档 1:要开始使用Flexbo ...

  6. Elasticsearch笔记四之配置参数与核心概念

    在es根目录下有一个config目录,在此目录下有两个文件分别是elasticsearch.yml和logging.yml. logging.yml是日志文件,es也是使用log4j来记录日志的,我在 ...

  7. copy.copy()与copy.deepcopy()的详解

    copy.copy() 元组和列表调用这个方法效果也不一样. 元组的效果: a = [1,2,3] b = [4,5,6] c = (a,b) e = copy.copy(c) 可以看到:e和c是指向 ...

  8. BZOJ_1407_[Noi2002]Savage_EXGCD

    BZOJ_1407_[Noi2002]Savage_EXGCD Description Input 第1行为一个整数N(1<=N<=15),即野人的数目. 第2行到第N+1每行为三个整数C ...

  9. Android 画文字图

    画图 private Bitmap getbitmap(String content) { Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.C ...

  10. 发送email

    package com.rjj.d; import java.security.GeneralSecurityException; import java.util.Date; import java ...