SQLite Distinct 关键字(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在数据库开发中,数据重复问题常常困扰着开发者。无论是统计用户活跃区域、分析商品销量,还是生成报表,如何高效地提取唯一值是关键。SQLite 的 DISTINCT 关键字正是解决这一问题的核心工具。本文将从基础语法、实际应用场景、性能优化到常见误区,系统性地解析 SQLite Distinct 关键字 的使用技巧,帮助开发者快速掌握这一功能。


一、DISTINCT 的基础语法与核心作用

1.1 什么是 DISTINCT?

DISTINCT 是 SQL 中用于去除查询结果中重复行的关键字。它的工作原理类似于“去重筛选器”,通过比较同一列或一组列的值,仅保留唯一的记录。例如,在学生表中查询所有省份信息时,DISTINCT 可以避免重复显示相同的省份名称。

简单比喻
想象图书馆管理员整理书籍,若发现多本《算法导论》重复上架,DISTINCT 就像一本记录本,只保留书名的唯一记录,其他重复项会被自动过滤。

1.2 基本语法结构

SELECT DISTINCT column1, column2, ...  
FROM table_name  
WHERE condition;  
  • 单列去重SELECT DISTINCT province FROM students;
  • 多列去重SELECT DISTINCT city, age FROM users WHERE age > 18;

关键点

  • DISTINCT 必须紧跟在 SELECT 关键字之后,且仅对指定的列生效。
  • 若未指定列,默认对所有列进行去重(等同于 SELECT DISTINCT *)。

二、DISTINCT 的典型应用场景

2.1 场景 1:统计唯一值的数量

假设有一个“订单表”,需要统计不同商品的种类数量。

-- 原始数据可能包含重复的商品名  
SELECT product_name FROM orders;  

-- 使用 DISTINCT 去重后统计  
SELECT COUNT(DISTINCT product_name) AS unique_products  
FROM orders;  

此时,COUNT(DISTINCT column) 的组合能直接返回唯一值的总数,无需先提取去重列表再手动计数。

2.2 场景 2:联合多个条件的去重

在用户表中,若需查找同时满足“年龄 25 岁且来自北京”的唯一用户,可以结合 WHERE 子句:

SELECT DISTINCT user_id, email  
FROM users  
WHERE age = 25 AND city = 'Beijing';  

此语句会返回所有符合条件的用户,但若 user_idemail 组合重复,则只保留一条记录。


三、DISTINCT 与聚合函数的协同使用

3.1 结合 COUNT() 统计唯一值

除了直接去重,DISTINCT 可与聚合函数结合,实现更复杂的统计需求。例如,统计每个省份的用户数量:

SELECT province, COUNT(*) AS total_users  
FROM users  
GROUP BY province;  

若需排除重复的省份名称(如数据录入错误导致的“上海”和“shanghai”),可先用 DISTINCT 清洗数据:

SELECT province, COUNT(*)  
FROM (SELECT DISTINCT province FROM users) AS cleaned_data  
GROUP BY province;  

3.2 与 AVG()、SUM() 等的配合

在计算平均值或总和时,DISTINCT 可确保基于唯一值进行运算。例如,计算不同商品的平均价格(排除重复条目):

SELECT AVG(DISTINCT price) AS avg_unique_price  
FROM products;  

四、DISTINCT 的性能优化与注意事项

4.1 性能开销与索引优化

使用 DISTINCT 时,SQLite 会执行全表扫描并进行排序操作,这可能导致性能下降,尤其是处理百万级数据时。为提升效率,可采取以下策略:

  1. 添加索引:对频繁查询的列建立索引(如 CREATE INDEX idx_province ON users(province);)。
  2. 减少列数量:仅对必要列使用 DISTINCT,避免对多列组合进行去重。

4.2 注意字段顺序的影响

虽然 DISTINCT 的结果不依赖列的排列顺序,但逻辑上应确保列的组合能唯一标识记录。例如,SELECT DISTINCT city, user_idSELECT DISTINCT user_id, city 的结果集完全相同,但需根据业务需求选择更合理的字段组合。

4.3 常见误区与解决方案

  • 误区 1:误以为 DISTINCT 会自动排序结果。
    • 解决:需显式添加 ORDER BY 子句。
  • 误区 2:在聚合函数外错误使用 DISTINCT
    • 错误示例SELECT SUM(DISTINCT) column FROM table;(语法错误)。
    • 正确写法SELECT SUM(DISTINCT column) FROM table;

五、DISTINCT 在复杂查询中的进阶用法

5.1 联合多个表的去重

在多表连接查询时,DISTINCT 可避免因关联字段重复导致的冗余记录。例如:

SELECT DISTINCT customers.name, orders.product  
FROM customers  
JOIN orders ON customers.id = orders.customer_id;  

5.2 结合子查询优化性能

对于大数据量场景,可通过子查询先筛选再去重:

SELECT DISTINCT product_id, price  
FROM (  
  SELECT * FROM products WHERE category = 'electronics'  
) AS filtered_products;  

六、实战案例:电商数据分析

6.1 案例背景

某电商平台的“订单表”包含以下字段:
| order_id | user_id | product_name | price | purchase_date |
|----------|---------|--------------|-------|---------------|
| 1 | 101 | iPhone 15 | 999 | 2023-09-01 |
| 2 | 102 | AirPods | 199 | 2023-09-01 |
| 3 | 101 | iPhone 15 | 999 | 2023-09-02 |
| 4 | 103 | MacBook Pro | 1999 | 2023-09-02 |

6.2 需求与实现

需求 1:统计用户购买过的所有不同商品。

SELECT DISTINCT product_name  
FROM orders;  
-- 结果:iPhone 15, AirPods, MacBook Pro  

需求 2:找出重复购买同一商品的用户。

SELECT user_id, product_name  
FROM orders  
GROUP BY user_id, product_name  
HAVING COUNT(*) > 1;  
-- 结果:用户 101 购买了两次 iPhone 15  

需求 3:计算每个商品的唯一购买者数量。

SELECT product_name, COUNT(DISTINCT user_id) AS buyers_count  
FROM orders  
GROUP BY product_name;  
-- 结果:  
-- iPhone 15 → 1  
-- AirPods → 1  
-- MacBook Pro → 1  

七、总结与扩展学习

7.1 核心知识点回顾

  • DISTINCT 是 SQLite 中去除重复记录的核心工具,适用于单列或多列组合去重。
  • 结合聚合函数(如 COUNTAVG)可实现更复杂的统计需求。
  • 需注意性能优化,合理使用索引和子查询。

7.2 进阶学习方向

  • 窗口函数:如 ROW_NUMBER() 可替代部分 DISTINCT 场景,提供更多灵活性。
  • 数据清洗技巧:结合 GROUP_CONCATJSON_GROUP_ARRAY 处理多值字段。
  • 数据库索引原理:深入理解索引对查询性能的影响。

通过本文的讲解,开发者可以系统性地掌握 SQLite Distinct 关键字 的使用方法,并在实际项目中灵活应对数据去重与统计需求。建议读者通过官方文档(如 SQLite 官网的 SELECT 语句指南)进一步巩固知识,同时结合具体业务场景进行实践。

最新发布