sql中select distinct id和select distinct *之间的区别

Posted

技术标签:

【中文标题】sql中select distinct id和select distinct *之间的区别【英文标题】:difference between select distinct id and select distinct * in sql 【发布时间】:2018-07-25 06:32:52 【问题描述】:

我试过了

select distinct ID  from  DB.TABLE;

它返回所有记录中的唯一 ID。

select distinct *  from  DB.TABLE;

它将通过比较所有列和记录或“distinct *”的功能来返回唯一记录,我与 distinct * 的功能相混淆。

【问题讨论】:

select distinct * 使用 所有列 的元组来确定区别。对于表中的所有列,它与select distinct col1, col2, .. 相同:返回的结果列也会相应地不同。也就是说,具有 distinct 的 * 实际上与 select idselect * 的区别相同.. 换句话说distinct *没有意义。这是矛盾的 如果表中只有 Id 列,则没有区别。 【参考方案1】:

DISTINCT 意味着结果集中不会有重复的行,重复意味着所有列在两行中都具有相同的值。所以是的,DISTINCT * 的意思是“选择所有列并跳过所有列中的值与某些已包含的行匹配的任何行”。

【讨论】:

【参考方案2】:

在第一个查询中,在表的主键上使用了 distinct,所以很明显你得到了所有的记录。为了更好地说明,请使用表中不唯一的另一个字段。

【讨论】:

不保证ID是PK甚至是候选key;问题中没有声明。【参考方案3】:

您的第一个查询意味着您需要基于表中单个列的值的不同结果。在您的情况下,它将根据表 DB.TABLE 的名为 ID 的列的不同值返回结果。

但在您的第二个查询的情况下,它将根据所有列的值返回不同的结果。

例如考虑以下三个记录。

ID:01,col1:"some",col2:"one"
ID:01,col1:"some",col2:"two"
ID:02,col1:"some",col2:"two"

select distinct ID from table 将返回,

ID
01
02

因为它仅在名为 ID 的列中检查不同的值。

select distinct * from table 将返回

ID:01,col1:"some",col2:"one"
ID:01,col1:"some",col2:"two"
ID:02,col1:"some",col2:"two"

所有三个记录,因为如果考虑所有三个列,则没有不同的记录。

简单地说,这就像在预期结果中基于表的单个列排除重复项与基于表的所有列排除重复项。

【讨论】:

这个答案很难阅读。请将内容分开并格式化代码。

以上是关于sql中select distinct id和select distinct *之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

SQL 窗口函数 - SELECT DISTINCT ORDER BY LIMIT

[2]SQL SELECT DISTINCT

低版本中mysql不支持在limit语句中有子查询

低版本中mysql不支持在limit语句中有子查询

sql语句中 group by用法

sql语句去重distinct方法是啥?