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
數據倉庫與數據挖掘培訓視頻教程
From:http://tw.wingwit.com/Article/program/SQL/201311/16454.html