使用Distinct关键字,SQL

时间:2014-12-28 05:16:07

标签: sql distinct

当我写下这样的查询时:

SELECT DISTINCT City FROM Customers;

它将返回Customers表中的所有不同城市。

但是当我写下这样的查询时:

SELECT DISTINCT City,* FROM Customers;

它返回Customers表中的所有行(首先是city列,所有列包括city后面的输出)。

即使我们使用不同的关键字,显示所有记录的原因是什么?

3 个答案:

答案 0 :(得分:5)

DISTINCT关键字不适用于单个列,它适用于整个记录。如果表的行对于所有列都没有相同的值,则它们不是不同的。

假设您的customers表中有一些唯一列ID。如果您只想获得每个城市的最新客户ID,可以尝试:

SELECT Customers.* FROM
Customers JOIN (
  SELECT city, MAX(ID) as id
  FROM Customers
  GROUP BY city
  ) as max_id 
on Customers.ID=max_id.id

答案 1 :(得分:2)

如果每行在数据库中都是唯一的,它将只显示所有行。 DISTINCT关键字在输出集中显示“消除完全重复”。在第二个查询中,您选择City,然后通过*选择表格中的所有列。假设您有列City, State, Zip,则City, *City, City, State, Zip相同。现在,它只会为数据库中的所有行返回这些的唯一组合。所以,如果你有

Name, City, State, Zip
Joe, Chicago, IL, 60290
Steve, Chicago, IL, 60290
Joe, Chicago, IL, 60290
Joe, Los Angeles, CA, 90012

选择City, *你会得到

Joe, Chicago, IL, 60290
Steve, Chicago, IL, 60290
Joe, Los Angeles, CA, 90012

删除了重复的行Joe, Chicago, IL, 60290

如果你要获取所有行,我怀疑是因为你在表模式中有一个唯一的列(可能是一个主键),它强制每一行都是唯一的。

您可能想要的是GROUP BY查询,但是您需要将聚合运算符应用于其余列,以便为您选择所需的值。

SELECT State, COUNT(*) as [Customers in State]
FROM Customers
GROUP BY State

这将返回一组不同的状态,其中包含与表中该状态对应的行数。

答案 2 :(得分:1)

 SELECT DISTINCT City FROM Customers;// you just selecting distinct city from table

IN

 SELECT DISTINCT City,* FROM Customers; //you select distinct city and again * means all 
                                          from table (including city also)

N.B :此处*的优先级大于DISTINCT,并且在您的元组上执行DISTINCT(单行不仅仅是您的城市列)