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

猜你喜欢

转载自blog.csdn.net/wlh2220133699/article/details/131538909