数据库中null值可以比较吗_数据库查询排序[通俗易懂]

数据库中null值可以比较吗_数据库查询排序[通俗易懂]不同数据库or数据引擎,在排序的时候,是如何看待NULL的大小的?_hive里null是最大值

数据库中null值可以比较吗_数据库查询排序[通俗易懂]"

NULL值的大小

提前总结

NULL值在排序的时候(注意是排序的时候,max等函数是正常的),视为最大还是最小,在不同的数据库或者说数据引擎里是不一样的。
手头只有trino、db2和hive,就实际试了试,这里直接先贴出结论:

  • trino中,null值在排序的时候始终放在最后,即升序时认为最大,降序时认为最小;
  • db2中,null值在排序的时候始终被认为是最大;
  • hive中(mr引擎),null值在排序的时候始终被认为是最小;
  • MaxCompute中,null值在排序的时候始终被认为是最小;

查阅过相关文档,参考文献1里是这么区分的:

  • null最大派(排序时认为空值最大):PostgreSQL、Oracle、DB2等;
  • null最小派(排序时认为空值最小):MySQL、SQL Server等,以及hive;

从参考文献1中学到一个比较有意思的东西,即NULLS FIRSTNULLS LAST关键字。NULL最大派中,可以通过这两个关键字来强制指定NULL在排序时候的位置。NULLS FIRST会将NULL放到排序结果的最前面,NULLS LAST则相反。这两个关键字在使用时直接无视排序是升序还是降序。
用法示例:

SELECT * FROM tbl ORDER BY x NULLS FIRST, y DESC NULLS LAST

如此看来,trino里是相当于排序时默认加了NULLS LAST关键字,因为结果的表现是一样的。

在trino中

trino在排序的时候,死活都把null值放到最后,就是升序的时候认为NULL最大,降序的时候认为NULL最小。

首先我们创建测试表,并且插入几条测试数据

create table ttss_20230704
(
	a integer,
	b varchar
);

insert into ttss_20230704 values (1, '1');
insert into ttss_20230704 values (5, '5');
insert into ttss_20230704 values (null, null);
insert into ttss_20230704 values (2, '2');

表创建完毕,查看下表数据

select * from ttss_20230704;

--a b
--5 5
--[NULL] [NULL]
--2 2
--1 1

尝试max和min函数:

select max(a), min(a) from  ttss_20230704;
-- 打印结果:
-- 5 1

看着是没有问题的。

然后尝试下降序排序:

select * from  ttss_20230704 order by a desc;

-- 输出结果:
--a b
--5 5
--2 2
--1 1
--[NULL] [NULL]

再试下升序排序:

select * from  ttss_20230704 order by a asc;

-- 输出结果:
--a b
--1 1
--2 2
--5 5
--[NULL] [NULL]

可以看到,trino在排序的时候,死活都把null值放到最后。

在DB2中

db2中在排序的时候,会认为是NULL最大

同样建表并插数。
依次做尝试:

select max(a), min(a) from  ttss_20230704;
-- 打印结果:
-- 5 1

select * from  ttss_20230704 order by a desc;
-- 打印结果:
--[NULL] [NULL]
--5 5
--2 2
--1 1

select * from  ttss_20230704 order by a asc;
--1 1
--2 2
--5 5
--[NULL] [NULL]

在HIVE中

基于mr引擎的时候,hive是认为NULL最小

尝试max和min函数:

select max(a), min(a) from  ttss_20230704;
-- 打印结果:
-- 5 1

看着是没有问题的。

然后尝试下降序排序(认为空最小):

select * from  ttss_20230704 order by a desc;

-- 输出结果:
--a b
--5 5
--2 2
--1 1
--[NULL] [NULL]

再试下升序排序(认为空最小):

select * from  ttss_20230704 order by a asc;

-- 输出结果:
--[NULL] [NULL]
--a b
--1 1
--2 2
--5 5

在MaxCompute(原ODPS)

MC是阿里研发的一个云数据仓库,是它的语法是标准语法ANSI SQL92的一个子集。
MC也是null值排序最小派。
直接举例:

SELECT
    num, row_number()over(order by num asc) as idx
from 
(
    select 1 as num
    union
    select 2
    union
    select null
) a;

输出结果:

-- num idx
-- \N 1
-- 1 2
-- 2 3

参考文献

  1. SQL – Order By如何处理NULL

今天的文章数据库中null值可以比较吗_数据库查询排序[通俗易懂]分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84617.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注