Heim >Datenbank >MySQL-Tutorial >MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法

MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法

WBOY
WBOYOriginal
2016-06-07 15:52:211378Durchsuche

【sqlserver】: sqlserver 认为 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的列作为查询条件时,无论使用>/>=/

MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法

id为4的age字段为空,

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

MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法

执行SQL:select * from student where age

MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法

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

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

刚开始student表数据如下:

MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法

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

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

MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法

非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。此规定在比较运算符中引入了三值逻辑,而要正确运用该逻辑很困难。[摘自Microsoft SQLServer联机丛书]


SQL中null值索引优化的文章:

【摘】SQL优化:NULL值与索引的使用

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn