在数据库操作中,有时我们希望将来自多个查询的数据合并在一起而非通过多表连接(JOIN)。这时就需要用到 UNION
或 UNION ALL
子句。它们是 SQLite 支持的集合操作(Set Operation)之一,功能强大且高效。
📌 本文由 www.52kanjuqing.com 整理,仅此一次引用。
📚 目录
- 什么是 UNION?
- UNION 与 UNION ALL 的区别
- 使用 UNION 的语法与规则
- 多个 SELECT 的字段兼容性
- ORDER BY 的使用位置和注意事项
- 使用 LIMIT 与 OFFSET 的联合查询
- UNION 与子查询/临时表的结合
- 实际示例:多表类型合并
- 出站参考链接与站内推荐
- 参考资料
1. 什么是 UNION?
UNION
是一种 集合操作,它将多个 SELECT
查询的结果合并为一个结果集,并默认去除重复记录。
📌 注意:
- 各个 SELECT 查询必须返回相同数量和类型的列。
- 合并后的结果默认是去重后的。
2. UNION 与 UNION ALL 的区别
子句 | 描述 |
---|---|
UNION | 合并多个结果集,自动去除重复记录 |
UNION ALL | 合并多个结果集,保留所有记录,包括重复项 |
SELECT name FROM students
UNION
SELECT name FROM teachers;
SELECT name FROM students
UNION ALL
SELECT name FROM teachers;
3. 使用 UNION 的语法与规则
基本语法结构如下:
SELECT column1, column2 FROM table1
UNION [ALL]
SELECT column1, column2 FROM table2;
要求:
- 所有 SELECT 的列数必须一致
- 对应位置的列类型应兼容
- 可以用 AS 设置别名统一列名
4. 多个 SELECT 的字段兼容性
允许不同表的列名不一致,但列数量和类型需一致。例如:
SELECT id AS identifier, name FROM customers
UNION
SELECT user_id, full_name FROM employees;
5. ORDER BY 的使用位置和注意事项
ORDER BY 只能用于整个 UNION 查询的最后部分:
SELECT name FROM students
UNION
SELECT name FROM teachers
ORDER BY name ASC;
📌 不允许在每个 SELECT 内部使用 ORDER BY。
6. 使用 LIMIT 与 OFFSET 的联合查询
LIMIT 和 OFFSET 必须出现在最后:
SELECT name FROM students
UNION
SELECT name FROM teachers
ORDER BY name
LIMIT 10 OFFSET 5;
7. UNION 与子查询/临时表的结合
可以嵌套 UNION 并组合子查询:
SELECT * FROM (
SELECT id, name FROM archived_users
UNION
SELECT id, name FROM active_users
) AS all_users
WHERE name LIKE 'J%';
8. 实际示例:多表类型合并
假设你有以下两张表:
CREATE TABLE blogs (
id INTEGER,
title TEXT,
created_at DATE
);
CREATE TABLE news (
id INTEGER,
title TEXT,
created_at DATE
);
合并最新内容:
SELECT id, title, created_at FROM blogs
UNION ALL
SELECT id, title, created_at FROM news
ORDER BY created_at DESC
LIMIT 20;
9. 🔗 出站参考链接与站内推荐
官方文档与教程:
站内推荐阅读(www.52kanjuqing.com):
10. 📚 参考资料
- SQLite Official Docs – Compound SELECT
https://www.sqlite.org/lang_select.html#compoundselect - Ben Forta. SQL in 10 Minutes, Sams Teach Yourself
- Stack Overflow – sqlite-union tag
- SQLite Tutorial – https://www.sqlitetutorial.net/sqlite-union/
✅ 下一篇将是 《SQLite NULL 值的处理与逻辑解析》。是否继续?我也可以将前几篇汇总打包为文档或页面。你需要我输出 Markdown、HTML、PDF 格式等版本吗?
发表回复