按条款分组,我是否必须调用“选择”中使用的所有行?

时间:2018-08-19 16:10:23

标签: sql

我是否需要将所有列名放在select所依据的组中? 例如在这个简单的查询中:

Select
    CustomerID,
    CompanyName,
    ContactName,
    ContactTitle,
    City,
    Country
From
    Customers
Group By
    Country,
    CompanyName,
    ContactName,
    ContactTitle,
    City,
    Country,
    CustomerID

我必须始终将相同的金额称为“选择”中的分组依据?

2 个答案:

答案 0 :(得分:1)

如果您只是选择列,并且希望返回的记录丢弃确切的重复行?然后有2种方法。

1)分组依据
2)独特

您的查询未使用任何集合函数,例如f COUNT,MIN,MAX,SUM,... 因此,您的查询可以使用DISTINCT而不是GROUP BY。

select DISTINCT
 CustomerID, CompanyName, ContactName, ContactTitle, City, Country
from Customers

但是,如果CustomerID是主键,则CustomerID已经可以使结果唯一。
因此,此查询不需要GROUP BYDISTINCT即可仅获取唯一记录。

select CustomerID, CompanyName, ContactName, ContactTitle, City, Country
from Customers

请注意,同一查询中可能同时具有DISTINCT和GROUP BY。但这是没有意义的。 GROUP BY已经具有唯一性,因此添加DISTINCT以使其唯一将无缘无故使查询变慢。

关于为什么该选择中的所有列也必须在GROUP BY中列出的原因?一些数据库MySql可以容忍不必对所有列进行分组。但这是SQL标准之一的规则。因此,大多数数据库都强制执行该操作。这是为了避免潜在的误导性结果。

答案 1 :(得分:1)

GROUP BY x, y表示您希望每个x和y一行结果。因此,如果您有一个包含帐单的表格,则可以按年份和月份分组,从而获得帐单数(count(*))和每月总数(sum(amount))。

所以问题是您想查看哪些行。每个公司(客户数量)是否连续?每个城市连续? GROUP BY子句完全包含提到的那些列。

您的GROUP BY子句什么都不做,因为选择客户,然后按客户ID(应该是客户表的主键)进行分组。