MySQL UNION 用于把来自多个 SELECT 语句的结果组合到一个结果集合中。语法为:
SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2
...
在多个 SELECT 语句中,对应的列应该具有相同的字段属性,且第一个 SELECT 语句中被使用的字段名称也被用于结果的字段名称。
当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION。
UNION 常用于数据类似的两张或多张表查询,如不同的数据分类表,或者是数据历史表等。下面是用于例子的两张原始数据表:
aid | title | content |
---|---|---|
1 | 文章1 | 文章1正文内容... |
2 | 文章2 | 文章2正文内容... |
3 | 文章3 | 文章3正文内容... |
bid | title | content |
---|---|---|
1 | 日志1 | 日志1正文内容... |
2 | 文章2 | 文章2正文内容... |
3 | 日志3 | 日志3正文内容... |
上面两个表数据中,aid=2 的数据记录与 bid=2 的数据记录是一样的。
查询两张表中的文章 id 号及标题,并去掉重复记录:
SELECT aid,title FROM article UNION SELECT bid,title FROM blog
返回查询结果如下:
aid | title |
---|---|
1 | 文章1 |
2 | 文章2 |
3 | 文章3 |
1 | 日志1 |
3 | 日志3 |
UNION 查询结果说明
查询两张表中的文章 id 号及标题,并返回所有记录:
SELECT aid,title FROM article UNION ALL SELECT bid,title FROM blog
返回查询结果如下:
aid | title |
---|---|
1 | 文章1 |
2 | 文章2 |
3 | 文章3 |
1 | 日志1 |
2 | 文章2 |
3 | 日志3 |
显然,使用 UNION ALL 的时候,只是单纯的把各个查询组合到一起而不会去判断数据是否重复。因此,当确定查询结果中不会有重复数据或者不需要去掉重复数据的时候,应当使用 UNION ALL 以提高查询效率。
转载:http://www.5idev.com/p-mysql_union.shtml
联合查询:
如果你想把多个查询的结果合并在一起创建一个结果集,我们可以使用UNION查询来做。
(1)列名
注意:查询的列名不一定要相同,结果集中的列名,是以第一个表的查询结果为准。
(2)关于重复记录
如果有重复的记录,则只显示一条。
我就希望把所有的显示出来,这个时候可以使用 UNION ALL
(3)关于排序
select i,c from t1 union select i,d from t3 order by i desc;
错误:
mysql> select i,c from t1 order by i desc union
select i,d from t3 order by i desc; ERROR 1221 (HY000): Incorrect usage of UNION and ORDER BY
加括号:
(select i,c from t1 order by i desc) union (select i,d from t3 order by i desc);
结果并未排序
需要再加limit
(select i,c from t1 order by i desc limit 3) union (select i,d from
t3 order by i desc limit 3)
这才ok了!
注意,
a. 在UNION 中,你要对结果集先排序,后union时候,需要将其用括号括起来
b. 要使用Limit,排序结果才可以起作用。