Mysql的distinct作用和排坑

概念

distinct不是函数,而是select的一部分,很多教程在介绍distinct这一块儿的时候都会写SELECT DISTINCT 语句。

语法:

SELECT DISTINCT column1,column2,... FROM table_name;

distinct是根据后面字段组合(column1,column2,…)去重,而不是根据column1去重。

用法

表A:
在这里插入图片描述

表B:
在这里插入图片描述

1.作用于单列

select distinct name from A

执行后结果如下:
在这里插入图片描述
2.作用于多列

select distinct name, id from A

执行后结果如下:
在这里插入图片描述

3.COUNT统计

select count(distinct name) from A;	  --表中name去重后的数目, SQL Server支持,而Access不支持

count是不能统计多个字段的,下面的SQL在SQL Server和Access中都无法运行。

select count(distinct name, id) from A;

若想使用,请使用嵌套查询,如下:

select count(*) from (select distinct xing, name from B) AS M;

4.distinct必须放在开头

实战排坑

使用count( DISTINCT ( o.member_id ) )即可,不然在后面字段上调用DISTINCT会报错

 SELECT
        o.agent_id AS memberId,
        (
        COUNT( o.id ) - count(
        DISTINCT ( o.member_id ))) / count(
        DISTINCT ( o.member_id )) * 100 AS newRepurchaseRate
		,count( DISTINCT ( o.member_id ) ) AS activeMemberCount
        ,count( DISTINCT ( o.member_id ) ) AS marketingCount
        FROM
            orders o,
            member_analysis m
        WHERE
        m.member_id = o.agent_id
        。。。。。其他具体逻辑
<think>嗯,用户问的是MySQLDISTINCT作用。我需要先回忆一下DISTINCT的基本功能。记得DISTINCT是用来去除查询结果中重复的行,只保留唯一的记录。比如,当用户想统计某个字段的不同值数量时,就会用到它。 不过,用户可能已经知道基础用法,可能需要更深入一点的解释。比如,DISTINCT可以用在单个字段,也可以用在多个字段的组合上。这时候,组合的唯一性才是判断重复的依据。另外,DISTINCTGROUP BY有时候可以达到类似的效果,但执行计划可能不同,需要比较两者的区别。 还要考虑用户的实际应用场景。比如,用户可能在写报表或者数据分析时用到DISTINCT,这时候性能可能是个问题。如果数据量很大,使用DISTINCT可能会导致性能下降,这时候可能需要优化查询,或者检查索引的情况。 另外,用户可能会混淆DISTINCTUNIQUE约束的区别。需要明确DISTINCT是查询时去重,而UNIQUE是数据库表结构上的约束,防止插入重复数据。 还要注意DISTINCT在聚合函数中的使用,比如COUNT(DISTINCT column),这时候统计的是该列不同值的数量,而SUM(DISTINCT column)则可能不符合预期,需要特别说明。 可能用户遇到的常见错误,比如在多个列使用DISTINCT时,误解了其作用范围。这时候需要用例子说明,比如SELECT DISTINCT col1, col2,这会根据col1col2的组合来去重。 另外,DISTINCT对NULL值的处理,通常会把多个NULL视为相同的,所以DISTINCT会只保留一个NULL。这点需要提醒用户注意。 还要考虑与其他关键字的结合使用,比如ORDER BY,这时候要注意顺序是否正确,是否会影响去重的结果。以及DISTINCT在子查询中的使用,可能会影响外层查询的性能。 最后,可能需要给出一些最佳实践,比如在需要去重时,如果数据量大,考虑是否有更好的方法,比如临时表或者索引优化,来提升查询效率。</think>在 MySQL 中,`DISTINCT` 是用于 **去除查询结果中重复行** 的关键字。以下是它的核心作用、用法注意事项: --- ### **核心作用** `DISTINCT` 的作用是 **对查询结果的某一列或多列进行去重**,返回唯一(Unique)的组合值。 #### **示例场景** 假设表 `students` 数据如下: | id | name | class | |----|-------|-------| | 1 | Alice | A | | 2 | Bob | B | | 3 | Alice | A | 执行以下查询: ```sql SELECT DISTINCT name, class FROM students; ``` 结果会去重 `name` `class` 的组合: | name | class | |-------|-------| | Alice | A | | Bob | B | --- ### **详细用法** #### 1. **单列去重** ```sql -- 返回唯一的班级名称 SELECT DISTINCT class FROM students; ``` #### 2. **多列组合去重** ```sql -- 返回 name class 的唯一组合 SELECT DISTINCT name, class FROM students; ``` #### 3. **与聚合函数结合** ```sql -- 统计不同班级的数量 SELECT COUNT(DISTINCT class) FROM students; ``` #### 4. **与 ORDER BY 配合** ```sql -- 去重后按班级序 SELECT DISTINCT class FROM students ORDER BY class DESC; ``` --- ### **注意事项** 1. **性能影响** - `DISTINCT` 需要对结果集去重,数据量大时可能降低查询效率。 - 如果目标列有索引,可优化性能(例如对 `class` 列建索引)。 2. **NULL 值处理** - `DISTINCT` 会将所有 `NULL` 视为相同的值,最终只保留一个 `NULL`。 3. **与 GROUP BY 的区别** - `DISTINCT` 仅去重,不聚合数据;`GROUP BY` 可配合聚合函数(如 `SUM`, `AVG`)进行分组计算。 - 某些情况下,两者性能可能不同(取决于执行计划)。 4. **多列去重逻辑** - `DISTINCT` 作用于所有选中列的组合。例如: ```sql SELECT DISTINCT col1, col2 FROM table; ``` 只有 `col1` `col2` 的组合完全相同时才会去重。 --- ### **常见误区** - **`DISTINCT *`** 以下写法会尝试对所有字段组合去重,但通常不推荐: ```sql SELECT DISTINCT * FROM table; -- 性能较差 ``` - **`DISTINCT` 与 `UNIQUE` 约束** - `DISTINCT` 是查询时的临时去重。 - `UNIQUE` 是表结构约束,用于保证字段值的唯一性(如主键)。 --- ### **性能优化建议** 1. **优先过滤数据** 先通过 `WHERE` 减少数据集,再使用 `DISTINCT`: ```sql SELECT DISTINCT class FROM students WHERE score > 60; ``` 2. **避免过度使用** 如果查询本身已能保证唯一性(例如通过主键查询),无需加 `DISTINCT`。 3. **替代方案** 对于复杂去重需求,可考虑使用 `GROUP BY`: ```sql SELECT name, class FROM students GROUP BY name, class; ``` --- ### **总结** `DISTINCT` 是处理重复数据的简单工具,适用于快速去重场景。但在大数据量或复杂查询中需谨慎使用,合理结合索引、过滤条件执行计划分析来优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值