`
isiqi
  • 浏览: 16033208 次
  • 性别: 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 Tablemember_distinct_by_name
SelectDistinctname
Frommember
-------------------------------------------------
result:

Table:member_distinct_by_name


name
Mary
John
Leo
Jane

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

Create Tablemember_group_by_emailaddress
Selectemail_address, id
FrommemberGROUP BYname


------------------------------------------------
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 Tablemember_distinct
SelectDistinctemail_address, name, id(只要有一欄位的data不一樣就會納入)
Frommember

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

Table: member_distinct

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




/// 取出所有不同行
分享到:
评论

相关推荐

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

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

    Hive SQL 编译过程详解

    1.3 Distinct的实现原理 2.1 Phase1 SQL词法,语法解析 2.1.1 Antlr 2.1.2 抽象语法树AST Tree 2.1.3 样例SQL ........... 2.3 Phase3 逻辑操作符Operator ........... 2.4 Phase4 逻辑层优化器 ........... 2.5 ...

    SQL中distinct 和 row_number() over() 的区别及用法

    在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在检索的时候,...

    精通SQL--结构化查询语言详解

    5.2.3 使用distinct去除重复信息 86 5.2.4 多列查询 87 5.2.5 查询所有的列 88 5.3 排序查询结果 89 5.3.1 单列排序 89 5.3.2 多列排序 90 5.3.3 采用序号进行多列排序 91 5.3.4 反向排序 92 5.4 使用where...

    SQL实现相邻两行数据的加减乘除操作

    SQL实现表里数据按一定顺序排序后,按某几个字段分组后相邻两行数据实现加减乘除运算。 思路: 1:先把表数据分组排序后打上序号标签 2:根据需求把标签字段加/减一 上代码: select distinct a.phone,from_unix...

    MySQL DISTINCT 的基本实现原理详解

    所以,DISTINCT 的实现和 GROUP BY 的实现也基本差不多,没有太大的区别。同样可以通过松散索引扫描或者是紧凑索引扫描来实现,当然,在无法仅仅使用索引即能完成 DISTINCT 的时候,MySQL 只能通过临时表来完成。 ...

    sql server字符串非空判断实现方法

    set @sql=” –distinct select @sql=@sql+ 颜色+’,’ from ( select distinct 颜色 from yourtablename where 井号=@井号 and 层位=@层位 and 颜色 is not null ) aa set @sql=substring(@sql,1,len(@sql)-1)

    SQL中数据的筛选组件

    SELECT 指令让我们能够读取表格中一个或数个栏位的所有资料。 这将把所有的资料都抓出,无论资料值有无重复。在资料处理中,我们会...在 SQL 中,这是很容易做到的。我们只要在 SELECT 后加上一个 DISTINCT 就可以了。

    精通sql结构化查询语句

    SQL查询篇第6章 简单的SELECT语句查询 6.1 查询的基本结构 6.1.1 了解SELECT语句 6.1.2 SELECT语句的语法格式 6.1.3 SELECT语句的执行步骤 6.2 简单的查询语句 6.2.1 查询表中指定的字段 6.2.2 查询所有的字段 6.2.3...

    仿制简单的SQL select查询语句,用于对二维数组的查询,建立环境-Excel Vba,可移植到VB环境中

    '参照SQL语句:Select * From array [Where conditions] [Distinct fields] [ResultWithTitle] ' '实现功能: ' 依条件设置查询数组,返回包含查询字段(或全部字段)的数组,可多条件组合。 ' 条件运算符包括:> = ...

    经典SQL语句大全

    2),select distinct * into temp from tablename delete from tablename insert into tablename select * from temp 评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作 3),例如:在一个外部表...

    SQL Server 2008编程入门经典(第3版)

    3.1.8 DISTINCT和ALL谓词 3.2 使用INSERT语句添加数据 3.2.1 多行插入 3.2.2 INSERTINTOSELECT语句 3.3 用UPDATE语句更改数据 3.4 DELETE语句 3.5 本章小结 3.6 练习 第4章 连接 4.1 连接 4.2 内部连接 4.3 外部...

    SQL.Server.2008编程入门经典(第3版).part2.rar

    《SQL Server 2008编程入门经典(第3版)》首先概述了数据库设计的概念,介绍了如何用SQL Setver 2008实现这些基本概念。然后,讲述了RDBMS(关系数据库管理系统)的功能和它在开发系统架构方面的优势。SQL Server ...

    精通SQL 结构化查询语言详解

    5.2.3 使用DISTINCT去除重复信息  5.2.4 多列查询  5.2.5 查询所有的列 5.3 排序查询结果 5.3.1 单列排序  5.3.2 多列排序 5.3.3 采用序号进行多列排序 5.3.4 反向排序  5.4 使用WHERE子句定义搜索条件...

    SQL.Server.2008编程入门经典(第3版).part1.rar

    《SQL Server 2008编程入门经典(第3版)》首先概述了数据库设计的概念,介绍了如何用SQL Setver 2008实现这些基本概念。然后,讲述了RDBMS(关系数据库管理系统)的功能和它在开发系统架构方面的优势。SQL Server ...

    数据透视表SQL语句入门

    上面那一句SQL语句的意思就是:从表材料进货明细表中取出定额名称及规格的值 例2、查询材料进货明细表的详细记录 SELECT * FROM [材料进货明细表$] 等价于: SELECT 序号, 定额名称,规格,日期,单位,数量 FROM ...

    浅谈sql数据库去重

     关于sql去重最常见的有两种方式:DISTINCT和ROW_NUMBER(),当然了ROW_NUMBER()除了去重还有很多其他比较重要的功能,一会我给大家简单说说我自己在实际中用到的。  假如有张UserInfo表,如下图:      现在...

    Mysql中distinct与group by的去重方面的区别

    distinct简单来说就是用来去重的,而group by的设计目的则是用来聚合统计的,两者在能够实现的功能上有些相同之处,但应该仔细区分。 单纯的去重操作使用distinct,速度是快于group by的。 distinct支持单列、多列的...

Global site tag (gtag.js) - Google Analytics