mssql sqlserver 子查询注意事项说明


摘要:
下文讲述我们平常使用子查询的注意事项,如下所示:
实验环境:sql server 2008 R2


子查询注意事项:
1.子查询为放在括号中
2.子查询中不能使用order by 关键字,
如果子查询为 top N 选择时,可以使用order by
3. 子查询可返回单行和多行
对等于 子查询必须使用返回单行子查询
4.依赖外部查询的子查询的效率问题
在子查询的编写上,需注意子查询的语句写法和连接及临时表进行性能对比,避免出现低效的sql脚本写法。

mssql sqlserver not in和not exists关键字的区别及注意事项


摘要:
not in和not exists关键字分别对应in和exists关键字的相反操作,
在sql中使用in和exists关键字可以完成达到相同的功能,但是在not in和not exists中需要特别注意
当列中存在null值时,子查询得到的结果不同


例:

 create table [maomao365.com_a]
   (keyIdA int,infoA nvarchar(20))
 create table [maomao365.com_b]
   (keyIdB int,infoB nvarchar(20))
go


一、不含null值的子查询

truncate table [maomao365.com_a]
truncate table [maomao365.com_b]
  insert into [maomao365.com_a]
 (keyIdA,infoA)values(1,N'sql博客'),
(2,N'猫猫教程')

  insert into [maomao365.com_b]
 (keyIdB,infoB)values(1,N'测试') 

  select  keyIdA,infoA from [maomao365.com_a] 
  where not exists(
     select null from [maomao365.com_b] 
       where infoB =  infoA
   )
  
   select keyIdA,infoA from [maomao365.com_a]
    where infoA not  in (
       select infoB from  [maomao365.com_b]
      )
------以上sql返回的结果相同


二、含null值的子查询


当子查询中包含null值时,not in 和not exists 执行后的效果并不相同,返回的结果不相同。

    truncate table [maomao365.com_a]
truncate table [maomao365.com_b]
  insert into [maomao365.com_a]
 (keyIdA,infoA)values(1,N'sql博客'),
(2,N'猫猫教程')

  insert into [maomao365.com_b]
    (keyIdB,infoB)values(1,N'测试') ,
    (null,N'测试2')

  select  keyIdA,infoA from [maomao365.com_a] 
  where not exists(
     select null from [maomao365.com_b] 
       where infoB =  infoA
   )
  
   select keyIdA,infoA from [maomao365.com_a]
    where infoA not  in (
       select infoB from  [maomao365.com_b]
      )
--执行以上两段sql脚本,我们发现not in 子查询未返回任何信息,出现此现象的原因为:
  null值同任何值比较都会得到unknown结果,如果想让null值返回true,须使用is null 判断
 例:
    1 in (1,null) 返回true 
    1 not in (1,null) 返回unknown,因为sql server不知道1和null的比较关系,
      所以返回not unknown


注意事项:
为了避免包含null值的not in查询,我们应使用is not null对子查询数据进行过滤,
not in应改写为以下sql脚本
select keyIdA,infoA from [maomao365.com_a]
where infoA not in (
select infoB from [maomao365.com_b]
where infoB is not null
)

mssql sqlserver in和exists子查询用法对比简介


摘要:
下文讲述in和exists子查询的用法,如下所示:
实验环境:sql server 2008 R2


下文讲述in和exists关键使用子查询。
在sqlserver中如果我们使用in、ANY、ALL生成的子查询,我们都可以转换为exists子查询进行使用,
但是exists子查询比in子查询具有更强大的功能。

in子查询使用简介

in子查询的语法格式:
select [列1],[列2]…
from tableName
where [列] in (子查询)

select [列1],[列2]…
from tableName
where [列] not in (子查询)



exists子查询使用简介

exists语法如下:
select [列1],[列2]…
from tableName
where exists (子查询)

select [列1],[列2]…
from tableName
where not exists (子查询)



exists子查询不返回任何数据库,如果子查询存在行数据,则返回true
否则返回false代表where条件不成立,
exists中子查询应该是一个包含搜索条件的查询,只需判断是否有行信息返回,
所有exists子查询中出现 select * select 1 select 0 select null 都是等效
————————–

in 子查询一次只能对一列等值操作,
而exists子查询可以同时对主表的多列进行比对操作(like 大于 小于 等等比较运算符)

相关阅读:
mssql sqlserver 数据表存在null导致not in 子查询异常记录