前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >sql 在not in 子查询有null值情况下经常出现的陷阱

sql 在not in 子查询有null值情况下经常出现的陷阱

作者头像
跟着阿笨一起玩NET
发布于 2018-09-19 08:44:33
发布于 2018-09-19 08:44:33
2.8K00
代码可运行
举报
运行总次数:0
代码可运行

如果下:Table_A表和Table_B表,要求查询出在Table_A表中不在Table_B表中的记录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE [dbo].[Table_A](
 [ID] [nchar](10) NULL,
 [Name] [nchar](10) NULL
) ON [PRIMARY]

GO

ID          Name
001        张三        
002        李四        
003        王五              

 

CREATE TABLE [dbo].[Table_B](
 [ID] [nchar](10) NULL,
 [Name] [nchar](10) NULL
) ON [PRIMARY]

GO

ID        Name
NULL     张三        
002       李四        
NULL     王五 

很容大家第一时间相当的写法是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT  *
FROM    dbo.Table_A AS a
WHERE   a.ID NOT IN ( SELECT    b.ID
                      FROM      dbo.Table_B AS b)

然而查询出来并没有达到预期的

ID    Name 001  张三        003  王五          

原因很简单:由于NULL不能进行如何的“操作”

–如果null参与算术运算,则该算术表达式的值为null。(例如:+,-,*,/ 加减乘除)

–如果null参与比较运算,则结果可视为false。(例如:>=,<=,<>  大于,小于,不等于)

–如果null参与聚集运算,则聚集函数都置为null。除count(*)之外。

--如果在not in子查询中有null值的时候,则不会返回数据。  (最简单的解释请参考下面的评论说明)     

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--正确写法                      
SELECT  *
FROM    dbo.Table_A AS a
WHERE   a.ID NOT IN ( SELECT    b.ID
                      FROM      dbo.Table_B AS b
                      WHERE     b.ID IS NOT NULL ) --排除NULL值参与运算符比较
                      
--建议修改为关联查询方法                                            
--正确写法1             
SELECT  *
FROM    dbo.Table_A AS a
WHERE   NOT EXISTS ( SELECT *
                     FROM   dbo.Table_B AS b
                     WHERE  a.ID = b.ID )
--正确写法2                     
SELECT  *
FROM    dbo.Table_A AS a
        LEFT OUTER JOIN dbo.Table_B AS b ON a.ID = b.ID
WHERE   b.ID IS NULL
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-12-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQL学习之学会使用子查询
1、SELECT语句是SQL的查询。我之前的随笔中所用的SELECT语句都是简单的查询,即从单个数据库表中检索数据的单条SELECT语句。 查询:任何SQL语句都是查询,但此术语一般指SELECT语句。 2、SQL不仅允许简单的SELECT查询,还允许创建子查询,即嵌套在其他查询中的查询。 下面通过实例来了解子查询在实际项目中的应用: create database Study go use Study go create table Customers( Id int identity(1,1), Nam
郑小超.
2018/01/24
1.7K0
SQL学习之学会使用子查询
你真的会玩SQL吗?查询指定节点及其所有父节点的方法
--查询ID = '009'的所有父节点 SET @ID = '009' ;WITH T AS ( SELECT ID , PID , NAME FROM TB WHERE ID = @ID UNION ALL SELECT A.ID , A.PID , A.NAME FROM TB AS A JOIN T AS B ON A.ID = B.PID ) SELECT * FROM T ORDER BY ID /* ID PID NAME ---- ---- --------
欢醉
2018/01/22
2.2K0
SQL service基础(四)连接查询、自身连接查询、外连接查询和复合条件连接查询[通俗易懂]
INSERT [dbo].[T] ([TNO], [TN], [SEX], [AGE], [PROF], [SAL], [COMM], [DEPT]) VALUES (N’T1′, N’李力 ‘, N’男’, 47, N’教授 ‘, 1800, 3000, N’计算机 ‘) GO INSERT [dbo].[T] ([TNO], [TN], [SEX], [AGE], [PROF], [SAL], [COMM], [DEPT]) VALUES (N’T2′, N’王平 ‘, N’女’, 28, N’讲师 ‘, 850, 1200, N’信息 ‘) GO INSERT [dbo].[T] ([TNO], [TN], [SEX], [AGE], [PROF], [SAL], [COMM], [DEPT]) VALUES (N’T3′, N’刘伟 ‘, N’男’, 30, N’讲师 ‘, 900, 1200, N’计算机 ‘) GO INSERT [dbo].[T] ([TNO], [TN], [SEX], [AGE], [PROF], [SAL], [COMM], [DEPT]) VALUES (N’T4′, N’张雪 ‘, N’女’, 51, N’教授 ‘, 1900, 3000, N’自动化 ‘) GO INSERT [dbo].[T] ([TNO], [TN], [SEX], [AGE], [PROF], [SAL], [COMM], [DEPT]) VALUES (N’T5′, N’张兰 ‘, N’女’, 39, N’副教授 ‘, 1300, 2000, N’信息 ‘) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C1′, N’程序设计 ‘, 60) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C2′, N’微机原理 ‘, 80) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C3′, N’数字逻辑 ‘, 60) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C4′, N’数据结构 ‘, 80) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C5′, N’数据库 ‘, 60) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C6′, N’编译原理 ‘, 60) GO INSERT [dbo].[C] ([CNO], [CN], [CT]) VALUES (N’C7′, N’操作系统 ‘, 60) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T1′, N’C1′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T1′, N’C4′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T2′, N’C5′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T3′, N’C1′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T3′, N’C5′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T4′, N’C2′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T4′, N’C3′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T5′, N’C5′, NULL) GO INSERT [dbo].[TC] ([TNO], [CNO], [Evaluation]) VALUES (N’T5′, N’C7′, NULL) GO INSERT [dbo].[S] ([SNO], [SN], [SEX], [AGE], [DEPT]) V
全栈程序员站长
2022/08/23
2.7K0
SQL service基础(四)连接查询、自身连接查询、外连接查询和复合条件连接查询[通俗易懂]
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系
本篇博客讲解(子查询)非相关子查询/相关子查询,一对一,一对多,多对一,多对的的关系!
谙忆
2021/01/21
1.8K0
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系
SQLServer中交叉联接的用法介绍
交叉联接是联接查询的第一个阶段,它对两个数据表进行笛卡尔积。即第一张数据表每一行与第二张表的所有行进行联接,生成结果集的大小等于T1*T2。
小明互联网技术分享社区
2021/04/26
8710
SQLServer中交叉联接的用法介绍
mysql 查询差集方法
select id from table_a where id not in (select id from table_b);
oktokeep
2024/10/09
1770
Sql 语句中 IN 和 EXISTS 的区别及应用「建议收藏」
确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。
全栈程序员站长
2022/09/18
1K0
Sql 语句中 IN 和 EXISTS 的区别及应用「建议收藏」
sqlserver delete 关联条件删除
-- 创建t1表,并插入3条数据 CREATE TABLE [dbo].[t1] ([id] [INT] NOT NULL, [name] [NCHAR](10) NULL) ON [PRIMARY]; GO INSERT INTO dbo.t1(id, name) VALUES(1, -- id - int N'lisi' -- name - nchar(10) ); INSERT INTO dbo.t1(id, name) VALUES(2, -- id - int N'zhangsan' -
跟着阿笨一起玩NET
2021/09/08
1.8K0
解决mysql中limit和in不能同时使用的问题
两种方式推荐第一种。避免了in语句。进行explain诊断会发现第一种效率高很多。
陈灬大灬海
2018/12/12
2.2K0
神奇的 SQL 之温柔的陷阱 → 三值逻辑 与 NULL !
    一个中国小孩参加国外的脱口秀节目,因为语言不通,于是找了一个翻译。     主持人问:“Who is your favorite singer ?”     翻译:”你最喜欢哪个歌手啊 ?”     小孩兴奋地回答:”Michael Jackson”     翻译转身对主持人说:”迈克尔-杰克逊”     主持人看着翻译:"你说什么 ?"
青石路
2019/08/13
1.4K0
神奇的 SQL 之温柔的陷阱 → 三值逻辑 与 NULL !
【MySQL】MySQL 数据库与简单 SQL 语句使用
本博文专用于软件创新实验室 MySQL 数据库与简单 SQL 语句 课堂,请上课的同学们先自行安装 MySQL,可参考群里发的视频,也可以参考博文MySQL安装教程,在开发这条路上,数据库将会一直陪伴着我们!  
sidiot
2023/08/31
6800
【MySQL】MySQL 数据库与简单 SQL 语句使用
MySQL进阶
📦个人主页:楠慧 🏆简介:一个大二的科班出身,主要研究Java后端开发 ⏰座右铭:成功之前我们要做应该做的事情,成功之后才能做我们喜欢的事 💕 过客的你,可以给博主留下一个小小的关注吗?这是给博主最大的支持。以后博主会更新大量的优质的作品!!!! 一、约束 1.外键约束 外键约束概念 让表和表之间产生关系,从而保证数据的准确性! 建表时添加外键约束 为什么要有外键约束 -- 创建db2数据库 CREATE DATABASE db2; -- 使用db2数据库 USE db2; -- 创建user用户
楠羽
2022/11/18
9250
MySQL进阶
高级SQL查询-(聚合查询,分组查询,联合查询)[通俗易懂]
当遇到常见的统计总数、计算平局值等操作,可以使⽤聚合函数来实现,常见的聚合函数有:
全栈程序员站长
2022/09/05
5.1K0
京东三面:什么情况会导致 MySQL 索引失效?
为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景。
Java程序猿
2022/07/29
6340
【数据库】MySQL经典面试题(练习)
【数据库】MySQL经典面试题(练习) 一、删除除了学号字段以外,其它字段都相同的冗余记录,只保留一条!(也就是要删除凤姐和田七中一条重复数据只留一条) 要求结果数据: 原始数据: CREATE TA
Java帮帮
2018/03/15
1.7K0
【数据库】MySQL经典面试题(练习)
有关于MySQL的面试题
​#问题1:1月每笔消费均大于20元的用户的总消费金额#条件:1月+大于20 sum(order_amt
用户10196776
2022/11/22
1.1K0
有关于MySQL的面试题
数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)
执行SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer 我们会得到如下表
风骨散人Chiam
2020/10/28
9150
网易MySQL微专业学习笔记(五)-SQL语言进阶
这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL数据库对象与应用”中的MySQL数据类型相关笔记。
WindCoder
2018/09/19
5850
网易MySQL微专业学习笔记(五)-SQL语言进阶
【数据库】你想要的sql全都有
我很早就想整理一波常用sql,这不就搞起来了。 先执行初始化sql,后面的就可以在这个数据表上面练习了,拿来即用。 我后面会慢慢完善这个大一统的sql集合的,感兴趣的话可以持续关注呀~ /* 目录 数据准备 user表相关 选择数据库 设计表结构 索引相关 增删改查 条件查询 时间查询 连接查询 存储过程 查询数据库大小 设置变量 系统变量 时间函数 其它函数 随机数 **/ -- 数据准备---------------------------------------- CREATE TABLE
用户9913368
2022/08/13
4540
算法工程师-SQL进阶:集合之间的较量
集合在数据库领域表示记录的集合。SQL是一门面向集合的语言,四则运算里的和、差、积已经加入到标准SQL,但由于其标准化进程比较缓慢,一些集合运算在主流的数据库如MySQL、HiveSQL中还未实现。
小萌哥
2020/07/21
2K0
推荐阅读
相关推荐
SQL学习之学会使用子查询
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验