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
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
SQLServer 日期函数大全(小结)
Apr 08 SQL Server
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
Jun 30 SQL Server
数据库之SQL技巧整理案例
Jul 07 SQL Server
SQL语句中JOIN的用法场景分析
Jul 25 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
sql server 累计求和实现代码
Feb 28 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
SQL Server远程连接的设置步骤(图文)
Mar 23 SQL Server
SQL Server表分区降低运维和维护成本
Apr 08 SQL Server
SQL SERVER中的流程控制语句
May 25 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 购物车的例子
2009/05/04 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
php递归函数怎么用才有效
2018/02/24 PHP
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
javascript中caller和callee详解
2015/08/10 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
深入解析Vue 组件命名那些事
2017/07/18 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
react实现换肤功能的示例代码
2018/08/14 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
分析python切片原理和方法
2017/12/19 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
python构建深度神经网络(续)
2018/03/10 Python
django加载本地html的方法
2018/05/27 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
Omio中国:全欧洲低价大巴、火车和航班搜索和比价
2018/08/09 全球购物
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
操行评语大全
2014/04/30 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
应急处置方案
2014/06/16 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
2016新年慰问信范文
2015/03/25 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书