联合查询(union)——MySQL

本文详细讲解了SQL中的union和union all操作,包括查询语法、列数一致性、去重特性,并通过实例演示如何查询薪资低于5000的员工和年龄大于50岁的员工。

文章目录

union联合查询

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。

select 字段列表 from1 ...
unionallselect 字段列表 from2 ...
  • 对于联合查询的多张表的列数和字段类型都需要保持一致。
  • union all 会将全部的数据直接合并在一起
  • union 会对合并之后的数据去重
  • 例题: 将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来
select * from emp where salary < 5000
union all
select * from emp where age > 50;
// 不回去重
### 关于MySQL UNION 查询 #### 什么是UNION? `UNION` 是一种用于将两个或多个 `SELECT` 查询的结果集合并成一个结果集的操作符。它能够有效地将来自不同表的数据组合在一起,前提是这些数据具有相同的结构(即列数相同且对应列的数据类型兼容)。如果需要保留重复项,则可以使用 `UNION ALL`。 #### 基本语法 以下是 `UNION` 的基本语法: ```sql (SELECT column_list FROM table_name1 WHERE condition) UNION (SELECT column_list FROM table_name2 WHERE condition); ``` 对于去重版本的查询,可以直接使用上述形式;而为了包含所有的记录而不去除重复项,应改用 `UNION ALL`[^2]: ```sql (SELECT column_list FROM table_name1 WHERE condition) UNION ALL (SELECT column_list FROM table_name2 WHERE condition); ``` #### 实际案例演示 假设存在两张表格——一张存储群组消息(`group_messages`),另一张则保存私人对话(`private_messages`)。现在的需求是从这两类消息中提取出所有未读的消息,并按照时间顺序排列展示给用户。 ##### 表格定义 - **group_messages** - id INT PRIMARY KEY AUTO_INCREMENT, - content TEXT, - sender_id INT, - read_status BOOLEAN DEFAULT FALSE, -- 是否已读标志位 - send_time DATETIME - **private_messages** - id INT PRIMARY KEY AUTO_INCREMENT, - content TEXT, - receiver_id INT, - is_read BOOLEAN DEFAULT FALSE, -- 已读状态字段名可能略有差异 - timestamp DATETIME ##### SQL实现代码 利用 `UNION` 将两部分符合条件的信息汇总起来之后再做统一排序处理如下所示: ```sql ( SELECT 'Group' AS message_type, id, content, sender_id AS participant_id, send_time AS time_sent FROM group_messages WHERE read_status = FALSE ) UNION ( SELECT 'Private', id, content, receiver_id, timestamp FROM private_messages WHERE is_read = FALSE ) ORDER BY time_sent DESC; ``` 此脚本首先分别选取两类消息中的必要信息(如发送者/接收者的ID、具体内容以及发送的时间戳),接着借助 `UNION` 把它们拼接为单一列表,最终依据指定的时间字段降序安排输出次序[^3]。 #### 注意事项 当运用 `UNION` 进行多条目检索时需留意各子句所选属性的数量与类别应当一致匹配,否则会引发错误提示无法执行相应指令[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值