sql指南之null值用法

注明:参考文章:

SQL避坑指南之NULL值知多少?_select null as-CSDN博客文章浏览阅读2.9k次,点赞7次,收藏21次。0 引言 SQL NULL(UNKNOW)是用来代表缺失值的术语,在表中的NULL值是显示为空白字段的值,用作不知道数据的具体值,或者不知道数据是否存在,或者数据不存在等情况。NULL值在SQL中普遍存在,想必大多数程序员对其有所了解,但是对于NULL值在SQL中贯穿体现及相关细节,是否会有人注意到呢?本文将对SQL中NULL值的一些使用细节进行研究,让你在使用过程中避开NULL值的坑,..._select null ashttps://blog.csdn.net/godlovedaniel/article/details/104860042

0 概要

   sql null(unknow) 是用来代表缺失值或无意义的术语,表中的null值显示为空白字段的值。

1 null值用途

(1)被定义为缺失值
(2)被定义为无意义的值
(3)不存在的值
(4)不确定性值
(5)建表语句中作为非空约束

2 数据准备

create table if not exists  table_null
(id    int comment 'id',name  string comment '名称'
) comment 'null值测试表';insert overwrite table table_null values
(1,'吱吱'),
(2,'嘎巴'),
('',''),
(4,''),
(null,null),
(6,null),
(null,'');

3 null使用场景

3.1 null值的比较
对null进行判断时,只能用is null或is not null,不能采用 =, <, <>, != 等这些操作符

例如经过如下操作:

select * from table_null where id <> '1';

输出结果为:

  该条语句正常返回应该是6条数据,但是结果只有3条,说明id为null的值并没有返回,null的判断有其特殊的语法。接下来,进行校验:

select * from table_null where id <> '1' or id is null;

 查看结果是:

此时结果才是符合预期。

一般筛选出name不为null,有两种sql表示方法:

第一种:

select * from table_null where name != null;

没报错但结果明显不对

第二种:

select * from table_null where name is not null;

 可以看到结果符合预期。

3.2 null与聚合函数的运算
1.count(*)操作时会统计null值,count(column)会过滤掉null值;
2.事实上除了count(*)计算,剩余的聚合函数例如: max(column),min(column),avg(column),count(column) 函数会过滤掉null值
3.3 null值参与算数运算
与null值进行算数运算时,其操作结果都是null
(1) select 1+ null
(2) select 1*null
(3) select 1/null
(4) select null*0
3.4 null值参与group by分组
此时null值会被单独作为一个列进行分组

具体例子:

select name,count(*) from table_null group by name;
3.5 null值参与distinct计算
此时null会参与计算,会进行去重,过滤后会有一个null值

 举例:

select distinct (name) from table_null;

输出结果为:

可以看到null只也参与去重了

3.6 null值参与排序运算

     排序时null也会参与运算,在myql中升序排序时,null值被排在最前面,降序排序时null时会被排在最后。

select name from table_null order by name desc;

3.7 null与功能函数配合使用

例如concat()函数等

select id,name,concat(name,'_',id) from  table_null

结果如下:

3.8 null在建表语句中作为非空约束
3.9 null值的转换
如果null参与运算,一般需要对null进行转换,主要有以下函数完成:
hive中的nvl()函数
hive中的coalease()函数
mysql中的ifnull()函数等

举例:

select name,coalesce(name,'null') as name1 from table_null;
select name,nvl(name,'null') from table_null;

输出结果:

3.10 null值的底层存储

       null值本身是占用存储空间的,hive中以'/N' 进行存储。以mysql数据库为例验证null值大小 

select name,length(name) from table_null;

       mysql中的null是占用空间的,在创建表的时候尽量把字段的默认值设置成not null,除非是想存储null值。因为在mysql中为null的字段不会走索引,做统计的时候也会直接被忽略掉,如果想统计进去,借助函数进行清洗转换,例如:nvl()函数、 coalease()函数、ifnull()函数等。 null值其实是有东西的,但不显示,只是给个标志,代表无意义的值等。空值''是不占用空间的,''表示空值里面没有值。

3.11 null与空值''区别
1)null在聚合函数(sum,avg,min,max,avg)中会被直接过滤掉,而''不会被过滤掉
2)对于null的判断需要is null或is not null, 而''则需要= 或者 !=, <>
3)null占用存储空间,''不占用存储空间

4 踩坑案例

  t1表和t2表的字段如图

 

 计算以下sql的输出结果?

with t1 as (select 1 as id union allselect 2 as id union allselect 3 as id
),t2 as (select 1 as id union allselect 2 as id union allselect 2 as id)select  t1.id,t2.id
from t1
left join t2 on t1.id = t2.id
从

输出结果为:

解析: where后面跟着的是对右表的限制条件  where t2.id <>2;

          结论:在最后临时表的基础上进行筛选,返回符合where过滤条件的行;

          注意: sql中比较的结果一般有:true, false, null; 而where条件只会过滤出true的结果。再一次验证了以下结论

对null进行判断时,只能用is null或is not null,不能采用 =, <, <>, != 等这些操作符

5 小结

    该篇文章主要对null值使用的方法和细节进行了归纳总结。

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/448462.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国2023年土地利用现状遥感监测数据

中国2023年土地利用现状遥感监测数据是以2023年美国Landsat 8遥感影像为主要数据源&#xff0c;在2020年通过2020年土地利用数据基础上&#xff0c;通过2020年和2023年两期遥感影像对比分析&#xff0c;人工目视解译生成。 改革开放以来&#xff0c;中国经济的快速发展对土地利…

杂题——试题 算法训练 区间最大和

分析&#xff1a; 如果使用两个for循环遍历所有情况&#xff0c;运行会超时解决运行超时的关键点在于&#xff1a;及时停止累加&#xff0c;丢弃当前的子序列 比如【1&#xff0c;-2&#xff0c;3&#xff0c;10】从第一个数字开始的子序列的和小于从第三个数字开始的子序列的和…

数据结构——实验01-线性表的链式存储和操作

一、实验内容 二、算法思想与算法实现 1、解题思想 &#xff08;1&#xff09;逆序创建链表La就是使用头插法创建一个链表&#xff0c;所谓头插法就是在创建链表时始终将新元素插入到头结点之后&#xff0c;而正序创建链表Lb就是使用尾插法创建一个链表&#xff0c;所谓尾插法…

angr学习-入门篇

前言&#xff1a; 资源链接&#xff1a;https://github.com/jakespringer/angr_ctf&#xff08;题库仓库&#xff0c;里面有个讲解angr的PPT&#xff0c;里面有官方的题解很详细&#xff09;https://github.com/Hustcw/Angr_Tutorial_For_CTF 安装&#xff1a; 关于angr的安…

过滤器和拦截器、AOP有什么区别

过滤器&#xff08;Filter&#xff09;、拦截器&#xff08;Interceptor&#xff09;和面向切面编程&#xff08;AOP&#xff0c;Aspect-Oriented Programming&#xff09;是Java Web开发中常用的三种技术手段&#xff0c;它们都可以在程序执行过程中的特定点进行干预。虽然它们…

海外社媒营销平台及运营规则,如何降低封号率?

社交媒体已经成为人们生活和日常习惯不可或缺的一部分&#xff0c;在跨境电商出海过程中&#xff0c;海外社媒营销平台可以起到非凡的助力&#xff1b;而平台的选择以及平台的运营技巧、规则都各有不同。很多海外社媒工作者经常会被封号&#xff0c;这也是难度之一&#xff0c;…

HCIP-Datacom(H12-821)81-90题解析

有需要完整题库的同学可以私信博主&#xff0c;博主看到会回复将文件发给你&#xff01;&#xff08;麻烦各位同学给博主推文点赞关注和收藏哦&#xff09; 81、在状态检测防火墙中&#xff0c;开启状态检测机制时&#xff0c;三次握手的第二个报文(SYNACK)到达防火墙的时候如…

k8s-HPA

前提条件 安装有**Metrics Server**,HPA的运行监控指标需要由Metrics Server 提供 文档&#xff1a;https://github.com/kubernetes-sigs/metrics-server?tabreadme-ov-file#readme 快速自动缩放&#xff0c;每15秒收集一次指标(可配置)。 资源效率&#xff0c;为集群中的每…

C#拆分字符串,正则表达式Regex.Split 方法 vs String.Split 方法

目录 一、使用的方法 1.使用Split(String, String)方法 2.String.Split 方法 二、源代码 1.源码 2.生成效果 使用正则表达式可以拆分指定的字符串。同样地&#xff0c;使用字符串对象的Split方法也可以实现此功能。使用字符串对象的Split方法可以根据用户选择的拆分条件&…

字符下标计数

下标计数 数组计数&#xff0c;即通过使用一个新的数组&#xff0c;对原来数组里面的项进行计数&#xff0c;统计原来数组中各项出现的次数&#xff0c;如下图所示&#xff1a; 数组计数可以方便快速地统计出一个各项都比较小的数组中&#xff0c;数值相同的数的个数。 数组计数…

移动端常见布局

单独移动端页面&#xff08;主流&#xff09; 1&#xff0c;流式布局&#xff08;百分比布局&#xff09; 流式布局&#xff0c;就是百分比布局&#xff0c;也称非固定像素布局 通过盒子的宽度设置成百分比来根据屏幕的宽度来进行伸缩&#xff0c;不受固定像素的限制&#x…

Flink实战四_TableAPISQL

接上文&#xff1a;Flink实战三_时间语义 1、Table API和SQL是什么&#xff1f; 接下来理解下Flink的整个客户端API体系&#xff0c;Flink为流式/批量处理应用程序提供了不同级别的抽象&#xff1a; 这四层API是一个依次向上支撑的关系。 Flink API 最底层的抽象就是有状态实…