当我写下这样的查询时:
SELECT DISTINCT City FROM Customers;
它将返回Customers表中的所有不同城市。
但是当我写下这样的查询时:
SELECT DISTINCT City,* FROM Customers;
它返回Customers表中的所有行(首先是city列,所有列包括city后面的输出)。
即使我们使用不同的关键字,显示所有记录的原因是什么?
答案 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(单行不仅仅是您的城市列)