百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

SQL 查询中的 NULL 值(sql 查询为null设置默认值)

mhr18 2024-09-20 20:55 28 浏览 0 评论

英文原文地址:https://mitchum.blog/null-values-in-sql-queries/


作者:MITCHUM


翻译:高行行


小结:

1. SQL 里的 NULL 和其他编程语言里的 NULL 是完全不同的东西

2. 在SQL中将 NULL 当未知来看

今天的帖子是关于SQL中的NULL值的,由我的朋友和数据库向导Kaley提供。如果你想了解有关 SQL,Oracle 数据库以及使查询运行更快的更多信息,请访问他的网站

这是一个使很多萌新开发人员陷入困境的话题-SQL查询中的NULL值的概念。

每当你向数据库发出SQL查询时……你想知道一列中是否包含NULL值……写查询将找到结果的正确方法是什么?

你应该使用这样的查询吗?

SELECT * FROM SOME_TABLE
WHERE SOME_COLUMN = NULL

要么!你应该使用这样的查询吗?

SELECT * FROM SOME_TABLE
WHERE SOME_COLUMN IS NULL

…答案是,你应该使用第二个查询(SOME_COLUMN IS NULL)。

现在为什么呢?

我们不在数据库中进行其他任何比较时都不要使用“ IS ”关键字,对吗?

如果我们想知道一个字段是否等于一个,我们可以使用如下的WHERE子句:

WHERE SOME_COLUMN = 1

那么为什么我们在IS关键字上使用 NULL 值呢?为什么我们需要区别对待 NULL ?

答案是这样的:在SQL中,NULL表示“未知”的概念 (因此NULL值表示“未知”值)。

1. Null 为未知

在大多数数据库中,NULL和空字符串(由 "双撇号" 或 '' 表示)之间存在差异。

但是,并非所有数据库都这样:例如,Oracle 数据库不允许你使用空字符串。任何时候Oracle数据库看到一个空字符串,它都会自动将空字符串转换为NULL值。

但是,对于大多数其他数据库,NULL值与空字符串的处理方式不同:

  • 空字符串被视为没有值的已知值。
  • 将NULL值视为未知值

这是我问以下问题的区别:“美国总统西奥多·罗斯福的中间名是什么?”

  • 一个答案可能是:“嗯,我不知道西奥多·罗斯福的中间名是什么。”(此想法可以由Theodore Roosevelt的记录的MIDDLE_NAME列中的NULL值表示)
  • 另一个可能的答案可能是“西奥多·罗斯福总统实际上没有中间名。他的父母从未给他起过中间名,而且我知道西奥多·罗斯福(Theodore Roosevelt)没有中间名。(你可以通过在MIDDLE_NAME列中输入一个空字符串或 '' 来表示)

Oracle 数据库是最显著的例外,其中这两个值实际上都将由NULL表示-除 Oracle 以外的大多数数据库对 NULL 和空字符串的处理方式都非常不同。

只要你记得 NULL 值代表一个未知值,那么这将有助于你制作SQL查询,并帮助你解决使用 NULL 值可能遇到的一些棘手情况。

例如,如果你要使用 WHERE 子句这样的查询:

SELECT * FROM SOME_TABLE
WHERE 1 = 1

该查询将返回行(假设SOME_TABLE不是空表!),因为表达式“ 1 = 1” 可证明是正确的……它可以被证明是正确的。

如果我要说:

SELECT * FROM SOME_TABLE
WHERE 1 = 0

…然后数据库将看到此情况,并将“ 1 = 0”评估为false(这意味着该查询将永远不会返回任何行)。

但是如果我要说:

SELECT * FROM SOME_TABLE
WHERE 1 = NULL

数据库基本上是这样的:“我不知道这两个值(1和我们的黑盒NULL值)是否相等”……因此它不返回任何记录。

2. 三值逻辑

在SQL查询中有WHERE子句时,它可以具有三种不同结果之一:

  • 可以是真的(它将返回行)
  • 它可以是错误的(并且不会返回行)
  • 或者它可以为 NULL 或未知(未知也不会返回值)

你可能会想,“好吧,但是为什么我要关心 false 和 null 之间的区别,因为数据库对这两个值的处理完全相同?”

好吧,让我告诉你哪里可能遇到麻烦:让我们介绍一下 NOT() 条件。

如果你要说:

SELECT * FROM SOME_TABLE
WHERE NOT(1 = 1)

然后,数据库首先要求值1 = 1,然后说:“好吧,那显然是对的。”

但是随后它将对其应用 NOT() 条件。数据库即将运行,“好吧,当被注释时,它变成了假……所以 NOT() 条件导致我们的WHERE子句在这里是假的。”

因此,上面的查询不会返回任何记录。

但是,如果你要说:

SELECT * FROM SOME_TABLE
WHERE NOT(1 = 0)

然后,数据库首先计算表达式1 = 0,并说:“那显然是错误的。”

但是然后它将应用 NOT() 条件,这将给我们相反的结果,因此它变为true

因此此查询将返回记录!

如果我发出以下查询怎么办?

SELECT * FROM SOME_TABLE
WHERE NOT(1 = NULL)

数据库首先要评估 1 = NULL。(请记住,它将把NULL当作一个未知值!)

它会说:“我不能说1是否等于 NULL,因为我不知道 NULL(未知)值是什么。”

因此,它不会产生真实的结果也不会产生错误的结果 –而是会产生NULL(或未知)结果。

NULL 结果将由 NOT() 运算符解释。

每当你使用 NULL 并将其置于 NOT() 条件时……结果就是另一个NULL!(未知的反面是……嗯……另一个未知)。

因此,NOT() 运算符对 null 条件不做任何事情。

所以这些查询中的……

SELECT * FROM SOME_TABLE
WHERE NOT(1 = NULL)
SELECT * FROM SOME_TABLE
WHERE 1 = NULL

…将不返回任何记录…即使它们是相反的!

3. NULL 和 NOT IN

如果我使用WHERE子句发出这样的查询:

SELECT * FROM SOME_TABLE
WHERE 1 IN (1, 2, 3, 4, NULL)

…那么显然 WHERE 子句将是正确的,由于1在我们的 IN 列表中,所以该查询将返回记录…

但是如果我要说:

SELECT * FROM SOME_TABLE
WHERE 1 NOT IN (1, 2, 3, 4, NULL)

那么显然这将是错误的,并且该查询将永远不会返回记录,因为数字1出现在我们的IN列表中,并且我们说“ NOT IN”…

现在,如果我要说这样的话怎么办?

SELECT * FROM SOME_TABLE
WHERE 5 NOT IN (1, 2, 3, 4, NULL)

此 WHERE 子句将永远不会返回任何记录,因为它不是真正的可证明(它不能被证明是真的)。数字5没有明确出现在“ IN”列表中,但是5可能在我们的“黑盒” NULL值内(数据库不一定知道 NULL 的值是什么)。

这将产生 NULL 结果(表示未知结果),并且此 WHERE 子句永远不会返回任何记录。

这就是为什么将 NULL 值等效为未知值很重要的原因-每当你编写复杂的SQL查询时,它都会为你提供帮助。

希望你现在已经准备好处理SQL查询中的NULL值!

参考文章

神奇的 SQL 之温柔的陷阱 → 三值逻辑 与 NULL !

相关推荐

mysql一 基本操作(mysql基础操作命令)

先讲数据库--mysql、redis、MongoDB爬虫今天的内容:mysql一基本操作注意事项:1.安装:自己安装,有问题可以问老师、可以自己找办法解决2.上课:先讲知识点再回答问题3....

香港DM德馬景泰藍文科集團20250702期《生命的收獲》LIN JING DE

香港DM德馬景泰藍文科集團20250702期《生命的收獲》DMSIXSEVEN/LINJINGDE/1973主編供圖:香港DM德馬數字甲骨文集團Hongkong-basedDMDelm...

01.Java发展历史(java发展简史)

1.Java发展历史Java由SunMicrosystems公司(现为Oracle公司)的JamesGosling及其团队在1991年开发,最初命名为"Oak",后改名为"...

月薪最高12000!看看这些宝山岗位有没有你心仪的~

招聘目录信息1猎上网络科技(上海)有限公司职位分析师职位分析师助理2上海祥腾金属材料有限公司商务车驾驶员3上海赋拓物联网技术有限公司软件测试工程师4上海集优标五高强度紧固件有限公司...

69岁的Java之父终于退休了,他竟然也经历过职场PUA

有些程序员不到35岁就要担心被优化,但有的程序员干到了69岁的高龄,才准备退休。就前几天,Java之父詹姆斯·高斯林,自个儿在领英上宣布以后要美美享受退休生活了。这一下子,就炸出了不少...

ocm认证年薪多少?(ocm认证好考吗)

从业数据库方面的工程师待遇都很好,年薪30万都是比较平常的事。OCM认证的价值可以归纳成以下几点:1、可以全面掌握Oracle知识,专业知识完善;2、证书对于公司招投标有巨大作用,甚至可以不上班就拿钱...

自学java开发攻略,想做程序员的必备攻略?

背景现阶段,随着互联网的快速发展,程序员这个行业越来月吃香,不仅仅是因为科技先进,说出去很牛逼,让别人产生崇拜,主要原因是程序员行业薪资待遇好,相比国内其他行业,程序员的薪资待遇是羡慕了很多人呢!于是...

SpringBoot WebFlux整合R2DBC实现数据库反应式编程

环境:Springboot2.4.12R2DBC简介SpringdataR2DBC是更大的Springdata系列的一部分,它使得实现基于R2DBC的存储库变得容易。R2DBC代表反应式关系数...

AI编码工具未能代替码农:大模型的局限性揭秘

随着ChatGPT和GithubCopilot等AI编码工具的兴起,StackOverflow近日因流量减少宣布裁员近三分之一。这引发了一个争议的问题:ChatGPT这类AI编码工具,真的要颠覆整...

大模型无法替代码农!GPT-4解决GitHub编程问题成功率为0

编辑:编辑部【新智元导读】ChatGPT之类的AI编码工具来势汹汹,StackOverflow又裁员了!不过,普林斯顿和芝大竟发现,面对真实世界GitHub问题,GPT-4的解决率竟是0%。Stac...

机器人动作领域突破!UniVLA模型实现跨模态AI机器人动作统一

还记得《星际穿越》中那台能在无重力、尘暴甚至巨浪中切换形态、随时理解库珀指令的TARS多功能机器人吗?在银幕里,我们羡慕TARS能听懂人话、看懂环境、马上给出最合适的动作;而在现实世界的实验室里,“让...

FEA-Bench:首个仓库级新功能实现基准,让大模型更懂软件开发

当前,大语言模型在代码生成领域已展现出惊人的能力,但能否胜任真实软件开发中的“新增功能实现”任务,仍是一个关键未解的问题。对此,微软亚洲研究院与北京大学联合发布了首个专注于仓库级新功能实现的基准测试...

基于Java的软件版本信息管理系统-2025计算机毕业设计

基于Java的软件版本信息管理系统-2025计算机毕业设计前言随着移动互联网的快速发展,APP已成为人们日常生活中不可或缺的一部分。为了高效地管理这些APP的信息,如版本更新、用户反馈、下载量统计等,...

马斯克在干嘛?抱着它现身推特 简介改为“推特老板”

  马斯克收购推特的交易真是“没完没了”。据彭博社报道,当地时间26日,美国亿万富翁埃隆·马斯克抱着水槽走进了推特公司的旧金山总部,他还将自己在推特账号的公开自我介绍改为“推特老板”(ChiefTw...

福布斯公布7月全球十大富豪:马斯克成6月最大“输家”,身家缩水160亿美元

7月日,福布斯今日公布了2025年7月全球十大富豪榜,其中第二名迎来新面孔。软件巨头甲骨文(Oracle)联合创始人兼董事长拉里埃里森(LarryEllison)凭借公司股价飙升成功上位。由...

取消回复欢迎 发表评论: