你真的会玩SQL吗?EXISTS和IN之间的区别
你真的会玩SQL吗?系列目录
你真的会玩SQL吗?之逻辑查询处理阶段
你真的会玩SQL吗?和平大使 内连接、外连接
你真的会玩SQL吗?三范式、数据完整性
你真的会玩SQL吗?查询指定节点及其所有父节点的方法
你真的会玩SQL吗?让人晕头转向的三值逻辑
你真的会玩SQL吗?EXISTS和IN之间的区别
你真的会玩SQL吗?无处不在的子查询
你真的会玩SQL吗?Case也疯狂
你真的会玩SQL吗?表表达式,排名函数
你真的会玩SQL吗?简单的 数据修改
你真的会玩SQL吗?你所不知道的 数据聚合
你真的会玩SQL吗?透视转换的艺术
你真的会玩SQL吗?冷落的Top和Apply
你真的会玩SQL吗?实用函数方法汇总
你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(上)
你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(下)
此文是继文章 你真的会玩SQL吗?三值逻辑 而补充的,那来探讨下为什么有人会建议有些地方用EXISTS代替in
EXISTS和IN之间的区别
1.EXISTS只返回TRUE或FALSE,不会返回UNKNOWN。
2.IN当遇到包含NULL的情况,那么就会返回UNKNOWN。
当查询的列包含NULL时,NOT EXISTS正常返回TRUE或FALSE。
而NOT IN可能返回空集,如下
1:val IN(val1,val2,...,NULL),永远不会返回FALSE,而是返回TRUE或UNKNOWN。
2:val NOT IN(val1,val2,...,NULL),永远不会返回TRUE,而是返回NOT TRUE或NOT UNKNOWN。
看个示例:
Test1表
select t.[name] from Test as t
where exists (select t1.orderid from Test1 as t1 where t1.[name]=t.[name])
返回 aaa,ccc,ddd
select t.[name] from Test as t
where t.[name] in (select t1.[] from Test1 as t1)
返回 aaa,ccc,ddd
select t.[name] from Test as t
where not exists (select t1.orderid from Test1 as t1 where t1.[name]=t.[name])
返回 bbb
select t.[name] from Test as t
where t.[name] not in (select t1.[name] from Test1 as t1)
返回空集
练习
以下对就返回哪三值?
答案
用例数据库文件 你真的会玩SQL吗?之逻辑查询处理阶段 文末
/*写一条查询语句,返回在2007年下过订单,而在2008年没有下过订单的客户。
涉及的表:Sales.Customers表和Sales.Orders表。用exists
期望的输出:*/
custid companyname
----------- ----------------------------------------
21 Customer KIDPX
23 Customer WVFAF
33 Customer FVXPQ
36 Customer LVJSO
43 Customer UISOJ
51 Customer PVDZC
85 Customer ENQZT
参考SQL:
--answer:
select custid, companyname
from Sales.Customers as C
where EXISTS
(select *
from Sales.Orders as O
where O.custid = C.custid
and O.orderdate >= '20070101'
and O.orderdate < '20080101')
and not EXISTS
(select *
from Sales.Orders as O
where O.custid = C.custid
and O.orderdate >= '20080101'
and O.orderdate < '20090101');
/*
1.先处理外层查询,从Sales.Customers表别名C中取出一个元组,将元组相关列值custid传给内层查询
2.执行第一层内层查询,Sales.Orders表别名O,应用where子句返回满足条件O.custid = C.custid和orderdate在2007年至2008年
3.执行第二层内层查询,Sales.Orders表别名O应用where子句返回满足条件O.custid = C.custid和orderdate在2008年至2009年的值
4.执行not EXISTS,外查询根据子查询返回的结果集得到满足条件的行
*/
- 微信消息如何添加文字链接?【微信公众平台技巧】
- JavaScript 背包问题详解
- 【干货】用于机器学习的线性代数速查表
- 使用机器学习预测天气(第一部分)
- linux 常用指令
- LCS 算法:Javascript 最长公共子序列
- 短网址(short URL)系统的原理及其实现
- 设计和实现一款轻量级的爬虫框架
- JavaScript实现模糊推荐的input框(类似搜索框)
- hadoop streaming编程小demo(python版)
- 一个scrapy框架的爬虫(爬取京东图书)
- mongodb生产环境(副本集模式)集群搭建配置
- ELK日志收集分析系统配置
- 【学术】如何在15分钟内建立一个深度学习模型?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Oracle基本参数(INSTANCE_NUMBER)
- Oracle基本参数(LDAP_DIRECTORY_SYSAUTH)
- C#调用C++编写的DLL
- Oracle基本参数(LOG_ARCHIVE_DEST_n)
- [安装文档]Oracle 12c 单节点安装之安装前准备
- Oracle基本参数(NLS_LANGUAGE)
- Oracle基本参数(NLS_TERRITORY)
- C# 探测器测试系统
- Panuon.UI.Silver使用和介绍
- Oracle基本参数(OPEN_CURSORS)
- Oracle基本参数(PROCESSES)
- C# 中的多态性
- Oracle基本参数(REMOTE_LISTENER)
- C#基于yolov3的行人检测
- yolov3和yolov4检测效果对比