MYSQL中的union方法用法

本文详细介绍了MySQL中UNION和UNION ALL的区别及使用方法,并通过具体例子展示了如何运用这两个关键字处理表链接后的结果集,包括解决字段数量不一致的问题及提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MYSQL中的UNION

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。

举例说明:

select * from table1 union select * from table2

这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。  

MySQL中的UNION ALL
UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

举例说明:

select * from table1 union all select * from table2

注: 使用 UNION 时 前一个 select column的个数要等于后一个select column的个数
如: table1: (id,createDate,lastUpdateDate,desc,num,hashCode),
     table2: (id,createDate,lastUpdateDate,desc)

如果现在使用: select * from table1 UNION ALL select * from table2 则是不会成功的, 数据库为报: 
Error
The used SELECT statements have a different number of columns

这是提示查询的两张表的字段不统一,如果table1比table2的字段内容多,可以使用空字符串来代替


select id,createDate,lastUpdateDate,desc,num,hashCode from table1 UNION ALL select id,createDate,lastUpdateDate,desc,'','' from table2 

如果里面有不想要的,千万要记住前面查询内容要和后面查询内容的字段个数要一样,前面你查询4个,后面也要相应的放4个,这样就不会提示参数数量不同的错误了。mysql中UNION ALL用法 - 小桃子 - 小桃子

 

其实稍稍修改一下就可以了
对于 'select id,createDate,desc,hasCode from table1' 可以任意选择4个field

 

从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。

 

如果遇到两张表数据不同来集合查询,可以使用union all这个函数进行操作

SELECT COUNT(c.a)  FROM (
(SELECT UID a,ID,SERIAL,ParkName,CardNO,ScoreRealPay,PayFlag,PayType,Createtime FROM cp_consumption_record WHERE UID=761 AND PayFlag=1  ORDER BY Createtime DESC) UNION ALL (SELECT UID a,CpResID,CpParkID,ParkSERIAL,CarCode,Price,BusinessType,CardNO,CreateDate FROM cp_reservation WHERE UID=761 AND BusinessType IN(1,2,3) ORDER BY CreateDate DESC)
) c

这是查询结果集共有多少条数据,

如果还有查询条件,直接在c后面添加就可以,比如按照时间进行查询

SELECT c.UID,c.ScoreRealPay,c.PayFlag,c.PayType  FROM (
(SELECT UID AS UID,ID AS ID,SERIAL AS SERIAL ,ParkName AS ParkName,CardNO CardNO,ScoreRealPay ScoreRealPay,PayFlag PayFlag,PayType PayType,Createtime Createtime FROM cp_consumption_record WHERE UID=761 AND PayFlag=1  ORDER BY Createtime DESC) UNION ALL (SELECT UID a,CpResID,CpParkID,ParkSERIAL,CarCode,Price,BusinessType,CardNO,CreateDate FROM cp_reservation WHERE UID=761 AND BusinessType IN(1,2,3) ORDER BY CreateDate DESC)
) c ORDER BY Createtime DESC/ASC

这里强调一下,你要按照什么样的条件进行查询时,要分别在select子查询中添加上条件,最后在按照统一的时间倒序或者正序

注: 
缺省的情况下,UNION 子句不返回重复的记录.如果想显示所有记录,可以加ALL选项 
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同. 

### MySQL 中 `UNION ALL` 的使用方法、示例与语法 #### 什么是 `UNION ALL` `UNION ALL` 是 SQL 查询语句中的一个集合操作符,用于将多个查询的结果集合并在一起。它不会去除重复的行,因此相比于 `UNION` 更加高效[^2]。 #### 基本语法 以下是 `UNION ALL` 的基本语法结构: ```sql SELECT column_list FROM table_name_1 UNION ALL SELECT column_list FROM table_name_2; ``` - **注意**: 所有参与联合的查询必须具有相同数量的列,并且对应列的数据类型应兼容[^3]。 #### 示例说明 假设存在两张 `employees` 和 `contractors`,它们都包含相同的字段 `id`, `name`, 和 `salary`。下面是一个简单的例子展示如何使用 `UNION ALL` 将两者的记录全部取出: ```sql SELECT id, name, salary FROM employees UNION ALL SELECT id, name, salary FROM contractors; ``` 此查询会返回来自 `employees` 和 `contractors` 的所有记录,包括可能存在的重复项[^4]。 #### 处理别名的情况 当在子查询中定义了字段别名时,在最终结果集中可以利用这些别名来排序或其他操作。例如: ```sql (SELECT id AS employee_id, name, salary FROM employees) UNION ALL (SELECT id AS contractor_id, name, salary FROM contractors) ORDER BY employee_id; -- 或者 contractor_id ``` 这里需要注意的是,尽管两个子查询分别指定了不同的别名 (`employee_id` 和 `contractor_id`) ,但在整个上下文中只允许引用其中一个作为统一名称进行后续处理。 #### 结合 LIMIT 使用 如果希望限制某个单独部分或者整体结果的数量,可以通过嵌套的方式应用 `LIMIT` 关键字。比如仅获取前五位员工加上所有承包商的信息如下所示: ```sql ( SELECT id, name, salary FROM employees LIMIT 5 ) UNION ALL ( SELECT id, name, salary FROM contractors ); ``` 上述代码片段展示了如何通过括号分组并设置独立条件的方法实现更灵活控制输出规模的需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值