SQL SELECT DISTINCT 语句实例详解

 更新时间:2025年06月06日 16:55:33   作者:威哥说编程  
本文将深入探讨 SELECT DISTINCT 语句,详细讲解它的用法、原理以及常见的应用场景,帮助你理解如何精准地去除重复数据,感兴趣的朋友跟随小编一起看看吧

在数据库管理中,去重是一个常见的需求。无论是在报告生成、数据分析,还是在用户查询时,去除重复的数据项都至关重要。SQL 提供了 DISTINCT 关键字,帮助我们从查询结果中去除重复的记录。本文将深入探讨 SELECT DISTINCT 语句,详细讲解它的用法、原理以及常见的应用场景,帮助你理解如何精准地去除重复数据。

1. DISTINCT 关键字概述

DISTINCT 是 SQL 中的一个关键字,用于从查询结果中去除重复的记录。当你只关心查询结果中每个唯一值时,DISTINCT 能有效地帮助你精简结果集。

基本语法如下:

SELECT DISTINCT column1, column2, ...
FROM table_name;
  • column1, column2, ...:指定你想要查询的列。
  • table_name:查询的目标表。

示例:

假设我们有一个学生表 students,其中记录了学生的名字、班级和成绩等信息:

nameclassgrade
AliceA90
BobA85
AliceB88
CharlieA92
BobB84

如果我们想查询所有学生的唯一名字,可以使用 SELECT DISTINCT

SELECT DISTINCT name FROM students;

查询结果将会是:

name
Alice
Bob
Charlie

可以看到,DISTINCT 去除了重复的 "Alice" 和 "Bob"。

2. DISTINCT 的工作原理

DISTINCT 是基于列值的唯一性来去重的。具体来说,它会对查询结果中每一行的所有指定列进行比较,如果所有指定列的值都相同,则认为这两行是重复的,最终只返回一行数据。

2.1 去重多个列

DISTINCT 不仅可以去重单个列,还可以同时对多个列进行去重。当你选择多个列时,DISTINCT 会基于这些列的组合值去重。

例如:

SELECT DISTINCT name, class FROM students;

查询结果将会是:

nameclass
AliceA
BobA
AliceB
CharlieA
BobB

在这种情况下,DISTINCT 会将 "Alice, A" 和 "Alice, B" 视为不同的组合,因为两个记录的班级不同。因此,去重是基于列的组合。

2.2 如何判断去重的标准

  • 如果你只选择 一个列,则 DISTINCT 会根据该列的值来判断去重。
  • 如果你选择 多个列,则 DISTINCT 会基于所有列的组合值来判断去重,只有所有列的值都完全相同的记录才会被认为是重复的。

3. 常见应用场景

3.1 查询唯一值

当你只关心某一列的不同值时,可以使用 DISTINCT 来查询唯一的值。例如,查询数据库中所有不同的城市:

SELECT DISTINCT city FROM users;

这个查询将返回所有用户记录中的唯一城市,不会有重复的城市名。

3.2 查询唯一的组合

DISTINCT 可以用于查询多列的唯一组合值。例如,查询所有不重复的班级和成绩组合:

SELECT DISTINCT class, grade FROM students;

结果可能是:

classgrade
A90
A85
B88
A92
B84

3.3 排除重复记录

有时,我们可能有一些重复的数据,在插入或更新数据库时,需要去除重复记录。通过 DISTINCT 查询,我们能够清晰地识别哪些记录是重复的,帮助我们清理数据。

3.4 使用 DISTINCT 和聚合函数

DISTINCT 也可以和聚合函数(如 COUNT, SUM, AVG, MAX, MIN)一起使用,以便对唯一的记录进行操作。例如,计算不同班级的人数:

SELECT class, COUNT(DISTINCT name) FROM students GROUP BY class;

示例结果:

classCOUNT(DISTINCT name)
A3
B2

4. 性能考量与优化

使用 DISTINCT 进行去重时,SQL 引擎需要对结果集中的每一行进行比较,这可能会导致性能问题,特别是在数据量非常大的情况下。以下是一些优化建议:

  • 索引优化:确保查询的列有索引,这样可以加速去重操作。
  • 减少返回的列数:避免选择不必要的列,只保留需要去重的列。
  • 使用 GROUP BY:在某些情况下,使用 GROUP BY 可能比 DISTINCT 更高效,尤其是当你同时需要聚合数据时。

例如:

SELECT class, COUNT(*) FROM students GROUP BY class;

这条语句在某些情况下可能会比 DISTINCT 更高效,因为它通过分组来聚合数据,而不需要对整个结果集进行去重。

5. 注意事项

5.1 NULL 值的处理

在 SQL 中,NULL 被认为是“未知”的值,因此两个 NULL 值被认为是相等的。所以,如果查询中包含 NULL 值,DISTINCT 会把多个 NULL 值视为同一个值,并去重。

例如:

SELECT DISTINCT name FROM users;

假设 name 列包含 NULL 值,DISTINCT 会将所有 NULL 视为相同的值,并只返回一个 NULL

5.2 使用 DISTINCT 时的顺序问题

DISTINCT 去重操作是基于列的值组合的,所以查询列的顺序可能会影响结果。例如,查询:

SELECT DISTINCT name, class FROM students;

和:

SELECT DISTINCT class, name FROM students;

这两条查询虽然列顺序不同,但结果是一样的,只要 nameclass 的组合唯一。即使查询的列顺序发生变化,DISTINCT 仍然会根据每一行所有列的组合值来去重。

6. 总结

SELECT DISTINCT 是一个强大的工具,能够帮助我们精准地从查询结果中去除重复数据。在日常开发中,理解其工作原理和常见的应用场景,可以有效提升数据查询的效率和准确性。

  • 去重单列或多列DISTINCT 可以应用于单列或多列,用于去除重复数据。
  • 与聚合函数结合DISTINCT 可以和聚合函数一起使用,进行更复杂的数据分析。
  • 性能优化:使用 DISTINCT 时,需考虑性能问题,特别是在数据量大时,优化查询和索引。

通过正确地使用 DISTINCT,你可以在 SQL 查询中实现高效且精确的数据去重,保证结果的唯一性和可靠性。

到此这篇关于SQL SELECT DISTINCT 语句详解的文章就介绍到这了,更多相关sql select distinct语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQL SERVER日志进行收缩的图文教程

    SQL SERVER日志进行收缩的图文教程

    这篇文章主要给大家介绍了关于SQL SERVER日志进行收缩的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用SQL SERVER具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • 未公开的SQL Server口令的加密函数

    未公开的SQL Server口令的加密函数

    未公开的SQL Server口令的加密函数...
    2006-07-07
  • 如何在SQL Server中使用随机记录集

    如何在SQL Server中使用随机记录集

    这篇文章介绍了如何在SQL Server里使用随机记录集,需要的朋友可以参考下
    2015-07-07
  • 介绍备份和还原MySQL数据的两种方法

    介绍备份和还原MySQL数据的两种方法

    这篇文章主要介绍了介绍备份和还原MySQL数据的两种方法,文中的操作环境基于CentOS,介绍了使用mysqldump和数据库文件两种方法,需要的朋友可以参考下
    2015-05-05
  • SQL Server误区30日谈 第6天 有关NULL位图的三个误区

    SQL Server误区30日谈 第6天 有关NULL位图的三个误区

    NULL位图是为了确定行中的哪一列是NULL值,哪一列不是。这样做的目的是当Select语句后包含存在NULL值的列时,避免了存储引擎去读所有的行来查看是否是NULL,从而提升了性能
    2013-01-01
  • SQL语句中的DDL类型的数据库定义语言操作

    SQL语句中的DDL类型的数据库定义语言操作

    这篇文章主要介绍了SQL语句中的DDL类型的数据库定义语言,主要是用来定义数据库中的对象的,例如数据库、表和字段的定义,简单的理解就是DDL语言是来操作数据库、表和字段的,需要的朋友可以参考下
    2022-08-08
  • 基于sqlserver的四种分页方式总结

    基于sqlserver的四种分页方式总结

    下面小编就为大家分享一篇基于sqlserver的四种分页方式总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • sql 批量修改数据库表

    sql 批量修改数据库表

    通过sysobjects和syscolumns系统表,找到每个表的每个列,如果列类型是字符串类型的,比如varchar、nvarchar等,利用游标,对这些列进行更新。
    2009-01-01
  • uniqueidentifier转换成varchar数据类型的sql语句

    uniqueidentifier转换成varchar数据类型的sql语句

    uniqueidentifier转换成varchar数据类型的sql语句,需要的朋友可以参考下。
    2011-09-09
  • SQL中的left join right join

    SQL中的left join right join

    数据库常见的join方式有三种:inner join, left outter join, right outter join(还有一种full join,因不常用,本文不讨论)。这三种连接方式都是将两个以上的表通过on条件语句,拼成一个大表。
    2009-06-06

最新评论