Mysql union 联合查询

339 阅读2分钟
  • 联合查询含义:指将2个或2个以上的字段数量相同的查询结果,“纵向堆叠”后合并为一个结果。

    1、所有单个查询结果应该具有相等的列数。
    2、所有单个查询的列类型应该具有一致性(即每个查询的第n列的数据类型一致)。
    3、单个查询的列名可以不同,但最终的列名是第一个查询的列名(可以使用别名)。
    4union 可以带 alldistinct 参数,如果省略默认就是 distinct, 即默认已经消除重复行了。
    5、最后的 order by 或 limit 是对整个联合之后的结果数据进行排序或数量限定。
    6order by 子句中的排序字段应该使用第-个查询中的字段名,如果有别名就必须使用别名。
    
  • 语法形式: 通过 union 进行联合

select * from test
union (alldistinct(默认))
select * from user
union (alldistinct(默认))
select ......
order by 字段 (asc || desc)
limit 页码,每页条数;
  • 测试数据:
mysql> select * from test;
+----+--------+------+------+
| id | name   | sex  | age  |
+----+--------+------+------+
|  1 | name1  ||   15 |
|  2 | name1  ||   15 |
|  3 | name53 ||   10 |
+----+--------+------+------+

mysql> select * from user;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | name1  |   15 |
|  2 | name1  |   15 |
|  3 | name53 |   10 |
+----+--------+------+
* 这里报错,是因为查询的是两个表的全部数据,两个表的列数量不相等
mysql> select * from test union select * from user;
ERROR 1222 (21000): The used SELECT statements have a different number of columns

* 查询对等数量字段
mysql> select id, name, age from test union select id, name, age from user;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | name1  |   15 |
|  2 | name1  |   15 |
|  3 | name53 |   10 |
+----+--------+------+

* 测试 union all
mysql> select * from user union all select * from user;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | name1  |   15 |
|  2 | name1  |   15 |
|  3 | name53 |   10 |
|  1 | name1  |   15 |
|  2 | name1  |   15 |
|  3 | name53 |   10 |
+----+--------+------+

* 测试 union distinct,默认就是它所以可以不用写
mysql> select * from user union select * from user;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | name1  |   15 |
|  2 | name1  |   15 |
|  3 | name53 |   10 |
+----+--------+------+