Sql GROUPBY子句,是否必须调用Select中使用的所有行?

Sql GROUPBY子句,是否必须调用Select中使用的所有行?,sql,Sql,我是否需要将所有列名放在我选择的组中? 例如,在这个简单的查询中: Select CustomerID, CompanyName, ContactName, ContactTitle, City, Country From Customers Group By Country, CompanyName, ContactName, ContactTitle, City, Country,

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

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

如果您只是选择列,并且希望返回的记录丢弃完全重复的行,那么我必须始终根据我在Select?中使用的内容调用相同的金额组?然后有两种方法

1) 分组依据
2) 明显的

您的查询不使用任何聚合函数,如f.e.COUNT、MIN、MAX、SUM等。。。 因此,您的查询可以使用DISTINCT而不是GROUPBY

select DISTINCT
 CustomerID, CompanyName, ContactName, ContactTitle, City, Country
from Customers
但是如果CustomerID是主键,那么CustomerID将使结果唯一。
因此,此查询不需要
分组依据
不同的
来仅获取唯一记录

select CustomerID, CompanyName, ContactName, ContactTitle, City, Country
from Customers
请注意,在同一个查询中可以同时具有DISTINCT和GROUP BY。但这是毫无意义的。
groupby
已经强制执行了唯一性,因此添加一个
DISTINCT
使其唯一只会无缘无故地降低查询速度


至于为什么选择中的所有列也必须列在GROUP BY中?有些数据库,例如MySql,可以更宽容地不必对所有列进行分组。但这是一个SQL标准的规则。所以大多数数据库都强制执行这一点。这是为了避免潜在的误导性结果。

按x,y分组
意味着您希望每个x和y有一个结果行。因此,如果您有一个包含账单的表,您可以按年份和月份进行分组,从而获得每月的账单数量(
count(*)
)和总额(
sum(amount)

因此,问题是您希望看到哪些行。每家公司一行(包括他们的客户数量)可能吗?每个城市一排?
GROUPBY
子句正好包含上述列


您的
GROUP BY
子句完全不起任何作用,因为选择客户和您的GROUP BY customer ID(应该是customer表的主键)。

这取决于您要查找的数据。您的查询不使用任何聚合函数(如
COUNT
SUM
等),因此使用
分组依据没有意义。请记住,
groupby
不用于对行进行排序或分区(通常人们认为
groupby
不进行分区)。一般来说,如果在
GROUP BY
子句中有太多的列,您就做错了。啊,这对我来说很有意义,但对于下一个示例,如果我要在查询中使用类似计数的函数。我是否必须从select调用所有rest分区(如customerID、FirstName、LastName等),或者我是否可以选择其中的两个?附带说明:公司名称不应该在customers表中,而应该在company表中。城市名称和城市表也是如此。这(加上适当的外键约束)将防止打字错误(一个记录中是“西雅图”,另一个记录中是“西特尔”)。