SQL SELECT DISTINCT 语句详解:精准去重的艺术
SQL SELECT DISTINCT 语句详解:精准去重的艺术
一、为什么需要数据去重?
在日常数据库操作中,我们经常会遇到这样的场景:查询客户表时发现重复的邮箱地址,统计销售数据时出现冗余的订单记录,分析用户行为时碰到相同的访问日志。这些重复数据不仅影响数据分析的准确性,还会导致以下问题:
- 统计结果失真(如重复计算用户数量)
- 报表生成效率降低
- 存储空间浪费
- 业务逻辑判断错误
此时,SELECT DISTINCT
就像一把精准的筛子,能够帮助我们过滤掉冗余数据,保留唯一值。下面通过一个具体案例感受其威力:
-- 原始数据包含重复记录
SELECT product_category FROM sales;/*
+-----------------+
| product_category|
+-----------------+
| Electronics |
| Clothing |
| Electronics |
| Home & Kitchen |
| Clothing |
+-----------------+
*/-- 使用DISTINCT去重后
SELECT DISTINCT product_category FROM sales;/*
+-----------------+
| product_category|
+-----------------+
| Electronics |
| Clothing |
| Home & Kitchen |
+-----------------+
*/
二、语法深度解析
基础语法结构
SELECT DISTINCTcolumn1, column2,...
FROM table_name
[WHERE condition]
[ORDER BY column_name(s)]
[LIMIT number];
多列去重机制
当指定多个列时,DISTINCT会组合这些列的值进行去重:
-- 创建示例表
CREATE TABLE employees (id INT PRIMARY KEY,dept VARCHAR(50),position VARCHAR(50)
);INSERT INTO employees VALUES
(1, 'HR', 'Manager'),
(2, 'IT', 'Developer'),
(3, 'HR', 'Manager'),
(4, 'Finance', 'Analyst');-- 多列去重查询
SELECT DISTINCT dept, position
FROM employees;/*
+---------+-----------+
| dept | position |
+---------+-----------+
| HR | Manager |
| IT | Developer |
| Finance | Analyst |
+---------+-----------+
*/
NULL处理策略
不同数据库对NULL值的处理存在差异:
数据库 | NULL处理方式 |
---|---|
MySQL | 多个NULL视为相同值 |
PostgreSQL | 多个NULL视为相同值 |
Oracle | 多个NULL视为相同值 |
SQL Server | 多个NULL视为相同值 |
示例:
-- 插入包含NULL值的测试数据
INSERT INTO employees VALUES
(5, NULL, 'Intern'),
(6, NULL, 'Intern');SELECT DISTINCT dept, position
FROM employees
WHERE position = 'Intern';/*
+------+----------+
| dept | position |
+------+----------+
| NULL | Intern |
+------+----------+
*/
三、进阶应用技巧
1. 与聚合函数结合
-- 统计不重复的部门数量
SELECT COUNT(DISTINCT dept) AS unique_departments
FROM employees;/*
+---------------------+
| unique_departments |
+---------------------+
| 3 |
+---------------------+
*/
2. 窗口函数中的去重
-- 配合ROW_NUMBER()实现高级去重
WITH ranked_employees AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY dept, position ORDER BY id DESC) AS rnFROM employees
)
SELECT id, dept, position
FROM ranked_employees
WHERE rn = 1;
3. 性能优化方案
当处理海量数据时,可以尝试以下优化策略:
- 建立覆盖索引:
CREATE INDEX idx_dept_position
ON employees(dept, position);
- 临时表分阶段处理:
CREATE TEMPORARY TABLE temp_unique
AS SELECT DISTINCT dept, position
FROM employees;-- 后续操作使用临时表
四、常见误区解析
误区1:DISTINCT能提升查询性能
实际上,DISTINCT操作需要经过以下处理步骤:
- 全表扫描或索引扫描
- 创建临时哈希表
- 比较和过滤重复值
- 结果排序(隐式或显式)
当数据量达到百万级时,一个不加限制的DISTINCT查询可能导致严重的性能问题。
误区2:DISTINCT与GROUP BY等价
虽然两者都能实现去重,但存在本质区别:
特性 | DISTINCT | GROUP BY |
---|---|---|
主要用途 | 去重 | 分组聚合 |
排序保证 | 不保证 | 通常分组后有序 |
聚合函数使用 | 不能直接使用 | 必须配合使用 |
执行计划 | 可能使用排序 | 常使用哈希聚合 |
性能对比实验(TPC-H数据集):
-- 使用DISTINCT
SELECT DISTINCT l_orderkey
FROM lineitem
WHERE l_shipdate BETWEEN '1998-01-01' AND '1998-12-31';-- 执行时间:2.34秒-- 使用GROUP BY
SELECT l_orderkey
FROM lineitem
WHERE l_shipdate BETWEEN '1998-01-01' AND '1998-12-31'
GROUP BY l_orderkey;-- 执行时间:1.87秒
五、最佳实践指南
适用场景推荐
- 生成下拉菜单的可选值列表
- 数据清洗阶段的重复检测
- 数据探查时统计唯一值数量
- 关联查询前的维度表准备
使用注意事项
- 字段选择:仅选择必要字段,避免无意义去重
- 排序影响:DISTINCT可能改变默认排序
- 类型兼容:注意不同数据类型的比较规则
- 字符编码:确保数据库和连接的字符集一致
替代方案对比
方案 | 优点 | 缺点 |
---|---|---|
DISTINCT | 语法简单 | 大数据量性能差 |
GROUP BY | 可结合聚合函数 | 需要理解分组概念 |
临时表 | 可重复利用中间结果 | 增加存储开销 |
窗口函数 | 可灵活控制保留策略 | 语法复杂度高 |
六、实战案例集锦
案例1:电商用户行为分析
-- 识别访问过不同品类商品的用户
SELECT user_id,COUNT(DISTINCT product_category) AS visited_categories
FROM user_behavior_log
WHERE event_date >= CURDATE() - INTERVAL 7 DAY
GROUP BY user_id
HAVING visited_categories > 3;
案例2:金融交易监控
-- 检测异常重复交易
SELECT DISTINCT t1.*
FROM transactions t1
JOIN transactions t2 ON t1.account_id = t2.account_idAND t1.amount = t2.amountAND ABS(TIMESTAMPDIFF(SECOND, t1.trans_time, t2.trans_time)) < 60
WHERE t1.trans_id <> t2.trans_id;
案例3:医疗数据清洗
-- 合并重复患者记录
WITH duplicate_records AS (SELECT patient_id,ROW_NUMBER() OVER (PARTITION BY national_id, birth_date ORDER BY created_at DESC) AS rnFROM medical_records
)
UPDATE medical_records
SET is_active = CASE WHEN rn = 1 THEN 1 ELSE 0 END;
七、总结与展望
通过本文的深度解析,我们全面掌握了SELECT DISTINCT的:
✅ 核心工作原理
✅ 多种应用场景
✅ 性能优化技巧
✅ 最佳实践方案
随着大数据时代的到来,数据去重技术也在不断发展。值得关注的趋势包括:
- AI智能去重:利用机器学习识别语义重复
- 实时去重引擎:Kafka等流处理平台的去重方案
- 分布式去重算法:适应海量数据的并行处理技术
最后提醒各位开发者:在数据科学项目中,约78%的时间花费在数据清洗阶段,而合理使用DISTINCT可以帮助节省至少23%的数据准备时间。掌握这个看似简单的关键字,将会使你的数据库操作事半功倍!
思考题:当需要对10亿条记录进行去重操作时,除了使用DISTINCT,还有哪些更高效的实现方案?欢迎在评论区分享你的见解!
相关文章:
SQL SELECT DISTINCT 语句详解:精准去重的艺术
SQL SELECT DISTINCT 语句详解:精准去重的艺术 一、为什么需要数据去重? 在日常数据库操作中,我们经常会遇到这样的场景:查询客户表时发现重复的邮箱地址,统计销售数据时出现冗余的订单记录,分析用户行为…...
从ChatGPT到AutoGPT——AI Agent的范式迁移
一、AI Agent的范式迁移 1. ChatGPT的局限性与Agent化需求 单轮对话的“工具属性” vs. 多轮复杂任务的“自主性” ChatGPT 作为强大的生成式AI,虽然能够进行连贯对话,但本质上仍然是“工具型”AI,依赖用户提供明确的指令,而无法自主规划和执行任务。 人类介入成本过高:提…...
SQL EXISTS 与 NOT EXISTS 运算符
EXISTS 和 NOT EXISTS 是 SQL 中的逻辑运算符,用于检查子查询是否返回任何行。它们通常用在 WHERE 子句中,与子查询一起使用。 EXISTS 运算符 EXISTS 运算符用于检查子查询是否返回至少一行数据。如果子查询返回任何行,EXISTS 返回 TRUE&…...
AGI 的概念、意义与未来展望
随着人工智能技术的飞速发展,我们已经见证了在图像识别、自然语言处理等特定领域取得的巨大突破。然而,这些成就都属于弱人工智能(Narrow AI)的范畴,它们只能在预设的任务范围内高效工作。 人们对于一种拥有更广泛、更…...
基于Java与Go的下一代DDoS防御体系构建实战
引言:混合云时代的攻防对抗新格局 2024年某金融平台遭遇峰值2.3Tbps的IPv6混合攻击,传统WAF方案在新型AI驱动攻击面前全面失效。本文将以Java与Go为技术栈,揭示如何构建具备智能决策能力的防御系统。 一、攻击防御技术矩阵重构 1.1 混合攻击特征识别 攻击类型Java检测方案…...
FPGA调试笔记
XILINX SSTL属性电平报错 错误如下: [DRC BIVRU-1] Bank IO standard Vref utilization: Bank 33 contains ports that use a reference voltage. In order to use such standards in a bank that is not configured to use INTERNAL_VREF, the banks VREF pin mu…...
Axure项目实战:智慧城市APP(七)我的、消息(显示与隐藏交互)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:智慧城市APP 主要内容:我的、消息、活动模块页面 应用场景:消息页设计、我的页面设计以及活动页面设计 案例展示ÿ…...
深度学习——图像余弦相似度
计算机视觉是研究图像的学问,在图像的最终评价时,往往需要用到一些图像相似度的度量指标,因此,在本文中我们将详细地介绍原生和调用第三方库的计算图像余弦相似度的方法。 使用原生numpy实现 import numpy as npdef image_cosin…...
求矩阵某列的和
设计函数sum_column( int A[E1(n)][E2(n)], int j ),E1(n)和E2(n)分别为用宏定义的行数和列数,j为列号。在该函数中,设计指针ptr&A[0][j],通过*ptr及ptrptrE2(n)访问第j列元素,从而求得第j列元素的和。在主函数中定…...
【论文分析】无人机轨迹规划,Fast-Planner:实时避障+全局最优的路径引导优化算法
这篇论文《Robust Real-time UAV Replanning Using Guided Gradient-based Optimization and Topological Paths》由香港科技大学提出,主要针对无人机(UAV)在复杂环境中的实时轨迹重新规划问题,提出了一种结合梯度优化和拓扑路径搜…...
李飞飞、吴佳俊团队新作:FlowMo如何以零卷积、零对抗损失实现ImageNet重构新巅峰
目录 一、摘要 二、引言 三、相关工作 四、方法 基于扩散先前的离散标记化器利用广告 架构 阶段 1A:模式匹配预训练 阶段 1B:模式搜索后训练 采样 第二阶段:潜在生成建模 五、Coovally AI模型训练与应用平台 六、实验 主要结果 …...
AutoDev 2.0 正式发布:智能体 x 开源生态,AI 自动开发新标杆
在我们等待了几个月之后,国内终于有模型(DeepSeek V3-0324)能支持 AutoDev 的能力,也因此是时候发布 AutoDev 2.0 了!在 AutoDev 2.0 中,你可以: 编码智能体 Sketch 进行自动化编程自动化编程的…...
PHP 应用MYSQL 架构SQL 注入跨库查询文件读写权限操作
MYSQL 注入:(目的获取当前 web 权限) 1 、判断常见四个信息(系统,用户,数据库名,版本) 2 、根据四个信息去选择方案 root 用户:先测试读写,后测试获取…...
鸿蒙-全屏播放页面(使用相对布局)---持续更新中
最终实现效果图: 实现步骤 创建FullScreenPlay.ets全品播放页面 并将其修改为启动页面。 全屏播放,屏幕必然横过来,所以要将窗口横过来。 编辑 src/main/ets/entryability/EntryAbility.ets 若写在/EntryAbility.ets中,则所有…...
第4期:重构软件测试体系——生成式AI如何让BUG无所遁形
真实战场报告 某金融系统上线前,测试团队用AI生成3000条边缘用例,发现了一个隐藏极深的并发漏洞——该BUG在传统用例覆盖下需要7年才会触发一次。这次发现直接避免了可能上亿元的资金风险! 一、测试革命:当AI遇见质量保障 场景1&…...
力扣.旋转矩阵Ⅱ
59. 螺旋矩阵 II - 力扣(LeetCode) 代码区: class Solution {const int MAX25; public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> ans;vector<int> hang;int len_nn;int arry[25][25]…...
Docker 安装部署Harbor 私有仓库
Docker 安装部署Harbor 私有仓库 系统环境:redhat x86_64 一、首先部署docker 环境 定制软件源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repoyum install -y yum-utils device-mapper-persistent-data lvm2…...
SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景
以下是 SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景: 数据类型类别数据类型解释内存占用适用场景整数类型bigint用于存储范围较大的整数,范围是 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807)8 字节需要…...
javascript实现一个函数,将字符串中的指定子串全部替换为另一个字符串的原理,以及多种方法实现。
大白话javascript实现一个函数,将字符串中的指定子串全部替换为另一个字符串的原理,以及多种方法实现。 在JavaScript里,要是你想把字符串里的指定子串都替换成另外一个字符串,有不少方法可以实现。下面我会详细介绍实现的原理&a…...
Python 3 与 MySQL 数据库连接:mysql-connector 模块详解
Python 3 与 MySQL 数据库连接:mysql-connector 模块详解 概述 在Python 3中,与MySQL数据库进行交互是一个常见的需求。mysql-connector是一个流行的Python模块,它提供了与MySQL数据库连接和交互的接口。本文将详细介绍mysql-connector模块…...
HCIA-Datacom高阶:基础的单区域 OSPF 与多区域 OSPF的配置
动态路由协议是实现网络高效通信的关键技术之一。开放式最短路径优先(Open Shortest Path First,OSPF)协议作为内部网关协议(IGP)的一种,因其高效性、稳定性和扩展性,在大型网络中得到了广泛应用…...
蓝桥杯单片机刷题——E2PROM记录开机次数
设计要求 使用E2PROM完成数据记录功能,单片机复位次数记录到E2PROM的地址0中。每复位一次数值加1,按下按键S4,串口发送复位次数。串口发送格式如下: Number:1 备注: 单片机IRC振荡器频率设置为12MHz。 …...
杂草YOLO系列数据集4000张
一份开源数据集——杂草YOLO数据集,该数据集适用于农业智能化、植物识别等计算机视觉应用场景。 数据集详情 训练集:3,664张高清标注图像测试集:180张多样性场景样本验证集:359张严格筛选数据 下载链接 杂草YOLO数据集分…...
Python自动化面试通关秘籍
Python自动化测试工程师面试,不仅仅是考察你的代码能力,更看重你如何在项目中灵活运用工具和框架解决实际问题。如果你正准备面试,这篇文章将为你总结最常见的高频考题及答题技巧,帮助你快速上手,通关面试,…...
机器学习的一百个概念(1)单位归一化
前言 本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...
Python 笔记 (二)
Python Note 2 1. Python 慢的原因2. 三个元素3. 标准数据类型4. 字符串5. 比较大小: 富比较方法 rich comparison6. 数据容器 (支持*混装* )一、允许重复类 (list、tuple、str)二、不允许重复类 (set、dict)1、集合(set)2、字典(dict)3、特殊: 双端队列 deque 三、数据容器的共…...
【商城实战(97)】ELK日志管理系统的全面应用
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…...
3.使用epoll实现单线程并发服务器
目录 1. epoll的概述 2. 多线程与epoll的处理流程 2.1 多线程处理流程 2.2 epoll处理流程 3. epoll与多线程的比较 4. epoll的操作函数 4.1 epoll_create() 4.2 epoll_ctl() 4.3 epoll_wait() 5. 示例代码 6. epoll的工作模式 7. 使用O_NONBLOCK防止阻塞 8.运行代…...
蓝桥杯真题------R格式(高精度乘法,高精度加法)
对于高精度乘法和加法的同学可以学学这几个题 高精度乘法 高精度加法 文章目录 题意分析部分解全解 后言 题意 给出一个整数和一个浮点数,求2的整数次幂和这个浮点数相乘的结果最后四舍五入。、 分析 我们可以发现,n的范围是1000,2的1000次方非常大&am…...
PyCharm操作基础指南
一、安装与配置 1. 版本选择 专业版:支持 Web 开发(Django/Flask)、数据库工具、科学计算等(需付费)。 社区版:免费,适合纯 Python 开发。 2. 安装步骤 访问 JetBrains 官网 下载对应版本。…...
21 python __name__ 与 __main__
在办公室里,每个员工都有自己的工牌,上面写着姓名和部门。 一、__name__:模块的名字 Python 模块也有类似的 "工牌"——__name__属性,它记录了模块的身份: 直接运行时 → __name__ "__main__"&…...
NixVis 开源轻量级 Nginx 日志分析工具
NixVis NixVis 是一款基于 Go 语言开发的、开源轻量级 Nginx 日志分析工具,专为自部署场景设计。它提供直观的数据可视化和全面的统计分析功能,帮助您实时监控网站流量、访问来源和地理分布等关键指标,无需复杂配置即可快速部署使用。 演示…...
elementUI el-image图片加载失败解决
是不是,在网上找了一些,都不行,这里一行代码,解决,后端返回图片路径,el-image图片加载失败的问题 解决办法, vue项目里,index.html文件里加一行代码就可 <meta name"refe…...
lxd-dashboard 图形管理LXD/LXC
前言 LXD-WEBGUI是一个完全用AngularJS编写的Web应用程序,无需应用服务器、数据库或其他后端服务支持。只需要简单地托管静态HTML和JavaScript文件,就能立即投入使用。这个项目目前处于测试阶段,提供了直观的用户界面,帮助用户便捷地管理和控制LXD实例。 安装lxd-dashboa…...
C# MemoryStream 使用详解
总目录 前言 在.NET开发中,流(Stream)是一个用于处理输入和输出的抽象类,MemoryStream是流的一个具体实现,它允许我们在内存中读写数据,就像操作文件一样,而无需涉及磁盘 I/O 操作。尤其适合需…...
(二)万字长文解析:deepResearch如何用更长的思考时间换取更高质量的回复?各家产品对比深度详解
DeepResearch的研究背景 业务背景:用更长的等待时间,换取更高质量、更具实用性的结果 当前AI技术发展正经历从“即时响应”到“深度思考”的范式转变。用户对延迟的容忍度显著提升,从传统200ms的交互响应放宽至数秒甚至数分钟,以…...
Redis场景问题1:缓存穿透
Redis 缓存穿透是指在缓存系统(如 Redis)中,当客户端请求的数据既不在缓存中,也不在数据库中时,每次请求都会直接穿透缓存访问数据库,从而给数据库带来巨大压力,甚至可能导致数据库崩溃。下面为…...
数据结构(并查集,图)
并查集 练习版 class UnionFindSet { public:void swap(int* a, int* b){int tmp *a;*a *b;*b tmp;}UnionFindSet(size_t size):_ufs(size,-1){}int UnionFind(int x){}void Union(int x1, int x2){}//长分支改为相同节点int FindRoot(int x){}bool InSet(int x1, int x2)…...
深度学习篇---断点重训模型部署文件
文章目录 前言一、断点重训(Checkpoint)文件1. 动态图(DyGraph)模式.pdparams 文件.pdopt 文件.pdscaler 文件.pdmeta 或 .pkl 文件 2. 静态图(Static Graph)模式.pdparams 和 .pdopt 文件.ckpt 文件 3. 恢…...
chromem-go + ollama + bge-m3 进行文档向量嵌入和查询
Ollama 安装 https://ollama.com/download Ollama 运行嵌入模型 bge-m3:latest ollama run bge-m3:latestchromem-go 文档嵌入和查询 package mainimport ("context""fmt""runtime""github.com/philippgille/chromem-go" )func ma…...
运维面试题(十一)
1.如果一个硬盘 IO 时阻塞了,会发生什么情况? 进程/线程挂起:发起I/O操作的进程或线程会被操作系统置为阻塞状态(等待状态),直到I/O完成。CPU资源释放:阻塞的线程会让出CPU,操作系统…...
深度学习中常见的专业术语汇总
本硕博都是搞机械的匠人,当然也想做一下交叉学科的东西,蹭一下人工智能的热点。虽然世界是个草台班子,但是来都来了,咱也要把这场戏演好。 记得之前网上爆料有位大学生发了很多水文,对,是交叉学科的&#x…...
人工智能赋能医疗:开启智慧医疗新时代
在当今数字化浪潮的推动下,人工智能(AI)技术正以前所未有的速度渗透到各个行业,其中医疗领域更是成为AI技术大放异彩的重要舞台。从疾病诊断到治疗方案制定,从医疗影像分析到药物研发,AI正在为传统医疗带来…...
stable diffusion 本地部署教程 2025最新版
前提: 需要环境 git git下载地址Git - Downloading Package 直接装即可 python3.10.6 下载地址 Python Release Python 3.10.6 | Python.org 记得python环境一定要3.10.6!!! 第一个版本 项目地址https://github.…...
[Mac]利用Hexo+Github Pages搭建个人博客
由于我这台Mac基本没啥环境,因此需要从零开始配置,供各位参考。 注意⚠️:MacBook (M4)使用/bin/zsh作为默认Shell,其对应的配置文件为~/.zshrc 参考文档: HEXO系列教程 | 使用GitHub部署静态博客HEXO | 小白向教程 文…...
罗杰斯特回归
定义 逻辑回归其实就是原来的线性回归加了激活函数,这个函数其实就是sigmoid函数,把一个回归的连续数值压缩到了0到1的空间,其实只要有函数能够满足把数值压缩到0,1之间就可以(因为0到1之间的数值就是概率值) 对于分类…...
27_promise
插入一下前端助手测试,顺手可以用来做安全 promise promise 是一个es6新增的语法 汉语:承诺的意思 作用:是专门用来解决回调地狱!!!! 什么是回调函数? <script>// 回调函数 callback回调// 就是把函数A当作参数传递到函数B中// 在函…...
【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】
【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 目录 【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 前言: 连接步骤说明 一. 硬件连接 支持的相机接口类型: 连接步骤 2. 软件配置 Visio…...
红宝书第十九讲:详解JavaScript的Fetch API与Ajax请求
红宝书第十九讲:详解JavaScript的Fetch API与Ajax请求 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、基本概念:为什么需要Fetch? Fetch API是浏览器提供的现代网络请求工…...
【深度学习新浪潮】具身智能及其发展前景分析
一、具身智能的定义 具身智能(Embodied Intelligence) 是指通过物理载体(如机器人)与环境实时交互,实现感知、决策与行动闭环的智能系统。其核心在于将人工智能与物理实体结合,强调“智能源于身体与环境的互动”,而非仅依赖虚拟算法。具身智能的典型特征包括多模态感知…...