加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer中exists和except用法

发布时间:2020-12-12 13:43:15 所属栏目:MsSql教程 来源:网络整理
导读:一、exists 1.1 说明 EXISTS(包括 NOT EXISTS)子句的返回值是一个BOOL值。EXISTS内部有一个子查询语句(SELECT ... FROM...),我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。Lin

一、exists

1.1 说明

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

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效率要差点,应该是不会执行索引的原因。Link

相对于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

二、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

三、测试数据

--?----------------------------
--?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],?[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?,[sex]?varchar(20)?NULL?,[age]?int?NULL?,[group_level]?int?NULL?
)


GO

--?----------------------------
--?Records?of?family_member
--?----------------------------
INSERT?INTO?[mazeytop].[family_member]?([id],?[sex],?[age],?[group_level])?VALUES?(N'1',?N'male',?N'23',?N'1')
GO
GO
INSERT?INTO?[mazeytop].[family_member]?([id],?[group_level])?VALUES?(N'2',?N'female',?N'22',?N'2')
GO
GO
INSERT?INTO?[mazeytop].[family_member]?([id],?[group_level])?VALUES?(N'3',?N'rabbit',?N'15',?N'3')
GO
GO
INSERT?INTO?[mazeytop].[family_member]?([id],?[group_level])?VALUES?(N'4',?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_name])?VALUES?(N'2',?N'2',?N'母亲')
GO
GO
INSERT?INTO?[mazeytop].[family_part]?([id],?[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用法

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读