组合查询的使用场景
- 在单个查询中从不同的表返回类似结构的数据
- 对单个表执行多个查询,按单个查询返回数据
创建组合查询
可以通过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
不同的是它可以对不同数据表查询。