本教程为大家介绍 MySQL UNION 操作符的语法和实例。

描述

MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。

语法

MySQL UNION 操作符语法格式:

  1. SELECT expression1, expression2, ... expression_n
  2. FROM tables
  3. [WHERE conditions]
  4. UNION [ALL | DISTINCT]
  5. SELECT expression1, expression2, ... expression_n
  6. FROM tables
  7. [WHERE conditions];

参数

  • expression1, expression2, … expression_n: 要检索的列。
  • tables: 要检索的数据表。
  • WHERE conditions: 可选, 检索条件。
  • DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
  • ALL: 可选,返回所有结果集,包含重复数据。

    演示数据库

    在本教程中,我们将使用 NOWCODER 样本数据库。
    下面是选自 “Websites” 表的数据:
    1. mysql> select * from websites;
    2. +----+---------------+-------------------------------+-------+---------+
    3. | id | name | url | alexa | country |
    4. +----+---------------+-------------------------------+-------+---------+
    5. | 1 | Google | https://www.google.com | 1 | USA |
    6. | 2 | 淘宝 | https://www.taobao.com | 13 | CN |
    7. | 3 | 牛客网 | https://www.nowcoder.com | 6524 | CN |
    8. | 4 | 微博 | https://www.weibo.com | 20 | CN |
    9. | 5 | Facebook | https://www.facebook.com | 3 | USA |
    10. | 7 | Stackoverflow | https://www.stackoverflow.com | 0 | IND |
    11. +----+---------------+-------------------------------+-------+---------+
    12. 6 rows in set (0.00 sec)
    下面是 “apps” APP 的数据:
    1. mysql> select * from apps;
    2. +----+------------+-------------------+---------+
    3. | id | app_name | url | country |
    4. +----+------------+-------------------+---------+
    5. | 1 | QQ APP | http://im.qq.com | CN |
    6. | 2 | 微博 APP | http://weibo.com | CN |
    7. | 3 | 淘宝 APP | http://taobao.com | CN |
    8. +----+------------+-------------------+---------+
    9. 3 rows in set (0.00 sec)

    SQL UNION 实例

    下面的 SQL 语句从 “Websites” 和 “apps” 表中选取所有不同的country(只有不同的值):
    1. SELECT country FROM Websites
    2. UNION
    3. SELECT country FROM apps
    4. ORDER BY country;
    执行以上 SQL 输出结果如下:
    1. mysql> SELECT country FROM Websites
    2. -> UNION
    3. -> SELECT country FROM apps
    4. -> ORDER BY country;
    5. +---------+
    6. | country |
    7. +---------+
    8. | CN |
    9. | IND |
    10. | USA |
    11. +---------+
    12. 3 rows in set (0.00 sec)
    注释:UNION 不能用于列出两个表中所有的country。如果一些网站和APP来自同一个国家,每个国家只会列出一次。UNION 只会选取不同的值。请使用 UNION ALL 来选取重复的值!

    SQL UNION ALL 实例

    下面的 SQL 语句使用 UNION ALL 从 “Websites” 和 “apps” 表中选取所有的country(也有重复的值):
    1. SELECT country FROM Websites
    2. UNION ALL
    3. SELECT country FROM apps
    4. ORDER BY country;
    执行以上 SQL 输出结果如下:
    1. mysql> SELECT country FROM Websites
    2. -> UNION ALL
    3. -> SELECT country FROM apps
    4. -> ORDER BY country;
    5. +---------+
    6. | country |
    7. +---------+
    8. | CN |
    9. | CN |
    10. | CN |
    11. | CN |
    12. | CN |
    13. | CN |
    14. | IND |
    15. | USA |
    16. | USA |
    17. +---------+
    18. 9 rows in set (0.00 sec)

    带有 WHERE 的 SQL UNION ALL

    下面的 SQL 语句使用 UNION ALL 从 “Websites” 和 “apps” 表中选取所有的中国(CN)的数据(也有重复的值):
    1. SELECT country, name FROM Websites
    2. WHERE country='CN'
    3. UNION ALL
    4. SELECT country, app_name FROM apps
    5. WHERE country='CN'
    6. ORDER BY country;
    执行以上 SQL 输出结果如下:
    1. mysql> SELECT country, name FROM Websites
    2. -> WHERE country='CN'
    3. -> UNION ALL
    4. -> SELECT country, app_name FROM apps
    5. -> WHERE country='CN'
    6. -> ORDER BY country;
    7. +---------+------------+
    8. | country | name |
    9. +---------+------------+
    10. | CN | 淘宝 |
    11. | CN | 牛客网 |
    12. | CN | 微博 |
    13. | CN | QQ APP |
    14. | CN | 微博 APP |
    15. | CN | 淘宝 APP |
    16. +---------+------------+
    17. 6 rows in set (0.00 sec)
    原文:https://www.nowcoder.com/tutorial/10006/16f887d15a1f48a29a030c181d67e8fd