元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
SQLite基础概念
什么是SQLite
应用场景分析
与其他数据库对比
▶
环境安装配置
Windows安装指南
MacOS安装指南
Linux安装指南
命令行工具使用
▶
数据库操作基础
创建第一个数据库
连接与断开连接
数据库文件管理
删除数据库
▶
数据表操作
数据类型详解
创建数据表
修改表结构
删除数据表
约束与索引
▶
数据操作CRUD
插入数据INSERT
查询数据SELECT
更新数据UPDATE
删除数据DELETE
条件查询WHERE
联合查询JOIN
子查询SUBQUERY
复合条件查询
分组聚合查询
集合查询
排序与分页
▶
数据库管理基础
事务处理
备份与恢复
性能优化基础
发布时间:
2025-04-02 23:07
↑
☰
# 集合查询 本文将详细介绍SQLite中的集合查询操作,包括UNION、INTERSECT和EXCEPT等集合运算符的使用方法和最佳实践。 ## 集合运算符概述 ### 基本集合运算符 1. **UNION**: 合并两个结果集并去除重复行 2. **UNION ALL**: 合并两个结果集保留重复行 3. **INTERSECT**: 获取两个结果集的交集 4. **EXCEPT**: 获取第一个结果集中排除第二个结果集的部分 ## UNION操作 ### UNION基本用法 ```sql SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2; ``` ### UNION ALL示例 ```sql -- 获取所有活跃用户和新注册用户 SELECT user_id, username, 'active' as user_type FROM active_users UNION ALL SELECT user_id, username, 'new' as user_type FROM new_registrations; ``` ### 注意事项 1. 列数必须相同 2. 对应列的数据类型必须兼容 3. 列名以第一个SELECT语句为准 ## INTERSECT操作 ### 基本语法 ```sql SELECT column1, column2 FROM table1 INTERSECT SELECT column1, column2 FROM table2; ``` ### 实际应用 ```sql -- 查找同时是VIP会员且有优惠券的用户 SELECT user_id FROM vip_members INTERSECT SELECT user_id FROM coupon_holders; ``` ## EXCEPT操作 ### 基本语法 ```sql SELECT column1, column2 FROM table1 EXCEPT SELECT column1, column2 FROM table2; ``` ### 使用场景 ```sql -- 查找有订单但未评价的用户 SELECT user_id FROM orders EXCEPT SELECT user_id FROM reviews; ``` ## 复杂集合查询 ### 多表集合 ```sql -- 获取所有类型的用户活动 SELECT user_id, 'purchase' as activity FROM orders UNION ALL SELECT user_id, 'review' as activity FROM reviews UNION ALL SELECT user_id, 'login' as activity FROM login_logs; ``` ### 条件过滤 ```sql -- 查找最近一个月活跃但未购买的用户 SELECT user_id FROM login_logs WHERE login_time >= date('now', '-30 days') EXCEPT SELECT user_id FROM orders WHERE order_date >= date('now', '-30 days'); ``` ## 性能优化 ### 索引使用 1. **创建合适的索引** ```sql CREATE INDEX idx_user_id ON orders(user_id); CREATE INDEX idx_user_id ON reviews(user_id); ``` 2. **避免全表扫描** ```sql -- 使用WHERE子句限制数据范围 SELECT id FROM table1 WHERE date >= date('now', '-7 days') UNION SELECT id FROM table2 WHERE date >= date('now', '-7 days'); ``` ### 优化策略 1. **使用UNION ALL替代UNION** - 当确定没有重复数据时 - 当允许重复数据时 2. **合理使用WHERE子句** - 在UNION之前过滤数据 - 减少需要处理的数据量 ## 最佳实践 ### 代码规范 1. **清晰的格式化** ```sql SELECT column1, column2 FROM table1 WHERE condition1 UNION SELECT column1, column2 FROM table2 WHERE condition2; ``` 2. **使用注释** ```sql -- 获取所有活跃用户 SELECT user_id FROM daily_active_users UNION -- 获取所有新注册用户 SELECT user_id FROM new_users; ``` ### 调试技巧 1. **使用子查询验证** ```sql SELECT * FROM ( SELECT user_id FROM table1 UNION SELECT user_id FROM table2 ) AS combined_result WHERE user_id = 'test_user'; ``` 2. **结果集验证** ```sql -- 检查结果集大小 SELECT COUNT(*) FROM ( SELECT column1 FROM table1 UNION SELECT column1 FROM table2 ); ``` ## 总结 集合查询操作要点: - 选择合适的集合运算符 - 确保列数和数据类型匹配 - 注意性能优化 - 保持代码可读性 建议: - 优先使用UNION ALL - 合理使用索引 - 注意代码格式化 - 添加必要的注释