我是如何学会不再担心和喜欢SQL中的NULL的
应使用适当的SQL函数来避免为数据串联、比较、ORDER BY或GROUP BY等操作获得不需要的输出。您不应该试图阻止NULL值——相反,以克服其限制的方式编写您的查询。
该NULL值是一种表示未知值的数据类型。它不等同于空字符串或零。假设有一个含有列EmployeeId,Name,ContactNumber和候补联系人号码的employee表。此表有一些强制值列,如EmployeeId,Name和ContactNumber。但是,备用联系号码不是必需的,因此具有未知值。因此,此表中的NULL值表示信息缺失或不足。以下是NULL的其他含义:
- 值未知
- 值不可用
- 属性不适用
在这篇文章中,我们将考虑如何在创建表、查询、字符串操作和函数中使用NULL。
在CREATE TABLE中允许NULL
对于表结构,我们需要定义相应的列是否允许为NULL。例如,看看下面的客户表。如列CustomerID,FirstName,LastName不允许为NULL值,而Suffix,CompanyName和SalesPerson列可存储NULL的值。
CREATE TABLE Customers(CustomerID SERIAL PRIMARY KEY,FirstName varchar(50) NOT NULL,MiddleName varchar(50) NULL,LastName varchar(50) NOT NULL,Suffix varchar(10) NULL,CompanyName varchar(128) NULL,SalesPerson varchar(256) NULL,EmailAddress varchar(50) NULL
)
让我们使用以下脚本向该表中插入几条记录:
INSERT INTO Customers (FirstName, MiddleName, LastName, Suffix, CompanyName, SalesPerson, EmailAddress)
VALUES('John',NULL,'Peter',NULL,NULL,NULL,NULL),('Raj','M','Mohan','Mr','ABC','KRS','raj.mohan@abc.com'),('Krishna',NULL,'Kumar','MS','XYZ',NULL,'Krishna.kumar@xyz.com')
在WHERE子句中使用NULL
现在,假设您要为那些没有电子邮件地址的客户获取记录。下面的查询工作正常,但它不会给我们一行:
Select * FROM Customers WHERE Emailaddress=NULL
不能使用=查询为NULL的值
在上面的select语句中,表达式定义了“电子邮件地址等于UNKNOWN值的地方”。在SQL标准中,我们不能将值与NULL比较。 相反,您将值引用为IS NULL。
注意:IS和NULL之间有一个空格。如果删除空格,它就变成了一个函数ISNULL()。
通过使用IS NULL而不是equals,您可以查询NULL值。
带NULL的整数、小数和字符串操作
同样,假设您声明了一个变量但没有初始化它的值。如果您尝试执行算术运算,它也会返回NULL,因为SQL无法确定变量的正确值,并且它认为是UNKNOWN值。
SELECT 10 * NULL
将整数乘以NULL返回NULL
SELECT 10.0 * NULL
将小数乘以NULL返回NULL
NULL在string串联中也起着重要的作用。假设您需要在单个列中提供customer的全名,并使用管道符号(||) 将它们连接起来。
SELECT Suffix, FirstName, MiddleName, LastName, Suffix,
(Suffix || ' ' || FirstName || ' ' || MiddleName || LastName ) _
AS CustomerFullName FROM Customers
将字符串设置为NULL然后连接它返回NULL
看看结果集——查询返回NULL的级联string,如果的任何部位string都有NULL。例如,第1行中的人没有中间名。它的串联string也是NULL,因为SQL无法验证string包含NULL。
有许多SQL函数可用于克服string串联中的这些NULL值问题。我们将在本文后面介绍它们。
SQL聚合中的NULL值
假设你使用聚合函数,例如SUM,AVG或者MIN,MAX对应NULL数值。你认为预期的结果是什么?
SELECT Sum(values) AS sum,avg(values) as Avg,Min(Values) as MinValue,Max(Values) as MaxValueFROM (VALUES (1), (2), (3),(4), (NULL)) AS a (values);
在聚合函数中,NULL被忽略。
看上图:它计算了所有聚合函数的值。除了COUNT()和GROUP BY()之外, SQL会忽略聚合函数中的NULL。如果我们尝试对所有NULL值使用聚合函数,您会收到一条错误消息。
SELECT Sum(values) AS sum,avg(values) as Avg,Min(Values) as MinValue,Max(Values) as MaxValueFROM (VALUES (NULL), (NULL), (NULL),(NULL), (NULL)) AS a (values);
聚合所有NULL值会导致错误。
ORDER BY和GROUP BY为NULL
SQL将NULL值视为UNKNOWN值。因此,如果我们对NULL值列使用ORDER By和GROUP by子句,它会平等对待它们并对其进行排序、分组。例如,在我们的customer表中,MilddleName列中有NULL。如果我们使用此列对数据进行排序,它会在最后列出NULL值,如下所示:
SELECT Suffix, FirstName, MiddleName, LastName, Suffix,
(Suffix || ' ' || FirstName || ' ' || MiddleName || LastName )AS CustomerFullNameFROM CustomersOrder BY MiddleName
NULL值最后出现在ORDER BY中
在我们使用之前GROUP BY,让我们在表中再插入一条记录。它在大多数列中都有NULL值,如下所示:
INSERT INTO Customers (FirstName,MiddleName,LastName,Suffix,CompanyName,
SalesPerson,EmailAddress)values('Sant',NULL,'Joseph',NULL,NULL,NULL,NULL);
现在,使用GROUP BY子句根据后缀对记录进行分组。
SELECT count(*) as Customercount , suffixFROM CustomersGroup BY Suffix
GROUP BY确实平等地对待所有NULL值。
如上所示,SQL平等对待这些NULL值并将它们分组。对于customers表中没有指定任何后缀的记录,您将获得两个customer计数。
处理NULL的有用函数
我们探讨了SQL如何处理不同操作中的NULL值。在本节中,我们将探索一些有价值的函数,以避免由于获得不想要的值NULL。
在Postgres和MySQL中使用NULLIF
该NULLIF()函数比较两个输入值。
- 如果两个值相等,则返回NULL。
- 在不匹配的情况下,它返回第一个值作为输出。
例如,查看以下NULLIF()函数的输出。
SELECT NULLIF (1, 1);
如果两个值相等,则 NULLIF返回NULL
SELECT NULLIF (100,0);
如果值不相等,则NULLIF返回第一个值。
SELECT NULLIF ('A', 'Z');
NULLIF返回字符串比较中的第一个字符串。
COALESCE函数
该COALESCE()函数接受多个输入值并返回第一个非NULL值。我们可以在单个COALESCE()函数中指定各种数据类型并返回高优先级数据类型。
SELECT COALESCE (NULL, 2, 5) AS NULLRESPONSE;
COALESCE返回列表中的第一个非NULL数据类型。
SELECT coalesce(null, null, 8, 2, 3, null, 4);
概括
在关系数据库中NULL值类型是必需的,以表示一个未知的或丢失的值。您需要使用适当的SQL函数来避免在数据串联、比较ORDER BY 或GROUP BY。您不应该试图阻止NULL值——相反,以克服其局限性的方式编写查询。这样,你就会学会去爱NULL。
https://www.codeproject.com/Articles/5300621/How-I-Learned-to-Stop-Worrying-and-Love-NULL-in-SQ
我是如何学会不再担心和喜欢SQL中的NULL的相关推荐
- Lovesource博士:或者我是如何学会不再担心和热爱开放的
我曾经写代码. 我不再了 造成这种情况的原因很多,其中包括我不太擅长的事实. 需要澄清的是,我认为我擅长编写代码, 1但我不太擅长编写代码. 2事实证明,我在其他方面非常擅长,所以我的职业生涯3朝着不 ...
- 原来 SQL 中的 NULL 是这么回事儿
点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! 在日常使用数据库时,你在意过NULL值么? 其实,NULL值在数据库中是一个很特殊且有趣的存在,下面我们 ...
- sql如何处理null值_如何正确处理SQL中的NULL值
sql如何处理null值 前言 (Preface) A friend who has recently started learning SQL asked me about NULL values ...
- 有意思,原来SQL中的NULL是这么回事儿
在日常使用数据库时,你在意过NULL值么? 其实,NULL值在数据库中是一个很特殊且有趣的存在,下面我们一起来看看吧: 小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这 ...
- SQL 中的 NULL 你真的懂了吗?【数据库|SQL】
目录 SQL 中的 NULL 查询某列值为 NULL 的数据 NULL 是「未知」 三元逻辑(原文为 Ternary Logic) NOT IN 和 NULL 小结 SQL 中的 NULL (译自 N ...
- SQL 中的 NULL 原来是这么回事
在日常使用数据库时,你在意过NULL值么? 其实,NULL值在数据库中是一个很特殊且有趣的存在,下面我们一起来看看吧: 在查询数据库时,如果你想知道一个列(例如:用户注册年限 USER_AGE)是否为 ...
- 在MySQL中 NULL的含义是_null有哪些常见的意思?(如何正确理解 SQL 中的 NULL)
SELECT * FROM SOME_TABLEWHERE SOME_COLUMN IS NULL 或者这样写: 复制代码WHERE SOME_COLUMN = 1 正确的写法应该是第二种(WHER ...
- Sql中的null 与不等于的比较
sql中的null与不等于符号的比较<>,!=,如果查询的数据中有null的情况,那么 用 is null 或者 is not null, 如果表A中有数据为 A name code ...
- 我热爱编程但不喜欢数学_云恢复挑战或我如何学会不再担心并热爱云
我热爱编程但不喜欢数学 In a fit of close-to-graduation fear for the future, I decided to look at the few things ...
最新文章
- MNIST数据集实现手写数字识别(基于tensorflow)
- Java的poi的excel导入怎么判断日期格式的单元格
- java 旋转图片_Java实现图片翻转以及任意角度旋转
- mysql 复制方式_MySQL复制方法
- java insert方法_【Oracle/Java】以Insert ALL方式向表中插入百万条记录,耗时9分17秒...
- 2020年还需要阅读的10篇人工智能论文
- 项目开发周期与数据库设计对比
- cvs数据导入工具 oracle_oracle数据库的导入导出
- Dojo笔记(较旧)
- CURL的学习和应用
- uni —app 录音_uniapp如何实现录音功能
- 为什么 PSP22 对 Polkadot 生态系统很重要
- java 集合练习题2
- vue项目运用繁体字
- 文件名的命名规则是什么
- 中职学校计算机基础的重要性,中职非计算机专业学生计算机基础教学浅探
- 面试官:你说你懂i++跟++i的区别,那你会做下面这道题吗?
- nginx配置区分移动端和PC端,访问不同域名
- 年龄到底怎么算才对_人的年龄怎么计算
- 如何在ABBYY FineReader 12中添加图像
热门文章
- futuretask java 并发请求_Java并发编程:Callable、Future和FutureTask
- 至诚学院MATLAB第四次,MATLAB 第二次实验课课堂作业(4学时)
- docker kali安装mysql_Linux环境使用Docker安装MySql
- 元宵节正月十五|设计师正需要的图片素材看这里
- 对桌面壁纸有要求?壁纸控的你需要看这里
- 设计师喜欢收集各种各样的笔刷来喽,不必倾家倾产就能像创造出令人惊叹的设计。
- 这样的促销海报,还怕卖不出去?
- 【PSD分层海报模板素材】快乐开学季 敬爱教师节!
- 财务金融类网页及app界面设计模板
- 高品质UI设计模板|PSD下载,设计师的最佳临摹素材