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 FIRST和NULLS 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
参考文献
- SQL – Order By如何处理NULL
今天的文章数据库中null值可以比较吗_数据库查询排序[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84617.html