SQLServer中exists和except用法介绍

目录
  • 一、exists
    • 1.1 说明
    • 1.2 示例
    • 1.3 intersect/2017-07-21
  • 二、except
    • 2.1 说明
    • 2.2 示例
  • 三、测试数据

一、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不会。

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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • sqlserver exists,not exists的用法

    学生表:create table student( id number(8) primary key, name varchar2(10),deptment number(8))选课表:create table select_course(  ID         NUMBER(8) primary key,  STUDENT_ID NUMBER(8) foreign key (COURSE_ID) references course(ID),  COURSE_ID  NUMBER(8) for

  • SQLServer中exists和except用法介绍

    目录 一.exists 1.1 说明 1.2 示例 1.3 intersect/2017-07-21 二.except 2.1 说明 2.2 示例 三.测试数据 一.exists 1.1 说明 EXISTS(包括 NOT EXISTS)子句的返回值是一个 BOOL 值.EXISTS 内部有一个子查询语句(SELECT ... FROM...),我将其称为 EXIST 的内查询语句.其内查询语句返回一个结果集. EXISTS 子句根据其内查询语句的结果集空或者非空,返回一个布尔值. exists:

  • 基于Python2、Python3中reload()的不同用法介绍

    reload() 简介 作用:用于重新载入之前载入的模块 语法格式:reload(module) 参数:module为模块对象,必须已经被加载 返回值:返回模块对象 注意事项: 多次重复使用import语句时,不会重新加载被指定的模块,只是把对该模块的内存地址给引用到本地变量环境. reload()会重新加载已加载的模块,重新编译模块,重新执行模块级代码,但是__init__函数不再重复执行,原来已经使用的实例还是会使用旧的模块,而新生产的实例会使用新的模块:reload后还是用原来的内存地址:

  • python 的numpy库中的mean()函数用法介绍

    1. mean() 函数定义: numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<class numpy._globals._NoValue at 0x40b6a26c>)[source] Compute the arithmetic mean along the specified axis. Returns the average of the array elements. The average is taken over

  • WPF中的数据模板用法介绍

    数据模板常用在3种类型的控件, 下图形式: 1.Grid这种列表表格中修改Cell的数据格式, CellTemplate可以修改单元格的展示数据的方式. 2.针对列表类型的控件, 例如树形控件,下拉列表,列表控件, 可以修改其中的ItemTemplate. 3.修改ContentTemplate, 例UserControl控件的数据展现形式. CellTemplate 模板 下面用一个例子, 来演示CellTemplate使用.例子实现一个DataGrid 展示一个普通的数据标, 同时新增一列C

  • SQL语句中EXISTS的详细用法大全

    目录 前言 一.建表 二.在SELECT语句中使用EXISTS 1.在SQL中使用EXISTS 2.在SQL中使用NOT EXISTS 3.在SQL中使用多个NOT EXISTS 4.在SQL中使用多个EXISTS 5.在SQL中使用NOT EXISTS和EXISTS 三.在DELETE语句中使用EXISTS 1.在MySQL中使用 2.在Oracle中使用 四.在UPDATE语句中使用EXISTS 1.在MySQL中使用 2.在Oracle中使用 总结 前言 在业务开展中,会遇到类似需求. 需

  • sql中exists的基本用法示例

    目录 [exists语句的执行顺序如下]: 附:exists与in比较 总结: 现有:班级表(A_CLASS) 学生表( STUDENT) 注:学生表(STUDENT)的classId关联班级表(A_CLASS)的主键ID 代码: select * from STUDENT s WHERE exists (select 1 from A_ClASS c where s.CLASS_ID=c.ID) 结果 [exists语句的执行顺序如下]: 1.首先会执行外循环(select * from st

  • SQLserver中的declare变量用法

    SQL中的declare用法 平时写SQL查询.存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣. 大家都知道c#中的局部变量,在if中如果我们定义一个变量的话他的作用到if结束为止,if外是不识别这个变量的,else里都不能使用,简单的写一下. if(true) { Int32i=1; Console.WriteLine(i); } 这个i的作用域就是if里面,如果我们在if外面用这个

  • C#委托方法Func()中GetInvocationList()方法的用法介绍

    在日常使用委托时,有以下常用方法 方法名称 说明  Clone   创建委托的浅表副本.  GetInvocationList   按照调用顺序返回此多路广播委托的调用列表.  GetMethodImpl   返回由当前的 MulticastDelegate 表示的静态方法.  GetObjectData   用序列化该实例所需的所有数据填充 SerializationInfo 对象.  MemberwiseClone   创建当前 Object 的浅表副本.  RemoveImpl   调用列

  • ASP.NET Core MVC中Form Tag Helpers用法介绍

    简介 我们已经介绍过Tag Helpers以及一些最常用的Tag Helpers,也谈到了缓存Tag Helpers.在这篇文章中,我们将讨论表单Tag Helpers. HTML或Web表单通过使用各种HTML元素用于收集来自用户的输入,如输入框.复选框.单选按钮.下拉列表等.使用 <form> 元素时,我们通常使用POST请求.虽然也可以使用GET请求,不过GET请求建议提交于少量.非敏感的数据来获取数据. ASP.NET Core MVC提供了一些Form Tag Helpers,让我们

  • sqlserver中关于WINDOWS性能计数器的介绍

    Processer : %Processor Time 处理器忙于执行执行任务的时间量 阀值<80%正常状况,<50%状况良,<30%状况优,持续>80%,则CPU有瓶颈或内存不足或出现了低的查询计划重用率,未优化的语句等等. SQLServer:Buffer Manager Buffer cache hit ratio 缓冲区调整缓冲命中率,阀值>97%正常状况,推荐>99%,如果此项低于97%则内存不足. Checkpoint pages/sec SQL检查点,此项

随机推荐