SQL标准集合运算符,UNION,INTERSECT和MINUS学习

Union
  1. UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)

    SELECT expression1, expression2, ... expression_n
    FROM tables
    [WHERE conditions]
    UNION [ALL | DISTINCT]
    SELECT expression1, expression2, ... expression_n
    FROM tables
    [WHERE conditions];
    
  2. 针对上表测试
    选择三个表所包含的所有国家(去重)

    SELECT country FROM customers
    UNION
    SELECT country FROM offices
    UNION
    SELECT country FROM employee
    ORDER BY country;
    

    结果
    在这里插入图片描述

  3. union all语句:从所给表中选取所有的选定的属性(也有重复的值)
    选择三个表所包含的所有国家(不去重)
    表同上

    SELECT country FROM customers
    UNION ALL
    SELECT country FROM offices
    UNION ALL
    SELECT country FROM employee
    ORDER BY country
    

    结果
    在这里插入图片描述

  4. 既然是select就可以使用where

    把顾客表的法国城市和办公室表的美国城市找出来

    例如

    SELECT city FROM customers
    WHERE country = 'France'
    UNION ALL
    SELECT city FROM offices
    WHERE country = 'USA'
    
    ORDER BY city
    

    结果
    在这里插入图片描述

Intersect
  • 交集:取两个集合中共有的部分
  • 因为mysql中没有提供专有的intersect方法,所以有以下两个方式来实现操作
  • 例题:要求选择顾客表和办公室表都有的城市。
  1. 使用多表连接来实现

    SELECT DISTINCT
        country
    FROM
        customers
    INNER JOIN offices USING (country);
    

    结果
    在这里插入图片描述

  2. 使用子查询来实现

    SELECT DISTINCT
        country
    FROM
        customers
    WHERE
        country IN (SELECT country FROM offices)
    

    结果
    在这里插入图片描述

差集minus
  • 差集:取两个集合中一个有而另一个没有的部分
  • mysql也没有提供差集的函数,同样和交集一样,有两种实现方式
  • 例题:选择顾客表有而办公室表没有的国家
  1. 使用多表连接实现,左外连接的话where右表相应字段为空,右外连接的话左表相应字段为空
    SELECT
        customers.country
    FROM
        customers
    LEFT JOIN offices USING (country)
    WHERE
        offices.country IS NULL;
    
    结果
    在这里插入图片描述
  2. 使用子查询
    SELECT
        country
    FROM
        customers
    WHERE
        country NOT IN (SELECT country FROM offices);
    
    结果同上
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值