SQLite 的 DISTINCT 关键字 用于去除查询结果中的重复行,确保每行都是唯一的。常用于 SELECT 语句中。
基本语法
SELECT DISTINCT column1, column2, ...
FROM table_name
[WHERE ...]
[ORDER BY ...]
[LIMIT ...];
- 作用于整行:即使只选部分列,
DISTINCT也会基于所有列去重 - 可用于单列或多列
示例表结构
CREATE TABLE visits (
id INTEGER PRIMARY KEY,
user_id INTEGER,
page TEXT,
visit_date DATE
);
INSERT INTO visits (user_id, page, visit_date) VALUES
(101, 'home', '2025-11-01'),
(101, 'home', '2025-11-02'),
(102, 'product', '2025-11-01'),
(101, 'product', '2025-11-03'),
(103, 'home', '2025-11-01'),
(102, 'home', '2025-11-02');
1. 单列去重
-- 查找所有访问过的页面(不去重会重复)
SELECT page FROM visits;
-- 结果: home, home, product, product, home, home
-- 使用 DISTINCT 去重
SELECT DISTINCT page FROM visits;
结果:
page
--------
home
product
2. 多列去重(组合唯一)
-- 查找每个用户访问过的页面组合
SELECT DISTINCT user_id, page FROM visits
ORDER BY user_id, page;
结果:
user_id | page
--------|--------
101 | home
101 | product
102 | home
102 | product
103 | home
即使
101多次访问home,也只出现一次
3. 结合聚合函数
-- 每个页面被多少不同用户访问过?
SELECT
page,
COUNT(DISTINCT user_id) AS unique_users
FROM visits
GROUP BY page;
结果:
page | unique_users
---------|-------------
home | 3
product | 2
4. 与 ORDER BY 配合
-- 按访问页面字母序显示唯一页面
SELECT DISTINCT page FROM visits
ORDER BY page;
5. 常见使用场景
| 场景 | SQL |
|---|---|
| 获取唯一值列表 | SELECT DISTINCT country FROM users; |
| 统计独立用户数 | SELECT COUNT(DISTINCT user_id) FROM logs; |
| 去重后分页 | SELECT DISTINCT category FROM products ORDER BY category LIMIT 10; |
6. 注意事项
正确:作用于整行
SELECT DISTINCT user_id, page FROM visits;
-- 去重依据:(user_id, page) 组合
错误理解
-- 错误:DISTINCT 不能只作用于单列(除非只选一列)
SELECT user_id, DISTINCT page FROM visits; -- 语法错误!
7. 性能提示
DISTINCT隐式触发排序,可能较慢- 为去重字段建索引可加速:
CREATE INDEX idx_user_page ON visits(user_id, page);
- 大表建议用
GROUP BY替代(性能更优):
-- 等价于 SELECT DISTINCT user_id, page
SELECT user_id, page FROM visits
GROUP BY user_id, page;
8. 快速参考
| 需求 | SQL |
|---|---|
| 去重单列 | SELECT DISTINCT col |
| 去重多列 | SELECT DISTINCT col1, col2 |
| 统计唯一值数 | COUNT(DISTINCT col) |
| 去重 + 排序 | DISTINCT col ORDER BY col |
| 替代方案 | GROUP BY col |
最佳实践
- 明确去重范围:是单列还是组合?
- 大表用
GROUP BY替代DISTINCT - 为
DISTINCT字段建复合索引 - 结合
COUNT(DISTINCT)统计独立个数
需要我帮你写一个针对你表的 DISTINCT 查询吗?
请提供表名和想去重的字段!