zoukankan      html  css  js  c++  java
  • mysql 等 null 空值排序

    【sqlserver】:

    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

    【oracle】:

    oracle认为 null 最大。

    升序排列,默认情况下,null值排后面。

    降序排序,默认情况下,null值排前面。

    有几种办法改变这种情况:

    (1)用 nvl 函数或decode 函数 将null转换为一特定值

    (2)用case语法将null转换为一特定值(oracle9i以后版本支持。和sqlserver类似):
    order by (case mycol when null then '北京漂客'     else   mycol   end)

    (3)使用nulls first 或者nulls last 语法。

    这是oracle专门用来null值排序的语法。

    nulls first :将null排在最前面。如:select * from mytb order by mycol nulls first

    null last :将null排在最后面。如:select * from mytb order by mycol nulls last

    如果要想让含有null的列按照自己的意愿进行排序,可做如上处理。

    【mysql】:

    MySQL同sqlserver,null默认最小,解决办法同sqlserver


    注意:
    1、null的列作为查询条件时,无论使用>/</>=/<=都是不符合条件的,只能使用isNull来判断。如下:

     

    id为4的age字段为空,

    执行SQL:select * from student where age >= 30; 结果如下:

    执行SQL:select * from student where age < 30; 结果如下:

    只有执行SQL:select * from student where age is null; 才能查询出age为null的数据。

    2、对null做加、减、乘、除等运算操作,结果仍为空

    刚开始student表数据如下:

    执行SQL:update student set age = age + 20;

    执行SQL:select * from student; 结果如下:

    非null的age字段都更新为+20,而null字段依然为空。

    上面的测试数据库为MySQL,Oracle也一样。SQL Server没测试过,应该也是一样的。

    空值
    列可以接受或拒绝空值。在数据库内 NULL 是特殊值,代表未知值的概念。NULL 不同于空字符或 0。空字符实际上是有效字符,0 是有效数字。而 NULL 只是表示该值未知这一概念。NULL 也不同于零长度字符串。如果列定义中包含 NOT NULL 子句,则不能为该行插入含有 NULL 值的行。如果列定义中仅包含 NULL 关键字,则接受 NULL 值。

    在列内允许 NULL 值会增加使用该列的逻辑比较的复杂性。SQL-92 标准规定:对 NULL 值的任何比较都不取值为 TRUE 或 FALSE,而是取值为 UNKNOWN。此规定在比较运算符中引入了三值逻辑,而要正确运用该逻辑很困难。

  • 相关阅读:
    2020 牛客 NOIP 赛前集训营 提高级(第四场) B-色球 平衡树模板
    P4084 [USACO17DEC]Barn Painting G
    CSP-S 2020
    CQOI 2020省选
    我回来了
    hdu3605(二分图多重匹配伪模板)
    舞动的夜晚(二分图的必须边和可行边)
    poj3436(最大流+拆点)
    P2954([USACO09OPEN]移动牛棚Grazing2,dp)
    CSP-S 2020 游记
  • 原文地址:https://www.cnblogs.com/thinkingthigh/p/6880090.html
Copyright © 2011-2022 走看看