交集、并集和补集(阿里大数据系列)

本文为您介绍UNION、UNOIN ALL、UNION DISTINCT并集,INTERSECT、INTERSECT ALL、INTERSECT DISTINCT交集,EXCEPT、EXCEPT ALL、EXCEPT DISTINCT补集等SQL语法。

语法格式

select_statement UNION ALL select_statement;
select_statement UNION [DISTINCT] select_statement;
select_statement INTERSECT ALL select_statement;
select_statement INTERSECT [DISTINCT] select_statement;
select_statement EXCEPT ALL select_statement;
select_statement EXCEPT [DISTINCT] select_statement;
select_statement MINUS ALL select_statement;
select_statement MINUS [DISTINCT] select_statement;

语法说明

  • UNION功能说明:求两个数据集的并集,即将两个数据集合并成一个数据集。
    • 当UNION后指定参数ALL时,返回两个数据集的所有记录。示例如下。
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b) 
      UNION ALL 
      SELECT * FROM VALUES (1, 2), (1, 4) t(a, b);
      返回结果如下。
      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 1          | 4          |
      | 1          | 2          |
      | 1          | 2          |
      | 3          | 4          |
      +------------+------------+
    • 存在多个UNION ALL时,支持通过括号指定UNION ALL的优先级。
      SELECT * FROM src UNION ALL (SELECT * FROM src2 UNION ALL SELECT * FROM src3);
    • 当UNION后不指定参数时,返回记录中会去掉重复的记录,效果等同于UNION DISTINCT。示例如下。
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b) 
      UNION 
      SELECT * FROM VALUES (1, 2), (1, 4) t(a, b);
      --等同于如下语句。
      SELECT DISTINCT * FROM (<UNION ALL的结果>)t;
      结果如下。
      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 1          | 4          |
      | 3          | 4          |
      +------------+------------+
    • UNION后如果有CLUSTER BYDISTRIBUTE BYSORT BYORDER BY或者LIMIT子句,当设置set odps.sql.type.system.odps2=false;时,其作用于UNION的最后一个select_statement;当设置set odps.sql.type.system.odps2=true;时,作用于前面所有UNION的结果。示例如下。
      set odps.sql.type.system.odps2=true;
      SELECT explode(array(3, 1)) AS (a) UNION ALL SELECT explode(array(0, 4, 2)) AS (a) ORDER BY a LIMIT 3;
      返回结果如下。
      +------+
      | a    |
      +------+
      | 0    |
      | 1    |
      | 2    |
      +------+
  • INTERSECT

    功能说明:求两个数据集的交集,即输出两个数据集均包含的记录。

    示例
    • INTERSECT ALL示例
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 6) t(a, b) 
      INTERSECT ALL 
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 7) t(a, b);
      返回结果如下。
      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 1          | 2          |
      | 3          | 4          |
      +------------+------------+
    • INTERSECT DISTINCT示例
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 6) t(a, b) 
      INTERSECT 
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 7) t(a, b);
      结果如下,等同于SELECT DISTINCT * FROM (< INTERSECT ALL的结果 >) t;语句。
      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 3          | 4          |
      +------------+------------+
  • EXCEPT

    功能说明:求第二个数据集在第一个数据集中的补集,即输出第一个数据集包含而第二个数据集不包含的记录。

    示例
    • EXCEPT ALL示例。
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b) 
      EXCEPT ALL 
      SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
      返回结果如下。
      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 1          | 2          |
      | 3          | 4          |
      | 7          | 8          |
      +------------+------------+
    • EXCEPT DISTINCT示例。
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b) 
      EXCEPT
      SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
      结果如下,相当于SELECT DISTINCT * FROM left_branch EXCEPT ALL SELECT DISTINCT * FROM right_branch;
      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 7          | 8          |
      +------------+------------+
  • MINUS

    功能说明:等同于EXCEPT

注意事项

  • 集合操作的结果不一定会按序排列。
  • 集合操作左右两个分支要求列个数必须一致。如果数据类型不一致,可能会进行隐式类型转换。由于兼容性原因,STRING类型和非STRING类型在集合操作中的隐式转换已被禁用。
  • MaxCompute最多允许256个分支的集合操作,超出256个将报错。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用集合(set)来进行交集并集、差集和补集的操作。 1. 交集:两个集合中共同存在的元素构成的新集合。可以使用`&`算符或者`intersection()`方法来实现。 示例代码: ``` set1 = {1, 2, 3} set2 = {2, 3, 4} intersection_set = set1 & set2 # 或者使用 intersection() 方法 # intersection_set = set1.intersection(set2) print(intersection_set) # 输出: {2, 3} ``` 2. 并集:两个集合中所有的元素构成的新集合。可以使用`|`运算符或者`union()`方法来实现。 示例代码: ```python set1 = {1, 2, 3} set2 = {2, 3, 4} union_set = set1 | set2 # 或者使用 union() 方法 # union_set = set1.union(set2) print(union_set) # 输出: {1, 2, 3, 4} ``` 3. 差集:第一个集合中存在,而第二个集合中不存在的元素构成的新集合。可以使用`-`运算符或者`difference()`方法来实现。 示例代码: ```python set1 = {1, 2, 3} set2 = {2, 3, 4} difference_set = set1 - set2 # 或者使用 difference() 方法 # difference_set = set1.difference(set2) print(difference_set) # 输出: {1} ``` 4. 补集:在全集中存在,但是不在指定集合中的元素构成的新集合。可以使用`^`运算符或者`symmetric_difference()`方法来实现。 示例代码: ```python set1 = {1, 2, 3} set2 = {2, 3, 4} complement_set = set1 ^ set2 # 或者使用 symmetric_difference() 方法 # complement_set = set1.symmetric_difference(set2) print(complement_set) # 输出: {1, 4} ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值