读SQL进阶教程笔记02_三值逻辑和NULL

SQL进阶教程——三指逻辑和NULL(第三章) 1. 关于三值逻辑的理论 1.1. 两种NULL 两种NULL分别指的是“未知的”和“不适用的”,“不知道戴墨镜的人眼睛是什么颜色”,这就是未知的;“不知道冰箱的眼睛是什么颜色”,这就是“不适用”。 总结一下:“未知”指的是“虽然现在不知道,但加上某些条件后可以知道”;“不适用”指的是“无论怎么努力都无法知道”。 1.2. 为什么必须写成“IS NULL”,而不是“= NULL” --查询NULL... 阅读详情

 

1. 三值逻辑

1.1. 真

  • 1.1.1. true

1.2. 假

  • 1.2.1. false

1.3. 不确定

  • 1.3.1. unknown

2. 两种NULL

2.1. 未知”(unknown)

  • 2.1.1. 不知道戴墨镜的人眼睛是什么颜色

  • 2.1.2. 虽然现在不知道,但加上某些条件后就可以知道

2.2. “不适用”(not applicable,inapplicable)

  • 2.2.1. 不知道冰箱的眼睛是什么颜色

  • 2.2.2. 在语义上更接近于“无意义”

  • 2.2.3. 而不是“不确定”

  • 2.2.4. 无论怎么努力都无法知道

2.3. Codd提倡在关系数据库中使用四值逻辑

  • 2.3.1. 现在所有的DBMS都将两种类型的NULL归为了一类并采用了三值逻辑

2.4. 数据库里只要存在一个NULL,查询的结果就可能不正确

2.5. 最佳方法应该是往表里添加NOT NULL约束来尽力排除NULL

3. IS NULL

3.1. 谓词

3.2. 对NULL使用比较谓词后得到的结果总是unknown

  • 3.2.1. --以下的式子都会被判为 unknown

       1 = NULL
       2 > NULL
       3 < NULL
       4 <> NULL
       NULL = NULL
  • 3.2.2. 比较谓词只适用于值

    • 3.2.2.1. NULL不是值,所以不能对其使用谓词

3.3. 查询结果只会包含WHERE子句里的判断结果为true的行

  • 3.3.1. 不会包含判断结果为false和unknown的行

3.4. NULL既不是值也不是变量

  • 3.4.1. NULL只是一个表示“没有值”的标记

  • 3.4.2. 因为NULL不是值,所以不在定义域(domain)中

3.5. IS NULL这样的谓词是由两个单词构成的,所以人们容易把IS当作谓词,而把NULL当作值

4. 三值逻辑

4.1. AND的情况: false > unknown > true

  • 4.1.1. 优先级

4.2. OR的情况: true > unknown > false

  • 4.2.1. 优先级

5. 排中律

5.1. Law of Excluded Middle

5.2. “把命题和它的否命题通过‘或者’连接而成的命题全都是真命题”这个命题在二值逻辑中被称为排中律

5.3. 在SQL的世界里,排中律是不成立的

5.4. 示例

  • 5.4.1. --查询年龄是20岁或者不是20岁的学生

       SELECT *
         FROM Students
        WHERE age = 20
           OR age <> 20;
  • 5.4.2. --1.约翰年龄是NULL(未知的NULL!

       SELECT *
         FROM Students
        WHERE age = NULL
           OR age <> NULL;
  • 5.4.3. --2.对NULL使用比较谓词后,结果为unknown

       SELECT *
         FROM Students
        WHERE unknown
           OR unknown;
  • 5.4.4. --3.unknown OR unknown的结果是unknown

       SELECT *
         FROM Students
        WHERE unknown;
  • 5.4.5. SQL语句的查询结果里只有判断结果为true的行

    • 5.4.5.1. --添加第3个条件:年龄是20岁,或者不是20岁,或者年龄未知
       SELECT *
         FROM Students
        WHERE age = 20
           OR age <> 20
           OR age IS NULL;

6. CASE表达式

6.1. 示例

  • 6.1.1. --col_1为1时返回○、为NULL时返回×的CASE表达式?

       CASE col_1
         WHEN 1     THEN'○'
         WHEN NULL  THEN'×'
       END
  • 6.1.2. CASE表达式一定不会返回×

    • 6.1.2.1. 第二个WHEN子句是col_1 = NULL的缩写形式
  • 6.1.3. 

    CASE WHEN col_1 = 1 THEN'○'
    
           WHEN col_1 IS NULL THEN'×'
        END

6.2. CASE表达式的判断方法与WHERE子句一样,只认可真值为true的条件

7. NOT EXISTS

7.1. IN改写成EXISTS是等价改写

7.2. NOT IN和NOT EXISTS不是等价的

7.3. 示例

  • 7.3.1. B班山田的年龄是NULL

  • 7.3.2. --查询与B班住在东京的学生年龄不同的A班学生的SQL语句?

       SELECT *
         FROM Class_A
        WHERE age NOT IN ( SELECT age
                             FROM Class_B
                           WHERE city =’东京’);
    • 7.3.2.1. 结果是空,查询不到任何数据
  • 7.3.3. --正确的SQL语句:拉里和伯杰将被查询到

       SELECT *
         FROM Class_A  A
        WHERE NOT EXISTS ( SELECT *
                             FROM Class_B B
                           WHERE A.age = B.age
                             AND B.city = ’东京’);
  • 7.3.4. --1.执行子查询,获取年龄列表

       SELECT *
         FROM Class_A
        WHERE age NOT IN (22, 23, NULL);
    • 7.3.4.1. --1.在子查询里和NULL进行比较运算
       SELECT *
         FROM Class_A A
        WHERE NOT EXISTS ( SELECT *
                             FROM Class_B B
                           WHERE A.age = NULL
                             AND B.city =’东京’);
  • 7.3.5. --2.用NOT和IN等价改写NOT IN

       SELECT *
         FROM Class_A
        WHERE NOT age IN (22, 23, NULL);
    • 7.3.5.1. --2.对NULL使用“=”后,结果为 unknown
       SELECT *
         FROM Class_A A
        WHERE NOT EXISTS ( SELECT *
                             FROM Class_B B
                           WHERE unknown
                             AND B.city =’东京’);
  • 7.3.6. --3.用OR等价改写谓词IN

       SELECT *
         FROM Class_A
        WHERE NOT ( (age = 22) OR (age = 23) OR (age = NULL) );
    • 7.3.6.1. --3.如果AND运算里包含unknown,结果不会是true
       SELECT *
         FROM Class_A A
        WHERE NOT EXISTS ( SELECT *
                             FROM Class_B B
                           WHERE false或unknown);
  • 7.3.7. --4.使用德·摩根定律等价改写

       SELECT *
         FROM Class_A
        WHERE NOT (age = 22) AND NOT(age = 23) AND NOT (age = NULL);
    • 7.3.7.1. --3.如果AND运算里包含unknown,结果不会是true
       SELECT *
         FROM Class_A A
        WHERE NOT EXISTS ( SELECT *
                             FROM Class_B B
                           WHERE false或unknown);
    • 7.3.7.2. 山田被作为“与任何人的年龄都不同的人”来处理了
  • 7.3.8. --5.用<>等价改写NOT和=

       SELECT *
         FROM Class_A
        WHERE (age <> 22) AND (age <> 23) AND (age <> NULL);
  • 7.3.9. --6.对NULL使用<>后,结果为unknown

       SELECT *
         FROM Class_A
        WHERE (age <> 22) AND (age <> 23) AND unknown;
  • 7.3.10. --7.如果AND运算里包含unknown,则结果不为true

       SELECT *
         FROM Class_A
        WHERE false或unknown;

7.4. EXISTS谓词永远不会返回unknown

  • 7.4.1. EXISTS只会返回true或者false

8. ALL谓词

8.1. 多个以AND连接的逻辑表达式的省略写法

8.2. 与IN是等价的,所以我们不经常使用ANY

8.3. 示例

  • 8.3.1. --查询比B班住在东京的所有学生年龄都小的A班学生

       SELECT *
         FROM Class_A
        WHERE age < ALL ( SELECT age
                           FROM Class_B
                           WHERE city =’东京’);
    • 8.3.1.1. 他的年龄比在东京住的所有学生都小
  • 8.3.2.

     --1.执行子查询获取年龄列表
       SELECT *
         FROM Class_A
        WHERE age < ALL ( 22, 23, NULL );
       --2.将ALL谓词等价改写为AND
       SELECT *
         FROM Class_A
        WHERE (age < 22) AND (age < 23) AND (age < NULL);
       --3.对NULL使用“<”后,结果变为 unknown
       SELECT *
         FROM Class_A
        WHERE (age < 22)  AND (age < 23) AND unknown;
       --4. 如果AND运算里包含unknown,则结果不为true
       SELECT *
         FROM Class_A
        WHERE false 或 unknown;

9. 极值函数

9.1. --查询比B班住在东京的年龄最小的学生还要小的A班学生

    SELECT *
      FROM Class_A
     WHERE age < ( SELECT MIN(age)
                    FROM Class_B
                    WHERE city =’东京’);
  • 9.1.1. 他的年龄比在东京住的年龄最小的学生还要小

9.2. 限定谓词和极值函数不是等价的

9.3. 极值函数在统计时会把为NULL的数据排除掉

9.4. 极值函数在输入为空表(空集)时会返回NULL

  • 9.4.1.

     --1.极值函数返回NULL
       SELECT *
         FROM Class_A
        WHERE age < NULL;
       --2.对NULL使用“<”后结果为 unknown
       SELECT *
         FROM Class_A
        WHERE unknown;

10. 聚合函数

10.1. COUNT以外的聚合函数当输入为空表时返回NULL

10.2. 示例

  • 10.2.1. --查询比住在东京的学生的平均年龄还要小的A班学生的SQL语句?

       SELECT *
         FROM Class_A
        WHERE age < ( SELECT AVG(age)
                       FROM Class_B
                       WHERE city =’东京’);
  • 10.2.2. 没有住在东京的学生时,AVG函数返回NULL

  • 10.2.3. 外侧的WHERE子句永远是unknown,也就查询不到行

新手避坑指南:从GEO数据库下载单细胞测序数据的5个关键步骤(附实操截图) 本文为单细胞测序数据下载新手提供5个关键避坑步骤,涵盖数据搜索准备、样本量评估、文件选择决策、元数据诊断及高效下载技术。通过实操截图和代码示例,帮助研究者快速锁定GEO数据库中的优质单细胞测序数据,避免常见错误。 阅读详情

相关推荐

Ferry工单平台部署

ferry工单平台部署

运维求生之路 1897

SQL进阶教程 | 史上最易懂SQL教程!10小时零基础成长SQL大师!!

mysql学习

weixin_45732235的博客 2810

Jenkins插件下载慢?3分钟搞定国内镜像加速(含华为/腾讯/清华源对比)

本文详细介绍了如何通过国内镜像源加速Jenkins插件下载,包括华为云、腾讯云和清华源等主流镜像站的性能对比及一键配置方案。通过实测数据展示华为云镜像站表现最佳,下载速度达19.4MB/s,并提供sed命令、管理界面配置和Docker定制三种高效加速方案,帮助开发者快速解决插件下载慢的问题。

sql99的博客 320

数据库基础知识整理

数据库基础知识整理@[TOC](数据库基础知识整理)DQL进阶1:基础查询进阶2:条件查询进阶3:排序查询进阶4:常见函数单行函数日期函数流程控制函数分组函数进阶5:分组查询进阶6:连接查询sql99语法进阶7:子查询进阶8:分页查询进阶9:联合查询DDL1.库的管理2.表的管理表的创建表的修改表的删除表的复制DML插入语句修改语句删除语句TCL常见约束一、创建表时添加约束二、修改表时添加约束三、...

Lohaks的博客 4465

5G边缘计算:核心网下沉革命

5G核心网与边缘计算的深度融合,通过UPF下沉、本地流量卸载等关键技术,实现了低时延、高效能的分布式计算架构。该技术将数据处理从核心网向边缘节点转移,支持工业控制、车联网、远程医疗等场景的1-10ms超低时延需求。5G核心网的SBA架构和CUPS设计为边缘计算提供了灵活部署基础,SMF、PCF等网元协同确保业务质量与可靠性。

Qinti_mm的博客 1399

AI Agent核心架构解析:从Tool、Skill到MCP协议的智能体构建实战

在人工智能领域,大语言模型(LLM)赋予了AI自主规划与决策的能力,推动了智能体(Agent)技术的演进。其核心原理在于构建一个具备感知、规划、行动与反思能力的自主系统。这一架构的技术价值在于将AI从被动应答升级为主动执行复杂任务的工作伙伴,显著提升了自动化水平与问题解决效率。应用场景广泛覆盖了市场分析、自动化办公、智能客服与垂直领域集成等。本文聚焦于实现这一能力的关键组件:基础工具(Tool)、组合技能(Skill)与标准化协议(MCP)。其中,Skill通过封装多个Tool形成可复用的高级能力,而MCP

chuannaoxuan4674的博客 316

(六)从入门到精通全指南——SQL进阶

本文是SQL进阶学习指南,从基础进阶到核心进阶分阶段讲解。首先夯实基础语法细节和优化技巧,包括规范书写、函数使用和条件查询进阶。接着深入讲解排序分页、聚合分组等复杂查询,覆盖多条件组合、范围查询、模糊查询等场景,并针对不同数据库分页差异提供解决方案。适用于掌握基础SQL但需提升复杂查询和性能优化的开发者,帮助摆脱CRUD操作,应对实际业务场景和面试需求。

修行者Java的博客 644

996引擎 - 读写变量性能测试

单轮100万次读写,取3轮平均耗时(毫秒),有效读取率均为100%,数值越小性能越优。

灵台方寸山斜月三星洞 244

基础篇:数据库 SQL 入门教程_sql学习

某些数据库会列出介于 “Adams” 和 “Carter” 之间的人,但不包括 “Adams” 和 “Carter”;而另一些数据库会列出介于 “Adams” 和 “Carter” 之间的人,包括 “Adams” ,但不包括 “Carter”。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。如图,“Id_O” 列是 Orders 表中的的主键,同时,“Orders” 表中的 “Id_P” 列用于引用 “Persons” 表中的人,而无需使用他们的确切姓名。

2401_84140112的博客 2507

〖Python接口自动化测试实战篇④〗- 接口自动化测试详解

[接口测试] 是相对来说和我们的功能测试 [最为接近的一种自动化测试手段] ,所以我们首先来学习接口测试的内容。 实现接口的开发与接口的测试,在我们的思维上、想法上、面向的态度上都是不一样的。所以大家要有一个思维上的转换,要认识了解一下 接口测试到底是做什么的、它的功能、意义在哪里。...

易编橙 · 终身成长社群,相遇已是上上签! 5万+

45.qt quick-qml虚拟软键盘详解(一)

1.qml虚拟键盘介绍 Qt虚拟键盘的主要功能包括: 可定制的键盘布局和风格与动态切换。 带有单词选择的预测性文本输入。 角色预览和替代角色视图。 自动大小写和空格插入。 不同分辨率的可伸缩性。 支持不同的字符集(拉丁,简体/繁体中文,印地语,日语,阿拉伯语,希伯来语,韩语和其他)。 支持大多数常见的输入语言,可以轻松扩展语言支持。 从左到右和从右到左的输入。 硬件键支持2路和5路导航。 手写支持,带有全屏输入的手势。 音频反馈。 跨平台功能。 支持多国语言,高达40多个语言 本

抵抗时间扭曲,坚持做一件有意义的事 3559

Burpsuite 指纹特征绕过

需要高版本 17 + 的 burp 运行插件,可 bypass 网站流量设备的检测,正常抓包。未使用插件前,burp 指纹特征被识别,抓包被拦截。

Javachichi的博客 6642

深入解析:武汉光庭信息技术 Android CarPlay 开发岗位的技术要求与面试准备(大连)

武汉光庭信息大连分部招聘Android CarPlay开发工程师,要求专科以上学历及2年以上Android开发经验,需精通CarPlay集成技术与车载系统开发。该职位涉及Android底层框架修改、CarPlay协议实现及车规级系统开发,需处理USB/HID驱动、图形合成等技术难点,并确保通过Apple严格认证。求职者需具备扎实的Android开发能力,熟悉车载环境特殊性,包括系统稳定性保障、人机交互适配等技术要点。文章深度解析了职位技术内涵,并提供面试问题与参考答案,帮助求职者全面准备这一复合型技术岗位。

郑伟强dev的专栏 399

SQL进阶 | 三值逻辑与NULL

NULL 不是值。因为 NULL 不是值,所以不能对其使用谓词。对 NULL 使用谓词后的结果是 unknown。unknown 参与到逻辑运算时,SQL 的运行会和预想的不一样。解决 NULL 带来的各种问题,最佳方法应该是往表里添加 NOT NULL 约束来尽力排除 NULL。

仙草不加料的博客 2530

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SQL中的三值逻辑和NULL

在SQL中,三值逻辑(Three-Valued Logic, 3VL)是一个重要概念,它的存在主要是由于 NULL 值的引入。NULL 代表未知值,它既不是空字符串,也不是数字 0,而是一个特殊的标记,表示数据缺失或不可用。

引用原创内容标明出处即可 1384

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SQL进阶:三值逻辑和NULL

多数的编程语言都是基于二值逻辑(true,false),而SQL语言采用为三值逻辑(true,false,'unknown'),而这个不确定因素常常导致查询结果并不是理想中的结果。真值unknown和作为NULL的一种unknown(未知)并不是相同的东西,前者为布尔值的真值,后者既不是值也不hi变量,为了区分前者采用小写后者采用大写。解:一旦使用了比较谓词(=,>,

qq_44625745的博客 744

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SQL三值逻辑和NULL

三值逻辑: 真、假和“不确定值” 三值逻辑和布尔型类型的区别: 普通布尔类型只有true和false两个值,这种逻辑体系被称为二值逻辑。 在SQL语言中还有第三个值:unknown。这种逻辑体系被称为三值逻辑 数据库为什么引入三值逻辑: 问题在于NULL。关系型数据库里引入了NULL,所以不得不同时引入第三个值。 ...

qq_41854797的博客 1002

SQL进阶之路03:三值逻辑和NULL

NULL,unknown真值和unknown详解

m0_58768327的博客 1477

理解三值逻辑与NULL,你离SQL高手更近了一步

什么是NULL NULL 用于表示缺失的值或遗漏的未知数据,不是某种具体类型的值。数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没有值,尤其要明白的是:NULL 值与 0 或者空字符串是不同的。 两种 NULL 这种说法大家可能会觉得很奇怪,因为 SQL 里只存在一种 NULL 。然而在讨论 NULL 时,我们一般都会将它分成两种类型来思考:“未知”(unknown)和“不适用”(not applicable,inapp licable)。 以“不知道戴墨镜的人眼睛是什么颜色

华为云官方博客 2033

SQL查询 — 三值逻辑和NULL

《SQL进阶教程》摘录

Jill_J优快云的博客 988

SQL中NULL值的运算与三值逻辑

NULL值的运算与三值逻辑 问题提出:为什么有 = 还需要有 IS ,两者功能不重复么?** 首先,该问题一般的回答是: IS 只能判断NULL值,不能判断普通数值 = 只能判断普通数值,不能判断NULL值 那问题又来了:为什么要写成“IS NULL”,而不是“= NULL”? 回答这个问题,要清楚SQL中的三种逻辑值: true:0 值 false:非0 值 unknown:用于...

PassionZheng的博客 4403

= null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑

1、NULL参与的所有的比较和算术运算符(>,=,

qq_46023827的博客 1391

SQL进阶——三值逻辑和NULL

编程语言大多是基于二值逻辑的,即逻辑真值只有真和假两个,而SQL语言则采用一种特别的逻辑体系——三值逻辑,即逻辑真值除了真和假,还有第三个值“不确定”​。三值逻辑经常会带来一些意想不到的情况,这让程序员很是烦恼。总之,数据库里只要存在一个NULL,查询的结果就可能不正确。而且,一般没有办法确定具体是哪个查询返回了不正确的结果,所以所有的结果看起来都很可疑。没有谁能保证一定能从包含NULL的数据库里查询出正确的结果。大多数编程语言包括布尔型(BOOL型、BOOLEAN型)这种数据类型。

吴声子夜歌的博客 319

MICK-SQL进阶教程 1.3 三值逻辑和NULL

让自己愈发觉得自己学艺不精的一章、、、 要点: 三值逻辑:true, false, unknown 必须写成“IS NULL”,而不是“= NULL”:对 NULL 使用比较谓词后得到的结果总 是 unknown。而查询结果只会包含 WHERE 子句里的判断结果为 true 的行, 不会包含判断结果为 false 和 unknown 的行。 NULL 既不是值也不是变量。NUL...

大美mixer的博客 494

SQL进价2:三值逻辑和null

1、SQL中的bool类型的值有三种普通编程语言里的布尔型只有 true 和 false 两个值,这种逻辑体系被称为二值逻辑。而 SQL 语言里,除此之外还有第三个值 unknown,因此这种逻辑体系被称为三值逻辑(three-valued logic)。2、null不是值,与数学运算符结果的结果永远是unknown常听到的“列的值为 NULL” 、“NULL 值”这样的说法本身就是错误...

weixin_30426065的博客 342

SQL进阶教程读后总结与感想

以前我是用过程(命令)式思维去看这个世界,到后来我才明白也可以用集合论或者函数式思维去看这个世界。套用大话西游的台词“以前我是用肉眼去看这个世界,到后来我才明白应该用心去看这个世界。查不出,查不快,很可能就是null这个幽灵在作祟,你又无法根除它,只能时刻保持警惕。另外,原书练习题和第三章附录答案等,也很有意思,有兴趣的同学可以找来做做。书到用时方恨少,读了之后,发现SQL还可以这么玩,果然牛掰!所以,近一段时间,阅读函数式编程和SQL编程的书籍较多。两者很像,都不同于过程(命令)式。SQL解惑(第2版)

lyingSeven的博客 1265
上一篇: 读SQL进阶教程笔记01_CASE表达式
下一篇: 读SQL进阶教程笔记03_自连接
躺柒
博客等级 码龄4年 7004粉丝 1317原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值