组合查询的使用场景

  • 在单个查询中从不同的表返回类似结构的数据
  • 对单个表执行多个查询,按单个查询返回数据

创建组合查询

可以通过UNION操作符来组合多条SQL查询
查询emp_no为10010以及薪水大于150000的员工

SELECT emp_no,salary FROM salaries WHERE salary > 150000 UNION SELECT emp_no, salary FROM salaries WHERE emp_no = 10010;

输出:

+--------+--------+
| emp_no | salary |
+--------+--------+
|  43624 | 151115 |
|  43624 | 153166 |
|  43624 | 153458 |
|  43624 | 157821 |
|  43624 | 158220 |
|  46439 | 150345 |
|  47978 | 151929 |
|  47978 | 155709 |
|  66793 | 150052 |
|  80823 | 151768 |
|  80823 | 154459 |
| 109334 | 151484 |
| 109334 | 154885 |
| 109334 | 155377 |
| 109334 | 154888 |
| 109334 | 155190 |
| 205000 | 151596 |
| 205000 | 153715 |
| 237542 | 150994 |
| 237542 | 152687 |
| 238117 | 152220 |
| 253939 | 150378 |
| 253939 | 154227 |
| 253939 | 155513 |
| 254466 | 150754 |
| 254466 | 152576 |
| 254466 | 156286 |
| 266526 | 151080 |
| 266526 | 152710 |
| 276633 | 150467 |
| 276633 | 152412 |
| 279776 | 150740 |
| 493158 | 150993 |
| 493158 | 151565 |
| 493158 | 152208 |
| 493158 | 154376 |
|  10010 |  72488 |
|  10010 |  74347 |
|  10010 |  75405 |
|  10010 |  78194 |
|  10010 |  79580 |
|  10010 |  80324 |
+--------+--------+
42 rows in set (0.64 sec)

分析
这样的查询可以理解为把两条语句做了并集,同时执行两条查询。相比于OR,UNION比较适用于复杂的过滤条件或者从多个表中检索数据。而OR只能在同一张表中做多种检索。

UNION规则

  • UNION必须由两条或两条以上SELECT语句组成,语句之间用UNION关键词分割。
  • UNION的每个查询必须包含相同的列、表达式或聚集函数。
  • 列数据类型必须兼容:类型不必完全相同,但必须是DBMS

包含或取消重复的行

UNION默认是会过去除重复行的,会把重复的行合并成一样。

SELECT emp_no,salary FROM salaries WHERE emp_no = 43624;
+--------+--------+
| emp_no | salary |
+--------+--------+
|  43624 | 116058 |
|  43624 | 119115 |
|  43624 | 123270 |
|  43624 | 125780 |
|  43624 | 125557 |
|  43624 | 127816 |
|  43624 | 132136 |
|  43624 | 135281 |
|  43624 | 138616 |
|  43624 | 138597 |
|  43624 | 141585 |
|  43624 | 145711 |
|  43624 | 149571 |
|  43624 | 151115 |
|  43624 | 153166 |
|  43624 | 153458 |
|  43624 | 157821 |
|  43624 | 158220 |
+--------+--------+
18 rows in set (0.00 sec)

有18条数据,再看另一条语句

SELECT emp_no,salary FROM salaries WHERE salary > 150000;
+--------+--------+
| emp_no | salary |
+--------+--------+
|  43624 | 151115 |
|  43624 | 153166 |
|  43624 | 153458 |
|  43624 | 157821 |
|  43624 | 158220 |
|  46439 | 150345 |
|  47978 | 151929 |
|  47978 | 155709 |
|  66793 | 150052 |
|  80823 | 151768 |
|  80823 | 154459 |
| 109334 | 151484 |
| 109334 | 154885 |
| 109334 | 155377 |
| 109334 | 154888 |
| 109334 | 155190 |
| 205000 | 151596 |
| 205000 | 153715 |
| 237542 | 150994 |
| 237542 | 152687 |
| 238117 | 152220 |
| 253939 | 150378 |
| 253939 | 154227 |
| 253939 | 155513 |
| 254466 | 150754 |
| 254466 | 152576 |
| 254466 | 156286 |
| 266526 | 151080 |
| 266526 | 152710 |
| 276633 | 150467 |
| 276633 | 152412 |
| 279776 | 150740 |
| 493158 | 150993 |
| 493158 | 151565 |
| 493158 | 152208 |
| 493158 | 154376 |
+--------+--------+
36 rows in set (0.64 sec)

有36条数据.
如果通过UNION来进行组合查询的话:

SELECT emp_no,salary FROM salaries WHERE salary > 150000 UNION SELECT emp_no, salary FROM salaries WHERE emp_no = 43624;
+--------+--------+
| emp_no | salary |
+--------+--------+
|  43624 | 151115 |
|  43624 | 153166 |
|  43624 | 153458 |
|  43624 | 157821 |
|  43624 | 158220 |
|  46439 | 150345 |
|  47978 | 151929 |
|  47978 | 155709 |
|  66793 | 150052 |
|  80823 | 151768 |
|  80823 | 154459 |
| 109334 | 151484 |
| 109334 | 154885 |
| 109334 | 155377 |
| 109334 | 154888 |
| 109334 | 155190 |
| 205000 | 151596 |
| 205000 | 153715 |
| 237542 | 150994 |
| 237542 | 152687 |
| 238117 | 152220 |
| 253939 | 150378 |
| 253939 | 154227 |
| 253939 | 155513 |
| 254466 | 150754 |
| 254466 | 152576 |
| 254466 | 156286 |
| 266526 | 151080 |
| 266526 | 152710 |
| 276633 | 150467 |
| 276633 | 152412 |
| 279776 | 150740 |
| 493158 | 150993 |
| 493158 | 151565 |
| 493158 | 152208 |
| 493158 | 154376 |
|  43624 | 116058 |
|  43624 | 119115 |
|  43624 | 123270 |
|  43624 | 125780 |
|  43624 | 125557 |
|  43624 | 127816 |
|  43624 | 132136 |
|  43624 | 135281 |
|  43624 | 138616 |
|  43624 | 138597 |
|  43624 | 141585 |
|  43624 | 145711 |
|  43624 | 149571 |
+--------+--------+
49 rows in set (0.62 sec)

这里总共49条 = 第一个语句的18条 + 第二个语句的36条 - 重复的5条。

对组合查询进行排序

对组合查询做排序只能使用一条ORDER BY子句且必须出现在最后一条SELECT语句之后。它会将前面的所有SELECT语句进行排序,无序多写。

小结

本章学习了UNION组合查询,可以将两条及以上的SELECT语句进行并处理。

  • 当然也有规则,最重要的就是每个查询必须包含相同的列、表达式或聚集函数。
  • OR不同的是它可以对不同数据表查询。