SQL Server 2005中EXCEPT和INTERSECT运算符的使用



  1.介绍

  EXCEPT和INTERSECT运算符使您可以比较两个或多个SELECT语句结果并返回非重复值

  2.区别

  EXCEPT运算符返回由EXCEPT运算符左侧查询返回、而又不包含在右侧查询所返回值中所有非重复值

  INTERSECT返回由INTERSECT运算符左侧和右侧查询都返回所有非重复值

  3.注意事项

  (1).使用EXCEPT或INTERSECT比较结果集必须具有相同结构它们列数必须相同并且相应结果集列数据类型必须兼容

  (2).INTERSECT运算符优先于EXCEPT

  (3).SELECT INTO必须是包含INTERSECT或EXCEPT运算符语句中个查询用来创建容纳最终结果集

  (4).ORDER BY子句中列名或别名必须引用左侧查询返回列名

  4.例题:

  --建立3个表分别插入数据

 create table TableA(col1 )
  insert o TableA select 1
  insert o TableA select 1
  insert o TableA select 2
  insert o TableA select 3
  insert o TableA select 4
  insert o TableA select 4
  insert o TableA select 5
  insert o TableA select null
  insert o TableA select null
  create table TableB(col2 )
  insert o TableB select null
  insert o TableB select 1
  insert o TableB select 2
  insert o TableB select 3
  create table TableC(col3 )
  insert o TableC select 1
  insert o TableC select 5
  insert o TableC select 6


  --利用EXCEPT

  --找出TableA表col1列不存在Tablec表col1列所有非重复值

 SELECT col1 FROM TableA
  EXCEPT
  SELECT col3 FROM Tablec

  结果如下:

  col1

  -----------

  NULL

  2

  3

  4

  --sql 2000版本用not exists实现EXCEPT功能 

 SELECT col1
  FROM TableA as a
  where not exists(SELECT col3 FROM Tablec where a.col1=col3)
  group by col1


  --sql 2000,not in是得不到上述结果

  --空值表示值未知空值区别于空白或零值没有两个相等空值

  --比较两个空值或将空值和任何其他值相比均返回未知这是每个空值均为未知

  --使用IN或NOT IN比较后返回所有空值都将返回UNKNOWN

  --将空值和IN或NOT IN起使用会产生意外结果

SELECT col1
  FROM TableA
  where col1 not in(SELECT col3 FROM Tablec)
  group by col1


  结果如下:

  col1

  -----------

  2

  3

  4

  --INTERSECT运算符优先于EXCEPT

  --运算步骤是:先运算TableB和TableCINTERSECT,再和TableA运算EXCEPT

 SELECT col1 FROM TableA
  EXCEPT
  SELECT col2 FROM TableB
  INTERSECT
  SELECT col3 FROM TableC

  结果如下:

  col1

  -----------

  NULL

  2

  3

  4

  5

  --SELECT INTO应用

  --SELECT INTO必须是语句中个查询

  --我记得SELECT INTO和UNION运算符使用也是这样规则 

 SELECT col1
  o #tem
  FROM TableA
  EXCEPT
  SELECT col3
  FROM Tablec
  select * from #tem
  drop table #tem


  结果如下:

  col1

  -----------

  NULL

  2

  3

  4

  --ORDER BY子句

  --ORDER BY子句中列名或别名必须引用左侧查询返回列名 

SELECT col1 FROM TableA
  INTERSECT
  SELECT col3 FROM TableC
  order by col1


  结果如下:

  col1

  -----------

  1

  5
Tags: 

延伸阅读

最新评论

发表评论