SQLite Distinct 关键字

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

最佳实践

  1. 明确去重范围:是单列还是组合?
  2. 大表用 GROUP BY 替代 DISTINCT
  3. DISTINCT 字段建复合索引
  4. 结合 COUNT(DISTINCT) 统计独立个数

需要我帮你写一个针对你表的 DISTINCT 查询吗?
请提供表名和想去重的字段!

文章已创建 2305

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部