Union
-
集合的并集,后不带all表示相同值取一个即可,带all表示取全部值
示例:
customers:
offices:
employee:
到作者码云获取本次示例数据库
-
UNION
语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions] UNION [ALL | DISTINCT] SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditions];
-
针对上表测试
选择三个表所包含的所有国家(去重)SELECT country FROM customers UNION SELECT country FROM offices UNION SELECT country FROM employee ORDER BY country;
结果
-
union all
语句:从所给表中选取所有的选定的属性(也有重复的值)
选择三个表所包含的所有国家(不去重)
表同上SELECT country FROM customers UNION ALL SELECT country FROM offices UNION ALL SELECT country FROM employee ORDER BY country
结果
-
既然是select就可以使用where
把顾客表的法国城市和办公室表的美国城市找出来
例如
SELECT city FROM customers WHERE country = 'France' UNION ALL SELECT city FROM offices WHERE country = 'USA' ORDER BY city
结果
Intersect
- 交集:取两个集合中共有的部分
- 因为mysql中没有提供专有的intersect方法,所以有以下两个方式来实现操作
- 例题:要求选择顾客表和办公室表都有的城市。
-
使用多表连接来实现
SELECT DISTINCT country FROM customers INNER JOIN offices USING (country);
结果
-
使用子查询来实现
SELECT DISTINCT country FROM customers WHERE country IN (SELECT country FROM offices)
结果
差集minus
- 差集:取两个集合中一个有而另一个没有的部分
- mysql也没有提供差集的函数,同样和交集一样,有两种实现方式
- 例题:选择顾客表有而办公室表没有的国家
- 使用多表连接实现,左外连接的话where右表相应字段为空,右外连接的话左表相应字段为空
结果SELECT customers.country FROM customers LEFT JOIN offices USING (country) WHERE offices.country IS NULL;
- 使用子查询
结果同上SELECT country FROM customers WHERE country NOT IN (SELECT country FROM offices);