一、并集
Union因为要进行重复值扫描,所以效率低。如果合并没有刻意要删除重复行,那么就使用Union All 两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致);
如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来。
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。- Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
- Union All:对两个结果集进行并集操作,包括重复行,不进行排序;性能高;
- Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;(MySQL不支持)
- Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。性能高;(MySQL不支持)
-
Full Outer Join:全连接,数据库join的用法很简单,今天发现mysql居然不支持全连接。解决方法:left join union right join
二、差集
MySQL没有交集Intersect、差集Except的实现,一般差集可以通过in和not in来解决。小量数据还可以,但数据量大了效率就很低了。
示例说明:
创建表:
CREATE TABLE `tt1` ( `id` INT(11) NOT NULL, `name` VARCHAR(20) DEFAULT NULL, `age` INT(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;CREATE TABLE `tt2` ( `id` INT(11) NOT NULL, `name` VARCHAR(20) DEFAULT NULL, `age` INT(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO tt1 VALUES(1,'小王',10); INSERT INTO tt1 VALUES(2,'小宋',20); INSERT INTO tt1 VALUES(3,'小白',30); INSERT INTO tt1 VALUES(4,'hello',40); INSERT INTO tt2 VALUES(1,'小王',10); INSERT INTO tt2 VALUES(2,'小宋',22); INSERT INTO tt2 VALUES(3,'小肖',31); INSERT INTO tt2 VALUES(4,'hello',40);
差集:
SELECT tt1.* FROM tt1 WHERE NAME NOT IN (SELECT NAME FROM tt2); 或者SELECT tt1.id, tt1.name, tt1.age FROM tt1 LEFT JOIN tt2 ON tt1.id = tt2.id WHERE tt1.name != tt2.name;
三、交集
MySQL没有交集Intersect、差集Except的实现,一般交集可以通过HAVING来解决。
示例:
SELECT id, NAME, age, COUNT(*) FROM (SELECT id, NAME, age FROM tt1 UNION ALL SELECT id, NAME, age FROM tt2 ) a GROUP BY id, NAME, age HAVING COUNT(*) > 1
四、full outer join全连接两个表
如图: