别再浪费时间了!用 MySQL DISTINCT 轻松消灭所有重复数据的秘诀

  • 博客主页:长风清留扬-CSDN博客
  • 系列专栏:MySQL入门到入魔
  • 每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法
  • 感谢大家点赞👍收藏⭐评论

DISTINCT 关键字

DISTINCT 是 MySQL 中用于从查询结果中去除重复记录的关键字。当需要获取唯一值或组合时,可以在 SELECT 语句中使用DISTINCT。它可以应用于单列或多列,并可与聚合函数(如 COUNT)结合使用,以统计唯一值的数量。

基本用法

sql 复制代码
SELECT DISTINCT column1, column2, ...  
FROM table_name;
  • column1, column2, ...:这些是你要从表中检索的列。
  • table_name:这是你要从中查询数据的表的名称。

示例

创建表语法

sql 复制代码
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    email VARCHAR(100),
    age INT,
    city VARCHAR(50)
);

模拟数据

sql 复制代码
INSERT INTO users (name, email, age, city) VALUES
('Alice', 'alice@example.com', 30, 'New York'),
('Bob', 'bob@example.com', 25, 'Los Angeles'),
('Alice', 'alice@example.com', 30, 'New York'),
('Charlie', 'charlie@example.com', 35, 'New York'),
('Diana', 'diana@example.com', 28, 'Los Angeles'),
('Eve', 'eve@example.com', 22, 'Chicago'),
('Frank', 'frank@example.com', 22, 'Chicago');

对city列进行去重,单列去重

sql 复制代码
SELECT DISTINCT city FROM users;
输出结果:
city
New York
Los Angeles
Chicago
描述

此查询返回唯一的城市名。DISTINCT 关键字消除了重复的城市名,使得每个城市只出现一次。数据库在处理时只保留不同的值。

对name和city列去重,多列去重

sql 复制代码
SELECT DISTINCT name, city FROM users;
输出结果:
name city
Alice New York
Bob Los Angeles
Charlie New York
Diana Los Angeles
Eve Chicago
Frank Chicago
描述

此查询返回唯一的名称和城市组合。DISTINCT 在这里作用于多个列,只有当 name 和 city 的组合不同的时候,记录才会被保留。相同的 name 和 city 组合(如 Alice 的记录)会被过滤掉。

放到count中进行去重聚合

sql 复制代码
SELECT COUNT(DISTINCT city) AS unique_cities FROM users;
输出结果
unique_cities
3
描述

此查询统计不同城市的数量。使用 COUNT(DISTINCT city) 只计算唯一的城市,排除重复的记录,因此返回的结果为3,代表有三个不同的城市。

使用表达式时对表达式的结果去重

sql 复制代码
SELECT DISTINCT age + 5 AS adjusted_age FROM users;
输出结果:
adjusted_age
35
30
27
22
40
描述

此查询返回调整后的年龄值。DISTINCT 在这里作用于计算后的结果,只有不同的 adjusted_age 值才会被返回。相同的表达式计算结果(如 22 + 5)只会出现一次。

分组后聚合统计去重

sql 复制代码
SELECT city, COUNT(DISTINCT name) AS unique_users FROM users GROUP BY city;
输出结果
city unique_users
New York 2
Los Angeles 2
Chicago 2
描述

此查询返回每个城市的唯一用户数量。COUNT(DISTINCT name) 确保只计算不同的用户名称,避免同一用户在同一城市多次计入。每个城市的用户数量为2,说明每个城市都只有两个不同的用户。

注意事项

  1. 性能影响:
    使用DISTINCT可能会对查询性能产生负面影响,因为它需要数据库引擎对结果集进行额外的处理,以去除重复的行。在大数据集上,这种性能影响可能尤为明显。
  2. 作用于所有列:
    DISTINCT关键字作用于查询结果的所有列。如果你只想要某一列的唯一值,但仍然在SELECT语句中列出了其他列,那么这些列的值也会被考虑在内,以确定行的唯一性。
  3. 与聚合函数结合使用:
    虽然DISTINCT通常用于去除重复行,但它也可以与某些聚合函数(如COUNT)结合使用,以计算唯一值的数量。例如,COUNT(DISTINCT column_name)会返回指定列中不同值的数量。
  4. 排序和分组:
    在使用DISTINCT时,你可能还需要对结果进行排序或分组。这可以通过ORDER BY和GROUP BY子句来实现。但是,请注意,GROUP BY通常与聚合函数一起使用,而DISTINCT则用于去除重复行。在某些情况下,你可能需要决定是使用DISTINCT还是GROUP BY,或者是否可以将它们结合使用。
  5. NULL值处理:
    在MySQL中,DISTINCT将NULL视为一个值。因此,如果表中有多行包含NULL值,并且这些行在其他列上的值也相同,那么这些NULL值将被视为重复,并且只会在结果集中出现一次。
  6. 索引使用:
    如果查询中使用了DISTINCT,并且相关的列上有索引,那么数据库引擎可能会尝试利用这些索引来优化查询性能。然而,索引的使用还取决于查询的具体情况和数据库引擎的优化策略。
  7. 数据类型:
    DISTINCT关键字的行为可能受到列数据类型的影响。例如,对于字符串类型的列,比较是基于字符的,而对于数值类型的列,比较则是基于数值的。因此,在编写查询时,请确保了解列的数据类型以及它们如何影响DISTINCT的行为。

推荐阅读

Python基础

Python全网最全基础课程笔记(一)------基础入门

Python全网最全基础课程笔记(二)------变量

Python全网最全基础课程笔记(三)------所有运算符+运算符优先级

Python全网最全基础课程笔记(四)------基本数据类型

Python全网最全基础课程笔记(五)------选择结构+Python新特性Match

Python全网最全基础课程笔记(六)------循环结构

Python全网最全基础课程笔记(七)------列表,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(八)------字典,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(九)------集合,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(十)------元组,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(十一)------字符串所有操作,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(十二)------函数,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(十三)------作用域,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

Python全网最全基础课程笔记(十四)------异常处理机制,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

有史以来最全的异常类讲解没有之一!爆肝3万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第一部分

有史以来最全的异常类讲解没有之一!第二部分爆肝2万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第二部分

有史以来最全的异常类讲解没有之一!第三部分爆肝4万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第三部分

Python疑难杂症百科-BUG编年史

浮点数精度不再是困扰:Python高手的精准编程秘籍!解决Python浮点数精度问题!

还在为Python变量中遇到的BUG而发愁吗?,变量相关的问题和解决办法看这篇文章就够了!

还在为Python"运算符"中遇到的BUG而发愁吗?,变量相关的问题和解决办法看这篇文章就够了!

Python刷题面试宝典

Python列表实战题目练习,巩固知识、检查技术

Python "元组" ------Python面试100道实战题目练习,巩固知识、检查技术、成功就业

Python "字符串操作" ------Python面试100道实战题目练习,巩固知识、检查技术、成功就业

Python字典实战题目练习,巩固知识、检查技术

Python "集合" 100道实战题目练习,巩固知识、检查技术

Python "函数" ------Python面试100道实战题目练习,巩固知识、检查技术、成功就业

Python "异常处理机制" ------Python面试100道实战题目练习,巩固知识、检查技术、成功就业

Flink入门到就业

2024年最新Flink教程,从基础到就业,大家一起学习--基础篇

2024年最新Flink教程,从基础到就业,大家一起学习--入门篇

2024年最新Flink教程,从基础到就业,大家一起学习--Flink集群部署

2024年最新Flink教程,从基础到就业,大家一起学习--flink部署和集群部署(从本地测试到公司生产环境如何部署项目源码)

2024年最新Flink教程,从基础到就业,大家一起学习--Flink运行架构底层源码详解+实战

2024年最新Flink教程,从基础到就业,大家一起学习--Flink DataStream API-第一篇+源码讲解

相关推荐
Estar.Lee16 分钟前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
温辉_xh38 分钟前
uiautomator案例
android
Red Red1 小时前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全
mqiqe2 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
工业甲酰苯胺2 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
BestandW1shEs2 小时前
谈谈Mysql的常见基础问题
数据库·mysql
贰十六2 小时前
笔记:Centos Nginx Jdk Mysql OpenOffce KkFile Minio安装部署
笔记·nginx·centos
重生之Java开发工程师2 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql
教练、我想打篮球2 小时前
66 mysql 的 表自增长锁
数据库·mysql