UNION

UNION

作者:LAMP小白  点击:1796  发布日期:2012-10-28 14:58:00  返回列表
如果想把多个查询的结果合并在一起创建一个结果集,可以使用UNION语句来做这件事

mysql> SELECT student_id FROM member UNION SELECT student_id FROM absence;
+------------+
| student_id |
+------------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------------+
5 rows in set (0.00 sec)

UNION语句有以下特性

数据列的名字和数据类型

UNION结果集里的数据列名字来自第一个SELECT语句里的数据列的名字,UNION中的第二个和在后面的SELECT语句必须钻去个数相同的数据列,
但有关数据列不必有同样的名字和数据类型,如果他们不一样MYSQL会对他们进行数据转换,数据列是根据位置而不是名字进行匹配,这也是会返回不同结果的原因,虽然他们从两个数据表中选取的是同样的值

mysql> SELECT student_id FROM member UNION SELECT date FROM absence;
+------------+
| student_id |
+------------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 2012-10-01 |
| 2012-10-02 |
| 2012-10-03 |
| 2012-10-04 |
+------------+
9 rows in set (0.01 sec)

重复数据行的处理

在默认情况下,UNION将从结果集里剔除重复的数据行

如果想保留重复的数据行,只需要使用UNION ALL

mysql> SELECT student_id FROM member UNION ALL SELECT student_id FROM absence;
+------------+
| student_id |
+------------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 1 |
| 1 |
| 1 |
| 1 |
| 2 |
| 2 |
| 2 |
| 3 |
| 4 |
| 4 |
+------------+
15 rows in set (0.00 sec)

ORDER BY 和 LIMIT 处理

如果你想将UNION结果作为一个整体进行排序,需要用括号把每一个SELECT语句括起来并在最后一个SELECT语句的后面加上一个ORDER BY子句

mysql> (SELECT student_id FROM member) UNION ALL (SELECT student_id FROM absence) ORDER BY student_id LIMIT 10;
+------------+
| student_id |
+------------+
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 2 |
| 2 |
| 2 |
| 2 |
| 3 |
+------------+
10 rows in set (0.01 sec)

LIMIT ORDER还可以用在()中的子句里


mysql> (SELECT student_id FROM member LIMIT 2) UNION ALL (SELECT student_id FROM absence ORDER BY student_id DESC);
+------------+
| student_id |
+------------+
| 1 |
| 2 |
| 1 |
| 1 |
| 1 |
| 1 |
| 2 |
| 2 |
| 2 |
| 3 |
| 4 |
| 4 |
+------------+
12 rows in set (0.00 sec)



上一篇:子查询改写为联结查询 下一篇:快递查询API
0