MySQL中集合的差的运算方法

导读:本篇文章讲解 MySQL中集合的差的运算方法,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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.html

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列使用索引,而第一种查询则不能使用索引

  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/70280.html

(0)
小半的头像小半

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!