作者:LAMP小白 点击:1925 发布日期: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