MySql只支持Union(並集)集合運算,好像也是4.0之後纔有的; 可是對於交集Intersect、差集Except,就沒有實現了。 通常的解決方案用in和not in來解決,小量數據還能夠,但數據量大了效率就很低了。 其實,能夠使用Union來實現另外兩種的運算,固然是沒有辦法的辦法。 差集Except: SELECT ID FROM ( SELECT DISTINCT A.AID AS ID FROM TABLE_A A UNION ALL SELECT DISTINCT B.BID AS ID FROM TABLE_B B )TEMP GROUP BY ID HAVING COUNT(ID) = 1 交集Intersect: SELECT ID FROM ( SELECT DISTINCT A.AID AS ID FROM TABLE_A A UNION ALL SELECT DISTINCT B.BID AS ID FROM TABLE_B B )TEMP GROUP BY ID HAVING COUNT(ID) = 2 不過,上述方法的功能也有限, 只能用來檢查某個id是否是A、B表中都存在, 或者只存在於A、B表其中之一, 並不能對id在某表中屢次出現作出檢查。 並且,差集是有前後之分,這裏沒有。
2. http://hi.baidu.com/truetruelove/blog/item/f0fda8441bf22048510ffeba.htmlhtml
1。求兩表差集, ewb_t_books 是圖書表,ewb_t_title是圖書分類表,經過bt_titleid(not null)鏈接。 找出分類不存在的圖書 a.子查詢使用not in #explain extended SELECT book_id,bt_titleid FROM ewb_t_books b WHERE bt_titleid NOT IN (SELECT bt_titleid FROM ewb_t_title) #show warnings; b.子查詢 not exists #explain extended SELECT book_id,bt_titleid FROM ewb_t_books b WHERE NOT EXISTS (SELECT * FROM ewb_t_title a WHERE b.bt_titleid= a.bt_titleid ) #show warnings; c.左鏈接判斷右表is null #explain extended SELECT book_id,bt_titleid FROM ewb_t_books LEFT JOIN ewb_t_title b USING (bt_titleid) WHERE ISNULL(b.bt_titleid) #show warnings; 總結:簡單測試了一下,not in最慢,其餘兩個勢均力敵,有待考證。 select * from employee where salary<>3000; 對這個查詢,能夠改寫爲不使用NOT: select * from employee where salary<3000 or salary>3000; 雖然這兩種查詢的結果同樣,可是第二種查詢方案會比第一種查詢方案更快些。第二種查詢容許數據庫對salary列使用索引,而第一種查詢則不能使用索引