EXCEPT和MINUS操作符
数据库程序设计的目标就是最大限度地减少需要通过网络传送的数据量并消除客户端不必要的处理过程也就是说只向RDBMS请求需要的数据不触动其余任何之物INTERSECT操作符可以求取两个查询结果的交集而EXCEPT操作符则用于求取两个查询结果的差集
INTERSECT操作符和EXCEPT操作符是一种便利的表示方式可以使用INNER JOIN和OUTER JOIN来分别替代它们(加上某些调整消除重复的记录)
在上面的例子中如果使用EXCEPT操作符代替INTERSECT操作符查询结果将显示在书柜上还没有分配到位置的所有图书(即在LOCATION表中没有相应的记录)
SELECT bk_id FROM books
EXCEPT
SELECT fk_bk_loc FROM location;
bk_id
( row(s) affected)
该查询仅返回在BOOKS表中存在的同时在LOCATION表中不存在相应记录的记录在本章结尾的练习中将尝试使用INTERSECT操作符和EXCEPT操作符
可以使用NOT EXISTS操作符和相关子查询来代替EXCEPT(或MINUS)关键字虽然没有获得SQL标准委员会的官方支持但所有RDBMS都支持这种语法(除了在OpenOffice中作为嵌入式RDBMS的HSQLDB例外)
DBMicrosoft SQL Server和PostgreSQL都实现了EXCEPT关键字Oracle则使用MINUS关键字MySQL和HSQLDB既支持EXCEPT操作符又支持MINUS关键字Microsoft Access对两者都不支持
试一试求取数据集的差集
为了进一步观察数据集操作符(例如INTERSECT操作符和EXCEPT操作符)的使用下面将在已经完美匹配的数据中添加一些新数据在本章之前讨论LEFT OUTER JOIN时已经执行过类似的操作在下面的练习中可以再次使用相同的记录
接下来将在BOOKS表中添加一条不匹配的记录用于演示INTERSECT操作符和EXCEPT操作符的应用
() 打开Microsoft SQL Server Management Studio使用Windows身份验证连接到数据库
() 单击位于左上角的New Query按钮
() 在打开的查询窗口(中间的窗格)中输入下面的SQL查询
INSERT INTO books (bk_id bk_title)
VALUES (UNMATCHED RECORD)
() 现在BOOKS表中已经具有一条新记录该记录在LOCATION表中没有对应的位置此时使用INTERSECT操作符和EXCEPT操作符将查询到什么结果呢?首先执行一个使用INTERSECT操作符的查询
SELECT bk_id FROM books
INTERSECT
SELECT fk_bk_loc FROM location;
() 可以预见该查询只会返回条记录BOOKS表与LOCATION表中都匹配的记录
() 运行使用EXCEPT操作符的查询将产生一个不同的结果
SELECT bk_id FROM books
EXCEPT
SELECT fk_bk_loc FROM location;
bk_id
( row(s) affected)
示例说明
在将一条新记录插入到BOOKS表之后BOOKS表中包含了条记录但只有条记录在LOCATION表中具有相匹配的记录这模拟了买到一本新书但还没有在书柜中分配图书摆放位置的情形INTERSECT操作符仅返回那些在两个表中都匹配的记录因此BK_ID = 的记录将被排除在外
当运行EXCEPT查询时将分别从BOOKS表和LOCATION表中抽取匹配的记录并将不匹配的记录返回在本例中不匹配的记录就是新插入的UNMATCHED RECORD这条记录
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程