'select distinct'是返回第一个不同的值还是最后一个不同?

use*_*147 6 sql distinct

当我查询

select distinct Name from Emp;
Run Code Online (Sandbox Code Playgroud)

Emp Table

ID   Name
1    Sam
2    Tom
3    Sam

此查询是否从重复的名称或最后一个不同的名称(ID = 3)返回第一个不同的名称(ID = 1)

distinct关键字在这种情况下实际上如何工作?

Pet*_*ser 8

我觉得有一个误解,在这里:您查询并没有返回的记录,只有不同的列值.在你的例子中,它是' Sam '和' Tom '.

它们没有可以安全预期的特定顺序.它可能是自然顺序,或它们在数据库上处理的顺序(完全取决于数据库实现),或半随机(例如迭代集合中的项目).订单也可能根据结果是从数据还是从缓存中检索而变化.

如果您需要特定订单,请将其指定为订单标准:

select distinct Name from Emp order by Name asc
Run Code Online (Sandbox Code Playgroud)

如果您想要不同的值和包含它的第一个记录,请使用group by:

select min(ID), Name from Emp group by Name
Run Code Online (Sandbox Code Playgroud)


Abe*_*ejo 8

MySQL DISTINCT

一旦找到第一个匹配项,MySQL 就会停止扫描任何未使用的表。

概念

DISTINCT返回第一场比赛,是的!但是返回最后一场比赛呢?关键思想是先对值进行排序,然后进行区分步骤。它可以通过使用这样的语法来完成:

SELECT DISTINCT column_name FROM
(SELECT * FROM table_name ORDER BY column_name DESC)
Run Code Online (Sandbox Code Playgroud)

第一个不同的值

SELECT DISTINCT Name,ID FROM Emp;
Run Code Online (Sandbox Code Playgroud)

与下面的语法相同,但更明确

SELECT DISTINCT generated.Name,generated.ID
FROM
    (
    SELECT Name,ID FROM Emp ORDER BY ID ASC
    ) AS generated
GROUP BY generated.Name
Run Code Online (Sandbox Code Playgroud)
姓名 ID
山姆 1
汤姆 2

最后一个不同的值

SELECT DISTINCT generated.Name,generated.ID
FROM
    (
    SELECT Name,ID FROM Emp ORDER BY ID DESC
    ) AS generated
GROUP BY generated.Name
Run Code Online (Sandbox Code Playgroud)
姓名 ID
山姆 3
汤姆 2

结论

的裸使用DISTINCT将返回第一次出现。但是,它可以通过在进行区分步骤之前首先对初始结果进行排序来工作。