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 相关文章推荐
SQLServer2008提示评估期已过解决方案
Apr 12 SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
Apr 16 SQL Server
如何有效防止sql注入的方法
May 25 SQL Server
SQL Server代理:理解SQL代理错误日志处理方法
Jun 30 SQL Server
SqlServer数据库远程连接案例教程
Jul 15 SQL Server
SQL语句中JOIN的用法场景分析
Jul 25 SQL Server
sql server删除前1000行数据的方法实例
Aug 30 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
SQL Server中的游标介绍
May 20 SQL Server
SQL Server中搜索特定的对象
May 25 SQL Server
SQL Server使用PIVOT与unPIVOT实现行列转换
May 25 SQL Server
SQL解决未能删除约束问题drop constraint
May 30 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
我常用的几个类
2006/10/09 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
PHP整合PayPal支付
2015/06/11 PHP
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
php实现文章评论系统
2019/02/18 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
动态刷新 dorado树的js代码
2009/06/12 Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
详解React路由传参方法汇总记录
2020/11/29 Javascript
Python类继承和多态原理解析
2020/02/05 Python
python 录制系统声音的示例
2020/12/21 Python
java字符串格式化输出实例讲解
2021/01/06 Python
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
JSF界面控制层技术
2013/06/17 面试题
宣传活动总结范文
2014/07/01 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
会计工作态度自我评价
2015/03/06 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技
vue+elementui 实现新增和修改共用一个弹框的完整代码
2021/06/08 Vue.js
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技
一文搞懂Java中的注解和反射
2022/06/21 Java/Android