SQL SELECT DISTINCT 语句实例详解
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. DISTINCT 关键字概述</a></li><li><a href="#_label1">2. DISTINCT 的工作原理</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">2.1 去重多个列</a></li><li><a href="#_lab2_1_1">2.2 如何判断去重的标准</a></li></ul><li><a href="#_label2">3. 常见应用场景</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_2">3.1 查询唯一值</a></li><li><a href="#_lab2_2_3">3.2 查询唯一的组合</a></li><li><a href="#_lab2_2_4">3.3 排除重复记录</a></li><li><a href="#_lab2_2_5">3.4 使用 DISTINCT 和聚合函数</a></li></ul><li><a href="#_label3">4. 性能考量与优化</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">5. 注意事项</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_6">5.1 NULL 值的处理</a></li><li><a href="#_lab2_4_7">5.2 使用 DISTINCT 时的顺序问题</a></li></ul><li><a href="#_label5">6. 总结</a></li><ul class="second_class_ul"></ul></ul></div><p>在数据库管理中,去重是一个常见的需求。无论是在报告生成、数据分析,还是在用户查询时,去除重复的数据项都至关重要。SQL 提供了 <code>DISTINCT</code> 关键字,帮助我们从查询结果中去除重复的记录。本文将深入探讨 <code>SELECT DISTINCT</code> 语句,详细讲解它的用法、原理以及常见的应用场景,帮助你理解如何精准地去除重复数据。</p><p class="maodian"><a name="_label0"></a></p><h2>1. DISTINCT 关键字概述</h2>
<p><code>DISTINCT</code> 是 SQL 中的一个关键字,用于从查询结果中去除重复的记录。当你只关心查询结果中每个唯一值时,<code>DISTINCT</code> 能有效地帮助你精简结果集。</p>
<p>基本语法如下:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT DISTINCT column1, column2, ...
FROM table_name;</pre></div>
<ul><li><code>column1, column2, ...</code>:指定你想要查询的列。</li><li><code>table_name</code>:查询的目标表。</li></ul>
<p>示例:</p>
<p>假设我们有一个学生表 <code>students</code>,其中记录了学生的名字、班级和成绩等信息:</p>
<table><tbody><tr><th>name</th><th>class</th><th>grade</th></tr><tr><td>Alice</td><td>A</td><td>90</td></tr><tr><td>Bob</td><td>A</td><td>85</td></tr><tr><td>Alice</td><td>B</td><td>88</td></tr><tr><td>Charlie</td><td>A</td><td>92</td></tr><tr><td>Bob</td><td>B</td><td>84</td></tr></tbody></table>
<p>如果我们想查询所有学生的唯一名字,可以使用 <code>SELECT DISTINCT</code>:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT DISTINCT name FROM students;</pre></div>
<p>查询结果将会是:</p>
<table><tbody><tr><th>name</th></tr><tr><td>Alice</td></tr><tr><td>Bob</td></tr><tr><td>Charlie</td></tr></tbody></table>
<p>可以看到,<code>DISTINCT</code> 去除了重复的 "Alice" 和 "Bob"。</p>
<p class="maodian"><a name="_label1"></a></p><h2>2. DISTINCT 的工作原理</h2>
<p><code>DISTINCT</code> 是基于列值的唯一性来去重的。具体来说,它会对查询结果中每一行的所有指定列进行比较,如果所有指定列的值都相同,则认为这两行是重复的,最终只返回一行数据。</p>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>2.1 去重多个列</h3>
<p><code>DISTINCT</code> 不仅可以去重单个列,还可以同时对多个列进行去重。当你选择多个列时,<code>DISTINCT</code> 会基于这些列的组合值去重。</p>
<p>例如:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT DISTINCT name, class FROM students;</pre></div>
<p>查询结果将会是:</p>
<table><tbody><tr><th>name</th><th>class</th></tr><tr><td>Alice</td><td>A</td></tr><tr><td>Bob</td><td>A</td></tr><tr><td>Alice</td><td>B</td></tr><tr><td>Charlie</td><td>A</td></tr><tr><td>Bob</td><td>B</td></tr></tbody></table>
<p>在这种情况下,<code>DISTINCT</code> 会将 "Alice, A" 和 "Alice, B" 视为不同的组合,因为两个记录的班级不同。因此,去重是基于列的组合。</p>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2.2 如何判断去重的标准</h3>
<ul><li>如果你只选择 <strong>一个列</strong>,则 <code>DISTINCT</code> 会根据该列的值来判断去重。</li><li>如果你选择 <strong>多个列</strong>,则 <code>DISTINCT</code> 会基于所有列的组合值来判断去重,只有所有列的值都完全相同的记录才会被认为是重复的。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>3. 常见应用场景</h2>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>3.1 查询唯一值</h3>
<p>当你只关心某一列的不同值时,可以使用 <code>DISTINCT</code> 来查询唯一的值。例如,查询数据库中所有不同的城市:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT DISTINCT city FROM users;</pre></div>
<p>这个查询将返回所有用户记录中的唯一城市,不会有重复的城市名。</p>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>3.2 查询唯一的组合</h3>
<p><code>DISTINCT</code> 可以用于查询多列的唯一组合值。例如,查询所有不重复的班级和成绩组合:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT DISTINCT class, grade FROM students;</pre></div>
<p>结果可能是:</p>
<table><tbody><tr><th>class</th><th>grade</th></tr><tr><td>A</td><td>90</td></tr><tr><td>A</td><td>85</td></tr><tr><td>B</td><td>88</td></tr><tr><td>A</td><td>92</td></tr><tr><td>B</td><td>84</td></tr></tbody></table>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>3.3 排除重复记录</h3>
<p>有时,我们可能有一些重复的数据,在插入或更新数据库时,需要去除重复记录。通过 <code>DISTINCT</code> 查询,我们能够清晰地识别哪些记录是重复的,帮助我们清理数据。</p>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>3.4 使用 DISTINCT 和聚合函数</h3>
<p><code>DISTINCT</code> 也可以和聚合函数(如 <code>COUNT</code>, <code>SUM</code>, <code>AVG</code>, <code>MAX</code>, <code>MIN</code>)一起使用,以便对唯一的记录进行操作。例如,计算不同班级的人数:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT class, COUNT(DISTINCT name) FROM students GROUP BY class;</pre></div>
<p>示例结果:</p>
<table><tbody><tr><th>class</th><th>COUNT(DISTINCT name)</th></tr><tr><td>A</td><td>3</td></tr><tr><td>B</td><td>2</td></tr></tbody></table>
<p class="maodian"><a name="_label3"></a></p><h2>4. 性能考量与优化</h2>
<p>使用 <code>DISTINCT</code> 进行去重时,SQL 引擎需要对结果集中的每一行进行比较,这可能会导致性能问题,特别是在数据量非常大的情况下。以下是一些优化建议:</p>
<ul><li>索引优化:确保查询的列有索引,这样可以加速去重操作。</li><li>减少返回的列数:避免选择不必要的列,只保留需要去重的列。</li><li>使用 <code>GROUP BY</code>:在某些情况下,使用 <code>GROUP BY</code> 可能比 <code>DISTINCT</code> 更高效,尤其是当你同时需要聚合数据时。</li></ul>
<p>例如:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT class, COUNT(*) FROM students GROUP BY class;</pre></div>
<p>这条语句在某些情况下可能会比 <code>DISTINCT</code> 更高效,因为它通过分组来聚合数据,而不需要对整个结果集进行去重。</p>
<p class="maodian"><a name="_label4"></a></p><h2>5. 注意事项</h2>
<p class="maodian"><a name="_lab2_4_6"></a></p><h3>5.1 NULL 值的处理</h3>
<p>在 SQL 中,<code>NULL</code> 被认为是“未知”的值,因此两个 <code>NULL</code> 值被认为是相等的。所以,如果查询中包含 <code>NULL</code> 值,<code>DISTINCT</code> 会把多个 <code>NULL</code> 值视为同一个值,并去重。</p>
<p>例如:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT DISTINCT name FROM users;</pre></div>
<p>假设 <code>name</code> 列包含 <code>NULL</code> 值,<code>DISTINCT</code> 会将所有 <code>NULL</code> 视为相同的值,并只返回一个 <code>NULL</code>。</p>
<p class="maodian"><a name="_lab2_4_7"></a></p><h3>5.2 使用 DISTINCT 时的顺序问题</h3>
<p><code>DISTINCT</code> 去重操作是基于列的值组合的,所以查询列的顺序可能会影响结果。例如,查询:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT DISTINCT name, class FROM students;</pre></div>
<p>和:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT DISTINCT class, name FROM students;</pre></div>
<p>这两条查询虽然列顺序不同,但结果是一样的,只要 <code>name</code> 和 <code>class</code> 的组合唯一。即使查询的列顺序发生变化,<code>DISTINCT</code> 仍然会根据每一行所有列的组合值来去重。</p>
<p class="maodian"><a name="_label5"></a></p><h2>6. 总结</h2>
<p><code>SELECT DISTINCT</code> 是一个强大的工具,能够帮助我们精准地从查询结果中去除重复数据。在日常开发中,理解其工作原理和常见的应用场景,可以有效提升数据查询的效率和准确性。</p>
<ul><li><strong>去重单列或多列</strong>:<code>DISTINCT</code> 可以应用于单列或多列,用于去除重复数据。</li><li><strong>与聚合函数结合</strong>:<code>DISTINCT</code> 可以和聚合函数一起使用,进行更复杂的数据分析。</li><li><strong>性能优化</strong>:使用 <code>DISTINCT</code> 时,需考虑性能问题,特别是在数据量大时,优化查询和索引。</li></ul>
<p>通过正确地使用 <code>DISTINCT</code>,你可以在 SQL 查询中实现高效且精确的数据去重,保证结果的唯一性和可靠性。</p>
頁:
[1]