SQL中的DISTINCT、SQL DISTINCT详解、DISTINCT的用法、DISTINCT注意事项

DISTINCT简介:

DISTINCT 是 SQL 中用来返回唯一不重复结果集的关键字。它通常用于 SELECT 语句中,可以指定一个或多个列进行去重,并返回唯一的结果。当你在使用 SELECT 查询数据时,可能会得到包含重复行的结果集。为了去除这些重复行,你可以使用 DISTINCT 关键字来获取唯一的记录。

表中插入的原始数据:
1、单列去重:单列去重:使用 DISTINCT 去重查询结果中的单个列,返回唯一的值。
复制代码
SELECT	DISTINCT age FROM students
2、多列去重:使用 DISTINCT 去重查询结果中的多个列,返回满足多列组合唯一的结果。
复制代码
SELECT	DISTINCT NAME,age,score FROM students
3、结合其他关键字:DISTINCT 可以与其他 SQL 关键字结合使用,如 ORDER BY、WHERE 和 GROUP BY 等
复制代码
SELECT	DISTINCT NAME,age,score FROM students ORDER BY score DESC
SELECT	DISTINCT NAME ,age,score FROM students GROUP BY NAME

4、对表达式进行去重:DISTINCT 还可以用于对表达式进行去重,而不仅仅是列名。这允许你根据某些计算得到的结果进行去重。
复制代码
SELECT DISTINCT ( `name` + age) result FROM students
5、COUNT()统计
复制代码
SELECT COUNT(DISTINCT NAME) num FROM students
注意事项:

1、distinct 必须放在字段的开头,即放在第一个参数的位置。

2、只能在select语句中使用,不能在insert、delete、update中使用。

3、distinct表示对后面的所有参数的拼接 取 不重复的记录。

4、distinct 忽略 NULL 值:distinct 关键字默认会忽略 NULL 值,即将 NULL 视为相同的值。如果你希望包括 NULL 值在去重结果中,可以使用 IS NULL 或 IS NOT NULL 进行过滤。

5、DISTINCT 基于所有选择的列:DISTINCT 关键字基于选择的所有列来进行去重。如果你只想根据部分列进行去重,可以使用子查询或者窗口函数等技术来实现。

6、DISTINCT 的性能消耗:DISTINCT 操作可能会对查询的性能产生一定的影响,特别是在处理大量数据时。因为它需要对结果集进行排序和比较以去除重复行。如果性能是一个关键问题,可以考虑其他优化方法,例如使用索引或者合理设计查询。

7、结果集顺序不保证:使用 DISTINCT 关键字后,结果集的顺序可能会发生变化,因为数据库系统通常会对结果进行重新排列以去除重复行。如果需要特定的结果排序,可以使用 ORDER BY 子句进行排序。

完整版代码
复制代码
CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    NAME VARCHAR(50),
    age INT,
    score DECIMAL(5, 2)
);


INSERT INTO students (NAME, age, score) VALUES
('Alice', 20, 85.5),
('Bob', 22, 76.3),
('Charlie', 21, 92.0),
('Alice', 20, 85.5),
('David', 23, 68.9);

# 原始数据
SELECT	* FROM students

# 单列去重:使用 DISTINCT 去重查询结果中的单个列,返回唯一的值。
SELECT	DISTINCT age FROM students

# 多列去重:使用 DISTINCT 去重查询结果中的多个列,返回满足多列组合唯一的结果。
SELECT	DISTINCT NAME,age,score FROM students

# 结合其他关键字:DISTINCT 可以与其他 SQL 关键字结合使用,如 ORDER BY、WHERE 和 GROUP BY 等
SELECT	DISTINCT NAME,age,score FROM students ORDER BY score DESC
SELECT	DISTINCT NAME ,age,score FROM students GROUP BY NAME

# 对表达式进行去重:DISTINCT 还可以用于对表达式进行去重,而不仅仅是列名。这允许你根据某些计算得到的结果进行去重。
SELECT DISTINCT ( `name` + age) result FROM students

# COUNT()统计
SELECT COUNT(DISTINCT NAME) num FROM students
相关推荐
我是一颗柠檬7 小时前
【MySQL全面教学】MySQL面试高频考点汇总Day15(2026年)
数据库·后端·mysql·面试
橙淮8 小时前
并发编程(六)
java·jvm
拽着尾巴的鱼儿8 小时前
springboot openfeign 自定义feign 接口重试机制
java·spring boot·后端
白露与泡影8 小时前
2026大厂Java面试题大全!牛客网最新版
java·开发语言
凯瑟琳.奥古斯特8 小时前
高阶子查询题目精炼
开发语言·数据库·python·职场和发展·数据库开发
身如柳絮随风扬8 小时前
数据库读写分离:从原理到实战,构建高并发系统
数据库·mysql
EntyIU9 小时前
JVM内存与GC笔记
java·jvm·笔记
XS0301069 小时前
并发编程 六
java·后端
提笔了无痕9 小时前
RAG存储策略中.md格式的切片与存储怎么处理
数据库·ai·rag