(十四)联合查询


将多次查询(多条 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 必须满足两个条件:

  1. select 语句 ,使用括号()括起来 ;

  2. 必须搭配 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
    
    
原文地址:https://www.cnblogs.com/young-youth/p/11665635.html