`
yinwufeng
  • 浏览: 287100 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SQL Distinct的实现

 
阅读更多

 Distinct是SQL中一种很常见的操作,能够很方便地筛选掉结果中重复的行。首先来看看Distinct操作的效果:


mysql> select * from ob;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    2 |    3 |
|    1 |    2 |    3 |
|    1 |    2 |    3 |
|    1 |    2 | 2323 |
|    1 |  323 |   21 |
|    9 |    9 |    9 |
+------+------+------+
6 rows in set (0.00 sec)


/// 取出所有不同行

mysql> select distinct * from ob;

+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    2 |    3 |
|    1 |    2 | 2323 |
|    1 |  323 |   21 |
|    9 |    9 |    9 |
+------+------+------+

4 rows in set (0.00 sec)



/// 取出所有a, b列不相同的行

mysql> select distinct a, b from ob;
+------+------+
| a    | b    |
+------+------+
|    1 |    2 |
|    1 |  323 |
|    9 |    9 |
+------+------+
3 rows in set (0.00 sec)



在数据库的设计中,如何实现Distinct操作呢?一般有两种基本思路:排序(Sort)法,哈希(Hash)法。

排序法将表格中的数据全部按照distinct指定的列为key进行排序,然后逐行迭代,每迭代出一行数据都与上一行数据根据key作对比,如果相同,则丢弃当前行继续迭代下一行,如果不同则输出。排序法带来的一个副作用就是数据输出按照key有序。mysql在某些情况下不是使用排序法,通过下面的输出可以观察到行并不是有序的:

mysql> select distinct a, b from ob;
+------+------+
| a    | b    |
+------+------+
|    1 |    2 |
|    1 |  323 |
|    9 |    9 |
|    0 |    0 |
+------+------+
4 rows in set (0.00 sec)

哈希法将表格中的数据全部按照distinct指定的列值为key作为hash key进行分桶,key相同的行自然就被区分出来了。

排序法在具体实现中会遇到这么一些问题:

1. 数据集超出了内存限制,如何排序?

2. 如何实现可以尽可能减少数据拷贝?

3. 如果已经有了Sort运算符,如何实现代码重用。


考虑一种理想实现,sort依次排序出最大,次大,较大,。。。等行,没一行输出后都跟前一行比较,如果key相等则丢弃,这样,sort完毕,distinct也做完了。堆排序可以较好地满足这一要求。但是,堆排序不支持外排,当数据集合超出内存限制时该方法将失效。




最后说个题外话,distinct跟groupby蛮像的,那么他们的区别又在哪里呢? 简单地说,distinct是一种很弱的groupby。详细见网上转载的一篇文章:


原文地址:http://lalaalisa.blogspot.com/2012/03/sql-distinct-vs-group-by.html

SQL語法 : DISTINCT vs GROUP BY

我使用的是SQLyog執行我的測試!! SQL語法的保留字~大小寫我在寫下列例子沒有很在意...

主要是為了情境所測出的心得~~如測試結果不同,請給我意見(pls leave comment)喔!!

CC~~ ^^

--------------------------------------------------------------------------------------------------------------
Table: member

id
name
email_address
11
Mary
22
Mary
33
John
44
Leo
55
Jane
55
Janny


--------------------------------------------------------------------------------------------------------------
Create Table member_distinct_by_name
Select Distinct name
From member
-------------------------------------------------
result:

Table: member_distinct_by_name


name
Mary
John
Leo
Jane

---------------------------------------------------------------------------------------------------------------
情境: 依據不重覆的 email_address,拉出想要的資料!

Create Table member_group_by_emailaddress
Select email_address, id
From member GROUP BY name


------------------------------------------------
result:

Table: member_group_by_emailaddress

email_address
id
mary@gmail.com
11
mary@hotmail.com
22
john@gmail.com
33
leo@gmail.com
44
Jane@hotmail.com
55

----------------------------------------------------------------------------------------------------------------

Create Table member_distinct
Select Distinct email_address, name, id  (只要有一欄位的data不一樣就會納入)
From member

---------------------------------------------------
result:

Table:  member_distinct

ID
NAME
GENDER
11
Mary
22
Mary
33
John
44
Leo
55
Jane
55
Janny


 


 

 

分享到:
评论

相关推荐

    分析MySQL中优化distinct的技巧

    为了解决这个问题,可以采用一种称为“伪 Loose Index Scan”的技术,虽然MySQL 5.1版本并不直接支持,但可以通过SQL改写来实现类似效果。改写后的SQL如下: ```sql SELECT COUNT(*) FROM ( SELECT DISTINCT(nick...

    小度写范文【SQL中distinct的用法】mysql中distinct用法模板.docx

    这时,我们可以利用子查询或者窗口函数(如SQL Server中的`ROW_NUMBER()`)来实现这个目标。 总的来说,`DISTINCT`在SQL查询中是过滤重复数据的关键工具,无论是在数据分析、报表生成还是数据清洗过程中都十分常用...

    LINQ to SQL手册

    4. **Join**:`Join` 实现了 SQL 中的内连接,可以将两个数据集根据指定的关联条件合并。 5. **Order By**:用于对查询结果进行排序,可指定升序或降序。 6. **Group By/Having**:`Group By` 将数据按指定字段...

    SQL中distinct的用法(四种示例分析)

    在SQL查询中,`DISTINCT` 是一个非常重要的关键字,用于去除结果集中的重复行,只保留唯一的记录。本文将详细解析 `DISTINCT` 的四种典型用法,并通过实例进行说明,帮助理解如何有效地利用 `DISTINCT` 处理数据。 ...

    oracle sql 去重复记录不用distinct如何实现

    用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同),而如果要指定一个字段却没有效果,另外distinct关键字会排序,效率很低 。 select distinct name from t1 能消除重复记录,但只能取一个字段,...

    小度写范文【SQL中distinct的用法】mysql中distinct用法模板.pdf

    如果你还需要显示其他列的数据,比如在`DISTINCT name`的同时展示`备注`列的内容,直接使用`DISTINCT`是无法实现的。这时,你可以考虑使用子查询或者窗口函数(如`ROW_NUMBER()`或`RANK()`)来达到目的。在SQL ...

    sql实现交叉表的一个很好例子

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要介绍了一个使用 SQL 实现交叉表的例子。下面将对此案例进行详细解读,并从中提炼出相关的 SQL 知识点。 ### SQL 实现交叉表的知识点 #### 1. **...

    SQL select distinct的使用方法

    如果你想获取 `name` 的唯一值以及对应的 `id`,但不能直接使用 `DISTINCT` 实现,可以使用分组(`GROUP BY`)或窗口函数(`OVER()`)来达到目的。例如: ```sql SELECT id, name FROM ( SELECT DISTINCT name, id...

    部分普通sql查询在hive中的实现方式

    ### 部分普通SQL查询在Hive中的实现方式 Hive是一款基于Hadoop的数据仓库工具,能够对存储在Hadoop文件系统中的数据集进行数据提取、转换、加载(ETL),这是一种可以简化MapReduce编程的工具。由于Hive的设计初衷...

    使用T-SQL语句实现简单查询.pptx

    使用T-SQL语句实现简单查询 在本节中,我们将学习使用T-SQL语句实现简单查询。T-SQL语句是一种关系数据库管理系统的查询语言,广泛应用于数据库管理和数据分析领域。 一、T-SQL语句的基本结构 T-SQL语句的基本...

    oracle,sql面试题

    可以使用以下 SQL 语句实现: ```sql SELECT name FROM student WHERE (SELECT COUNT(*) FROM score WHERE score.student_id = student.id AND score.score > 80) = (SELECT COUNT(DISTINCT course_id) FROM ...

    行转列的sql 实现

    ### 行转列的SQL实现 #### 背景与目的 在数据库处理过程中,我们经常需要对数据进行转换操作,以适应不同的分析需求或报表展示。其中,“行转列”(Pivot)是一种常见的数据转换方式,它将源表中的某些列值转化为...

    EFCore查询不重复数据Distinct.docx

    在.NET Core开发中,Entity ...通过`Distinct()`和`OrderBy()`/`ThenBy()`组合,你可以轻松地在C#代码中实现这一功能。但记得在处理大量数据时,要考虑性能优化,可能需要借助于数据库的特有功能来提升查询效率。

    MySQL DISTINCT 的基本实现原理详解

    MySQL DISTINCT 是一种用于消除查询结果集中重复行的SQL语句,它的基本实现原理与GROUP BY类似,但在细节上有一定的区别。在理解DISTINCT的工作方式时,我们首先要了解它如何与索引交互,以及在无法利用索引时如何...

    SQL基础知识第2版.pdf

    本文将详细介绍SQL的基础知识,包括SELECT语句的用法、DISTINCT关键词以及TOP子句的概念与应用。 首先,关于SELECT语句,它是SQL中用来从数据库表中选择数据的最重要的命令之一。SELECT语句的基本用法是从表中选取...

    用Distinct在MySQL中查询多条不重复记录值,绝对的物有所值

    `GROUP_CONCAT`可以将同一组内的一列值连接成一个字符串,结合`DISTINCT`,可以实现对多个字段的高效处理: ```sql SELECT name, GROUP_CONCAT(DISTINCT id ORDER BY id) AS id_list FROM table GROUP BY name; ```...

    SQL SELECT DISTINCT 语句

    4. **与其他聚合函数结合**:虽然`DISTINCT`本身已经实现了去重,但可以与`COUNT()`等聚合函数一起使用,计算不重复值的数量: ```sql SELECT COUNT(DISTINCT country) AS unique_countries FROM Websites; ```...

    Excel_VBA+ADO+SQL入门教程看见星光.docx

    使用 SQL 语句可以实现字段去重,例如使用 DISTINCT 语句可以删除重复的字段记录。 六、排序和名次 排序和名次是指对查询结果进行排序和排名。使用 SQL 语句可以实现排序和名次,例如使用 ORDER BY 语句可以对查询...

    用SQL实现统计报表中的小计与合计的方法详解

    本文将详细介绍如何利用SQL实现这一功能,主要关注"利用临时表"这一方法,因为这种方法具有逻辑清晰且执行效率高的特点,尽管在大数据量时可能会占用较多内存。 首先,我们需要创建一个临时表#TB,它是原始数据的...

Global site tag (gtag.js) - Google Analytics