2017-11-19MySQL中的 union 查询

您现在的位置是: 首页 > MySQL技术 > MySQL中的 union 查询

351次阅读

一、什么是 union 查询 


union 查询就是把 2 条或多条 sql 的查询结果 , 合并成 1 个结果集

UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。

UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。

同时,每条 SELECT 语句中的列的顺序必须相同.

语法:

sql1  返回 N 行
sql2  返回 M 行

sql1 union sql2  返回 N+M 行


1. 用 union 查询栏目 3 和栏目 4 下面的商品


select goods_id,goods_name,cat_id,shop_price from goods where cat_id=3
union
select goods_id,goods_name,cat_id,shop_price from goods where cat_id=4;


2.  查询网站此时用户 , 合并可以是两张相同的表 , 也可以是不同的表


用户表user和临时用户表tmp, 查询网线现在用户和临时用户一共有多少人

select uid,name from user
union
select id,name from tmp;

# union 语句必须满足1个条件: 各语句取出的列数相同


如果不相同, 会报错, 列数不同 , 如下 sql

select uid,name,age from user
union
select id,name from tmp;

# 可以看出,列名称未必要一致 , 查询出的结果列名称会使用第一条 sql 的列名称为准


3.  union  查询 a 表和 b 表 , 看返回的是不是 N+M 行


select * from a
union
select * from b;

注意 :

使用 union 时 , 完全相等的行 , 将会被合并,合并是比较耗时的操作 , 两行会在比较看是否完全相等

一般不让 union 进行合并 , 使用 "union all" 可以避免

select * from a
union all
select * from b;

# 实际中 , 一般使用 union all 来合并查询


4.  union 的子句中 , 不用写 order by


(select * from a order by num desc)
union all
(select * from b order by num desc);

# 我们发现 , 写了 order by  并没有发挥作用,sql 合并后得到的总的结果 , 可以 order by, 子句的 order by  失去意义


比如 :
比如 , 华西村 , 南街村 ,2  个村各出 3  人 , 去当兵 ,
那么在村子里排序是没有什么意义的 , [x,f,d ],[z, k, c]
到部队里 , 还会对这些人再进行排序
所以 , 合并后仍是无序的 , 因此子句内排序没什么意义

union 合并后得到的总的结果集 , 是可以去排序的

(select * from a order by num desc)
union all
(select * from b order by num desc)
order by num desc;


 查询出来的结果当作一张表 , 再 select

select id,sum(num)
from
(select * from a
union all
select * from b) as tmp
group by id;


上一篇:MySQL中的JOIN连接

下一篇:MySQL中的视图