SQLServer中exists和except用法介绍


Posted in SQL Server onDecember 04, 2021

一、exists

1.1 说明

EXISTS(包括 NOT EXISTS)子句的返回值是一个 BOOL 值。EXISTS 内部有一个子查询语句(SELECT ... FROM...),我将其称为 EXIST 的内查询语句。其内查询语句返回一个结果集。

EXISTS 子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

exists:强调的是是否返回结果集,不要求知道返回什么,比如:select name from student where sex = 'm' and mark exists(select 1 from grade where ...),只要 exists 引导的子句有结果集返回,那么 exists 这个条件就算成立了,大家注意返回的字段始终为 1,如果改成 select 2 from grade where ...,那么返回的字段就是 2,这个数字没有意义。所以 exists 子句不在乎返回什么,而是在乎是不是有结果集返回。EXISTS = IN,意思相同不过语法上有点点区别,好像使用 IN 效率要差点,应该是不会执行索引的原因。

相对于 inner join,exists 性能要好一些,当它找到第一个符合条件的记录时,就会立即停止搜索返回 TRUE。

1.2 示例

--EXISTS
--SQL:
select name from family_member
where group_level > 0
and exists(select 1 from family_grade where family_member.name = family_grade.name
and grade > 90)

--result:
name
cherrie

--NOT EXISTS
--SQL:
select name from family_member
where group_level > 0
and not exists(select 1 from family_grade where family_member.name = family_grade.name
and grade > 90)

--result:
name
mazey
rabbit

1.3 intersect/2017-07-21

intersect 的作用与 exists 类似。

--intersect
--SQL:
select name from family_member where group_level > 0
intersect
select name from family_grade where grade > 90

--result:
name
cherrie

二、except

2.1 说明

查询结果上 EXCEPT = NOT EXISTS,INTERSECT = EXISTS,但是 EXCEPT/INTERSECT 的「查询开销」会比 NOT EXISTS/EXISTS 大很多。

except 自动去重复,not in/not exists不会。

SQLServer中exists和except用法介绍

2.2 示例

--except
--SQL:
select name from family_member
where group_level > 0
except(select name from family_grade)

--result:
name
rabbit

--NOT EXISTS
--SQL:
select name from family_member
where group_level > 0
and not exists(select name from family_grade where family_member.name = family_grade.name)

--result:
name
rabbit
rabbit

三、测试数据

其中验证 except 去重复功能时在 family_member 中新增一个 rabbit。

-- ----------------------------
-- Table structure for family_grade
-- ----------------------------
DROP TABLE [mazeytop].[family_grade]
GO
CREATE TABLE [mazeytop].[family_grade] (
[id] int NOT NULL ,
[name] varchar(20) NULL ,
[grade] int NULL 
)


GO

-- ----------------------------
-- Records of family_grade
-- ----------------------------
INSERT INTO [mazeytop].[family_grade] ([id], [name], [grade]) VALUES (N'1', N'mazey', N'70')
GO
GO
INSERT INTO [mazeytop].[family_grade] ([id], [name], [grade]) VALUES (N'2', N'cherrie', N'93')
GO
GO

-- ----------------------------
-- Table structure for family_member
-- ----------------------------
DROP TABLE [mazeytop].[family_member]
GO
CREATE TABLE [mazeytop].[family_member] (
[id] int NOT NULL ,
[name] varchar(20) NULL ,
[sex] varchar(20) NULL ,
[age] int NULL ,
[group_level] int NULL 
)


GO

-- ----------------------------
-- Records of family_member
-- ----------------------------
INSERT INTO [mazeytop].[family_member] ([id], [name], [sex], [age], [group_level]) VALUES (N'1', N'mazey', N'male', N'23', N'1')
GO
GO
INSERT INTO [mazeytop].[family_member] ([id], [name], [sex], [age], [group_level]) VALUES (N'2', N'cherrie', N'female', N'22', N'2')
GO
GO
INSERT INTO [mazeytop].[family_member] ([id], [name], [sex], [age], [group_level]) VALUES (N'3', N'rabbit', N'female', N'15', N'3')
GO
GO
INSERT INTO [mazeytop].[family_member] ([id], [name], [sex], [age], [group_level]) VALUES (N'4', N'rabbit', N'female', N'15', N'3')
GO
GO

-- ----------------------------
-- Table structure for family_part
-- ----------------------------
DROP TABLE [mazeytop].[family_part]
GO
CREATE TABLE [mazeytop].[family_part] (
[id] int NOT NULL ,
[group] int NULL ,
[group_name] varchar(20) NULL 
)


GO

-- ----------------------------
-- Records of family_part
-- ----------------------------
INSERT INTO [mazeytop].[family_part] ([id], [group], [group_name]) VALUES (N'1', N'1', N'父亲')
GO
GO
INSERT INTO [mazeytop].[family_part] ([id], [group], [group_name]) VALUES (N'2', N'2', N'母亲')
GO
GO
INSERT INTO [mazeytop].[family_part] ([id], [group], [group_name]) VALUES (N'3', N'3', N'女儿')
GO
GO

-- ----------------------------
-- Indexes structure for table family_grade
-- ----------------------------

-- ----------------------------
-- Primary Key structure for table family_grade
-- ----------------------------
ALTER TABLE [mazeytop].[family_grade] ADD PRIMARY KEY ([id])
GO

-- ----------------------------
-- Indexes structure for table family_member
-- ----------------------------

-- ----------------------------
-- Primary Key structure for table family_member
-- ----------------------------
ALTER TABLE [mazeytop].[family_member] ADD PRIMARY KEY ([id])
GO

-- ----------------------------
-- Indexes structure for table family_part
-- ----------------------------

-- ----------------------------
-- Primary Key structure for table family_part
-- ----------------------------
ALTER TABLE [mazeytop].[family_part] ADD PRIMARY KEY ([id])
GO

到此这篇关于SQLServer中exists和except用法介绍的文章就介绍到这了,更多相关SQLServer中exists和except内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

SQL Server 相关文章推荐
SQL Server数据定义——模式与基本表操作
Apr 05 SQL Server
【HBU】数据库第四周 单表查询
Apr 05 SQL Server
SQLServer2019 数据库的基本使用之图形化界面操作的实现
Apr 08 SQL Server
sql中mod()函数取余数的用法
May 29 SQL Server
Windows环境下实现批量执行Sql文件
Oct 05 SQL Server
使用SQL实现车流量的计算的示例代码
Feb 28 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
SQL Server数据库基本概念、组成、常用对象与约束
Mar 20 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
SQL SERVER中的流程控制语句
May 25 SQL Server
SQL使用复合索引实现数据库查询的优化
May 25 SQL Server
SQL中的连接查询详解
Jun 21 SQL Server
SQL Server2019数据库备份与还原脚本,数据库可批量备份
SQL中的三种去重方法小结
Nov 01 #SQL Server
SQL Server表分区删除详情
Spark SQL 2.4.8 操作 Dataframe的两种方式
Windows环境下实现批量执行Sql文件
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
Sep 04 #SQL Server
sql server删除前1000行数据的方法实例
Aug 30 #SQL Server
You might like
我用php+mysql写的留言本
2006/10/09 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
javascript date格式化示例
2013/09/25 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
javascript实现数字验证码的简单实例
2014/02/10 Javascript
jquery easyui使用心得
2014/07/07 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
JS实现页面打印功能
2017/03/16 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
Python3远程监控程序的实现方法
2019/07/15 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
户外亲子活动策划方案
2014/02/07 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
航班延误投诉信
2015/07/02 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
javascript Number 与 Math对象的介绍
2021/11/17 Javascript
python中 Flask Web 表单的使用方法
2022/05/20 Python