(十四)联合查询
将多次查询(多条 select
)的 结果,在记录上拼接增加的是记录数,记录字段不会增加 ;
基本语法
将多条 select
拼接在一起 查询,但是查询的字段数,必须一致,至于查询的字段类型,唔紧要;
查询出的结果,字段是第一条语句的,后面的语句,查出来的结果跟字段不一定是对上的,毕竟只关注字段数量,不关注字段类型 ;
# 语法
select 语句1
union [union选项]
select 语句2
...
mysql> select id ,name from student
-> union
-> select sex,name from student ;
+----+-------+
| id | name |
+----+-------+
| 1 | andy |
| 2 | sas |
| 3 | white |
| 2 | an |
| 1 | sas |
| 2 | white |
| 1 | an |
+----+-------+
7 rows in set
union
选项:与 select
选项一样
all
: 保留所有distinct
:去重(整个重复) 。默认去重 ;
意义
-
单表查询,但是目的不同
比如需求:查询学生表,要求按照男生升序,女生降序给出结果;
只能使用联合查询 ;
-
多表查询
要求多张表必须是 水平分表 分出来的,这样多表的结构完全一致,保存的数据的结构也完全一致 ;
一般用于,数据量太大了,不得不水平分表,然后需要查出所有数据,这时候需要联合查询 ;
联合查询的order by
联合查询使用 order by
必须满足两个条件:
-
select
语句 ,使用括号()
括起来 ; -
必须搭配
limit
搭配
limit
,只是硬性的语法要求,其实没有任何意义,这里就保证查出来的语句的数量就行了,比如999999
,反正一个很大的数字,就行了 ;mysql> (select * from student where sex = '1' order by name asc limit 9999) -> union -> (select * from student where sex = '2' order by name desc limit 9999); +----+-------+-----+ | id | name | sex | +----+-------+-----+ | 2 | an | 1 | | 1 | andy | 1 | | 5 | hany | 1 | | 2 | sas | 1 | | 6 | yang | 2 | | 7 | Wily | 2 | | 3 | white | 2 | | 11 | gery | 2 | +----+-------+-----+ 8 rows in set