应使用适当的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的相关推荐

  1. Lovesource博士:或者我是如何学会不再担心和热爱开放的

    我曾经写代码. 我不再了 造成这种情况的原因很多,其中包括我不太擅长的事实. 需要澄清的是,我认为我擅长编写代码, 1但我不太擅长编写代码. 2事实证明,我在其他方面非常擅长,所以我的职业生涯3朝着不 ...

  2. 原来 SQL 中的 NULL 是这么回事儿

    点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! 在日常使用数据库时,你在意过NULL值么? 其实,NULL值在数据库中是一个很特殊且有趣的存在,下面我们 ...

  3. sql如何处理null值_如何正确处理SQL中的NULL值

    sql如何处理null值 前言 (Preface) A friend who has recently started learning SQL asked me about NULL values ...

  4. 有意思,原来SQL中的NULL是这么回事儿

    在日常使用数据库时,你在意过NULL值么? 其实,NULL值在数据库中是一个很特殊且有趣的存在,下面我们一起来看看吧: 小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这 ...

  5. SQL 中的 NULL 你真的懂了吗?【数据库|SQL】

    目录 SQL 中的 NULL 查询某列值为 NULL 的数据 NULL 是「未知」 三元逻辑(原文为 Ternary Logic) NOT IN 和 NULL 小结 SQL 中的 NULL (译自 N ...

  6. SQL 中的 NULL 原来是这么回事

    在日常使用数据库时,你在意过NULL值么? 其实,NULL值在数据库中是一个很特殊且有趣的存在,下面我们一起来看看吧: 在查询数据库时,如果你想知道一个列(例如:用户注册年限 USER_AGE)是否为 ...

  7. 在MySQL中 NULL的含义是_null有哪些常见的意思?(如何正确理解 SQL 中的 NULL)

    SELECT * FROM SOME_TABLEWHERE SOME_COLUMN IS NULL 或者这样写: 复制代码WHERE SOME_COLUMN = 1 正确的写法应该是第二种(WHER ...

  8. Sql中的null 与不等于的比较

    sql中的null与不等于符号的比较<>,!=,如果查询的数据中有null的情况,那么 用 is null 或者 is not null, 如果表A中有数据为 A name  code  ...

  9. 我热爱编程但不喜欢数学_云恢复挑战或我如何学会不再担心并热爱云

    我热爱编程但不喜欢数学 In a fit of close-to-graduation fear for the future, I decided to look at the few things ...

最新文章

  1. MNIST数据集实现手写数字识别(基于tensorflow)
  2. Java的poi的excel导入怎么判断日期格式的单元格
  3. java 旋转图片_Java实现图片翻转以及任意角度旋转
  4. mysql 复制方式_MySQL复制方法
  5. java insert方法_【Oracle/Java】以Insert ALL方式向表中插入百万条记录,耗时9分17秒...
  6. 2020年还需要阅读的10篇人工智能论文
  7. 项目开发周期与数据库设计对比
  8. cvs数据导入工具 oracle_oracle数据库的导入导出
  9. Dojo笔记(较旧)
  10. CURL的学习和应用
  11. uni —app 录音_uniapp如何实现录音功能
  12. 为什么 PSP22 对 Polkadot 生态系统很重要
  13. java 集合练习题2
  14. vue项目运用繁体字
  15. 文件名的命名规则是什么
  16. 中职学校计算机基础的重要性,中职非计算机专业学生计算机基础教学浅探
  17. 面试官:你说你懂i++跟++i的区别,那你会做下面这道题吗?
  18. nginx配置区分移动端和PC端,访问不同域名
  19. 年龄到底怎么算才对_人的年龄怎么计算
  20. 如何在ABBYY FineReader 12中添加图像

热门文章

  1. futuretask java 并发请求_Java并发编程:Callable、Future和FutureTask
  2. 至诚学院MATLAB第四次,MATLAB 第二次实验课课堂作业(4学时)
  3. docker kali安装mysql_Linux环境使用Docker安装MySql
  4. 元宵节正月十五|设计师正需要的图片素材看这里
  5. 对桌面壁纸有要求?壁纸控的你需要看这里
  6. 设计师喜欢收集各种各样的笔刷来喽,不必倾家倾产就能像创造出令人惊叹的设计。
  7. 这样的促销海报,还怕卖不出去?
  8. 【PSD分层海报模板素材】快乐开学季 敬爱教师节!
  9. 财务金融类网页及app界面设计模板
  10. 高品质UI设计模板|PSD下载,设计师的最佳临摹素材