当前位置: 首页 > news >正文

SQL备忘--特殊状态“未知“以及“空值NULL“的判断

一、新逻辑状态:未知

  1. 对于大多数其他语言的逻辑判断,一般只有两种结果:真(TURE)假(FALSE)
  2. 但在SQL中,还会有第三种判断结果:未知(UNKNOWN),表示无法判断出真或者假。

未知状态会影响传统逻辑运算(与或非等)的结果,总结如下:

1. 逻辑与操作
AND/&&未知
未知未知未知

特别注意:

  • 对于AND运算符,只有当两边的运算结果都为真时,最终结果才为真
  • 真 AND 未知 = 未知, 并不是真
2. 逻辑或操作
OR未知
未知未知未知
  • 对于OR运算符,只要两边的运算有一个为真时,最终结果就为真,否则最终结果为假或者未知
3. 逻辑非操作
NOT运算结果
未知未知

二、SQL中"未知"状态的判断影响

SQL语句中的WHERE、HAVING、CASE表达式,只返回逻辑运算结果为的数据,不返回为假或者未知的数据

三、NULL空值

在数据库中,空值NULL是一个特殊值,表示缺失或者未知
在SQL语句中,任何数据与空值进行算术比较的结果是未知,而非真或非假.。所以空值NULL无法通过 “WHERE c1 = NULL” 来判断,需要写成 WHERE c1 IS NULL ,才能作为条件筛选出查询字段为NULL的数据

1. NULL判断的特殊性

即使两个未知数据进行比较,运算结果也是未知的,比如下面的比较,都得不出TRUE,而是未知。以下例子则判断为未知

NULL = 0
NULL != 0
NULL = ‘’ (空字符串)
NULL = !‘’
NULL = NULL
NULL = !NULL

因此在WHERE语句中进行判断时,务必要注意查询列或者查询条件(即等号两边的数据)都有没有可能为NULL,如果有则要用IS NULL来判定

替代方案

Mysql提供了<=>运算符,即可等值比较,也可空值比较;

-- mysql
SELECT 1 <=> 1, NULL <=> NULL;

PostgreSQL提供的是:IS [NOT] DISTINCT FROM


-- postgreSQL
SELECT 1 IS DISTINCT FROM 1, NULL IS DISTINCT FROM NULL;
2. NULL对IN() 运算符的影响

IN运算符为判断所给条件是否在某个集合中。内部实际使用等值运算符=来判断是否和集合中的每个元素相等,再用OR串联起来得到最后的逻辑结果。

SELECT *
FROM student
WHERE name IN("LiLei", "HanMeimei")		-- 等同于 WHERE name = "LiLei" OR name = "HanMeimei"

因此如果想通过IN() 运算符中加NULL元素来将被查字段中的NULL值也筛选出来,实际是无法生效的。比如想实现以下SQL筛选出学生姓名为NULL的,不会有效

-- 无法筛选出name为NULL的记录
SELECT *
FROM student
WHERE name IN("LiLei", "HanMeimei", NULL)		
/* 等同于 WHERE name = "LiLei" OR name = "HanMeimei" or name = NULL   对于真正name为NULL的数据,此表达式最终的结果为未知,不会被筛选出来   */

在NOT IN() 中使用NULL,影响会更大,使得判断无法筛选出任何记录

-- 无法筛选出任何记录
SELECT *
FROM student
WHERE name NOT IN("LiLei", "HanMeimei", NULL)	
/* 因为原句等同于: WHERE name != "LiLei" and  name != "HanMeimei" and name != NULL. 任何值在最后一句中的判断结果都会为"UNKOWN",使得整个判断变为未知,被过滤掉 */
3. NULL对子查询语句中,ALL()/ANY() 运算符的影响

子查询中,可以通过比较运算符(=、!=、<、<=、>、>=)与ALL、ANY的组合,来表示等于、不等于、大于…集合中的全部数据

SELECT *
FROM student
WHERE class =ANY (		-- 查找属于1年级的学生SELECT class FROM teacherWHERE grade = 1
)

ALL运算符相当于:对其中每个选项进行比较运算符计算,并用AND运算符串联
IN运算符相当于:对其中每个选项进行=运算符计算,并用OR运算符串联
ANY与IN类似,也是由OR运算符串联,比较运算符写于ANY之前;如果是=ANY,则与IN相同

对于ALL、ANY等运算符,后面加上NULL不会成功筛选出想要的NULL数据,相反会导致比较离谱的运算结果

总结
  • 使用IN/NOT IN/ALL/ANY时,切记不要在选项中设置NULL。对于子查询做以上匹配结果时,也要注意务必过滤下NULL数据
4. 空值处理
COALESCE函数

COALESCE(exp1, exp2, exp3, …)接收一个输入列表,返回第一个非NULL的参数;若都为空,则返回NULL

SELECT COALESCE(yuwen_score, shuxue_score, yingyu_score)
FROM student

可以用COALESCE将NULL转换为别的默认值,类似于CASE WHEN

SELECT COALESCE(yuwen_score, 0)   -- 若语文成绩为NULL, 则记为0分
FROM student
NULLIF函数

NULLIF(exp1, exp2)接收两个入参:若相等则返回NULL;若不等则返回exp1

SELECT NULLIF(yuwen_score, 0)   -- 若语文成绩为0, 则记为NULL;不为0,则取此成绩
FROM student

NULLIF函数最大的目的是被用来防止除零错误

SELECT AVG(yuwen_score)/NULLIF(yuwen_score, 0) --若某同学语文成绩为0,则分母为NULL(不是0),此时不会报错
FROM student
IFNULL函数

MYSQL与SQLite才有,入参只有两个,功能是返回两个入参中第一个非空的值(可视为入参固定为两个的COALESCE函数)。注意与NULLIF区分。

SELECT IFNULL(yuwen_score, 0)   -- 若语文成绩为NULL, 则记为0
FROM student

相关文章:

SQL备忘--特殊状态“未知“以及“空值NULL“的判断

一、新逻辑状态&#xff1a;未知 对于大多数其他语言的逻辑判断&#xff0c;一般只有两种结果&#xff1a;真(TURE)或假(FALSE)但在SQL中&#xff0c;还会有第三种判断结果&#xff1a;未知(UNKNOWN)&#xff0c;表示无法判断出真或者假。 未知状态会影响传统逻辑运算&#x…...

《Pytorch新手入门》第一节-认识Tensor

《Pytorch新手入门》第一节-认识Tensor 一、认识Tensor1.1 Tensor定义1.2 Tensor运算操作1.3 Tensor与numpy转换 参考《深度学习框架PyTorch&#xff1a;入门与实践_陈云(著)》 一、认识Tensor 1.1 Tensor定义 Tensor 是 PyTorch 中重要的数据结构&#xff0c;可认为是一个高…...

【JAVA学习笔记】55 - 集合-Map接口、HashMap类、HashTable类、Properties类、TreeMap类(难点)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/map_ Map接口 一、Map接口的特点&#xff08;难点&#xff09; 难点在于对Node和Entry和EntrySet的关系 注意:这里讲的是JDK8的Map接口特点 Map java 1) Map与Collect…...

Pytorch图像模型转ONNX后出现色偏问题

本篇记录一次从Pytorch图像处理模型转换成ONNX模型之后&#xff0c;在推理过程中出现了明显色偏问题的解决过程。 问题描述&#xff1a;原始pytorch模型推理正常&#xff0c;通过torch.onnx.export()函数转换成onnx之后&#xff0c;推理时出现了比较明显的颜色偏差。 原始模型…...

插值表达式 {{}}

前言 持续学习总结输出中&#xff0c;今天分享的是插值表达式 {{}} Vue插值表达式是一种Vue的模板语法&#xff0c;我们可以在模板中动态地用插值表达式渲染出Vue提供的数据绑定到视图中。插值表达式使用双大括号{{ }}将表达式包裹起来。 1.作用&#xff1a; 利用表达式进行…...

白雪公主

前言 #define 皇后 王后 在很久很久以前&#xff0c;有一个国王&#xff0c;由于王后难产致死&#xff0c;导致生下的孩子没母,由于缺爱&#xff0c;变的非常的刻薄 由于公主过于刻薄&#xff0c;以至于见到她的人都面色煞白感到空中飘雪 37C 的嘴怎能说出如此刻薄的话语。为了…...

宏观角度认识递归之合并两个有序链表

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 依旧是利用宏观角度来看待问题&#xff0c;其中最主要的就是要找到重复的子问题&#xff1b; 题目中要求把两个有序链表进行合并&#xff0c;同时不能够创建新的节点&#xff0c;并返回链表的起始点&#xff1a;因…...

Leetcode-509 斐波那契数列

使用循环 class Solution {public int fib(int n) {if(n 0){return 0;}if(n 1){return 1;}int res 0;int pre1 1;int pre2 0;for(int i 2; i < n; i){res pre1 pre2;pre2 pre1;pre1 res;}return res;} }使用HashMap class Solution {private Map<Integer,Int…...

解密 docker 容器内 DNS 解析原理

背景 这几天在使用 docker 中&#xff0c;碰到了在容器中 DNS 解析的一些问题。故花些时间弄清了原理&#xff0c;写此文章分享。 1. docker run 命令启动的容器 以启动一个 busybox 容器为例&#xff1a; rootubuntu20:~# docker run -itd --name u1 busybox 63b59ca8aeac…...

故障诊断模型 | Maltab实现SVM支持向量机的故障诊断

效果一览 文章概述 故障诊断模型 | Maltab实现SVM支持向量机的故障诊断 模型描述 Chinese: Options:可用的选项即表示的涵义如下   -s svm类型:SVM设置类型(默认0)   0 – C-SVC   1 --v-SVC   2 – 一类SVM   3 – e -SVR   4 – v-SVR   -t 核函数类型:核函…...

开源的网站数据分析统计平台——Matomo

Matomo 文章目录 Matomo前言一、环境准备1. 整体安装流程2.安装PHP 7.3.303.nginx配置4.安装matomo4.1 访问安装页面 http://192.168.10.45:8088/index.php4.2 连接数据库4.3 设置管理员账号4.4 生成js跟踪代码4.5 安装完成4.6 警告修改4.7 刷新页面&#xff0c;就可以看到登陆…...

linux入门到地狱

linux—001入门 IT圈必备(前端工作者用的比较少) 老旧电脑跑linux不容易卡 我代码没保存windows闪退&#xff0c;僵停(vs2019卡掉线)&#xff0c;重启更新,占用cpu内存服务报错pip各种bug 出来生态环境友好其他的全是bug(bug时间成本超过了windows快捷友好生态) 那就说明wind…...

架构”4+1“视图

1995年Kruchten提出了著名的“41”视图&#xff0c;用来描述软件系统的架构。在“41”视图中&#xff0c;&#xff08;物理视图 &#xff09;用来描述系统软硬件之间的映射关系&#xff0c;这个视图往往&#xff08;系统工程人员&#xff09;最为关注&#xff1b;&#xff08;逻…...

『精』Vue 组件如何模块化抽离Props

『精』Vue 组件如何模块化抽离Props 文章目录 『精』Vue 组件如何模块化抽离Props一、为什么要抽离Props二、选项式API方式抽离三、组合式API方式抽离3.1 TypeScript类型方式3.2 文件分离方式3.3 对文件分离方式优化 参考资料&#x1f498;推荐博文&#x1f357; 一、为什么要抽…...

JavaScript字符串字面量详细解析与代码实例

JavaScript字符串字面量是一种表示字符串值的语法结构&#xff0c;通常用双引号或单引号括起来。 var str1 "Hello World!"; var str2 Hello World!;另外&#xff0c;如果需要在字符串中包含双引号或单引号&#xff0c;可以使用转义字符\来实现。 var str3 &quo…...

Android java Handler sendMessage使用Parcelable传递实例化对象,我这里传递Bitmap 图片数据

一、Bundle给我们提供了一个putParcelable(key,value)的方法。专门用于传递实例化对象。 二、我这里传递Bitmap 图片数据&#xff0c;实际使用可以成功传统图像数据。 发送&#xff1a;Bundle bundle new Bundle();bundle.putParcelable("bitmap",bitmap);msg.setD…...

CTF工具PDF隐写神器wbStego4open安装和详细使用方法

wbStego4open安装和详细使用方法 1.wbStego4open介绍&#xff1a;2.wbStego4open下载&#xff1a;3.wbStego4open原理图&#xff1a;4.wbStego4open使用教程&#xff1a;第一步&#xff1a;第二步&#xff1a;第三步&#xff1a;第四步&#xff1a;第五步&#xff1a; 5.wbSteg…...

docker镜像使用

一、查看docker版本 docker version docker默认安装目录 /var/lib/docker 目录文件如下&#xff1a; 二、查看下载的镜像 docker images 三、下载镜像 docker pull [OPTIONS] NAME[:TAG|DIGEST] option作用-a, --all-tags拉取所有 tagged 镜像–disable-content-trust…...

【Git】git的下载安装与使用

目录 目录 一.下载安装 官方下载 淘宝镜像下载 安装 二.创建本地仓库 三.git的基本操作命令 git status git add . git commit -m " " 四.gitee(码云&#xff09;的使用 配置ssh公钥 ​编辑 查看公钥 gitee创建仓库 将本地仓库的文件上传到远程仓库…...

R语言中的函数27:polynom::polynomial(), deriv(),integral(),solve()多式处理函数

文章目录 介绍polynomial()用法参数实例多项式的加减乘除等运算实例 deriv()和integral()用法参数实例solve()参数实例 介绍 R语言中的polynom包可以实现对多项式的操作&#xff0c;例如&#xff1a;加、减、乘、除、微分、积分。使用的时候先用polynomial()函数定义一个多项式…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...