Mysql 当HAVING与GROUP BY一起使用时,SQL是否只进行聚合?

Mysql 当HAVING与GROUP BY一起使用时,SQL是否只进行聚合?,mysql,Mysql,在以下声明中: SELECT CustomerID, Country FROM Customers GROUP BY Country HAVING count(CustomerID)>7 我想返回客户ID超过7个国家/地区的所有客户ID。但每个国家只返回1个ID 我需要执行以下操作才能得到我想要的: SELECT CustomerID, Country FROM Customers WHERE Country in (SELECT Country FROM Customers GROUP

在以下声明中:

SELECT CustomerID, Country
FROM Customers
GROUP BY Country
HAVING count(CustomerID)>7
我想返回客户ID超过7个国家/地区的所有客户ID。但每个国家只返回1个ID

我需要执行以下操作才能得到我想要的:

SELECT CustomerID, Country
FROM Customers
WHERE Country in (SELECT Country FROM Customers GROUP BY Country HAVING COUNT(CustomerID)>7)

有人能解释一下原因吗?

您可以将其巧妙地构造为子查询的连接:

SELECT CustomerID 
FROM Customers c
JOIN (
  SELECT Country 
  FROM Customers 
  GROUP BY Country 
  HAVING COUNT(CustomerID) > 7
) c2 on c.Country = c2.Country;

您可以将其巧妙地构造为子查询的联接:

SELECT CustomerID 
FROM Customers c
JOIN (
  SELECT Country 
  FROM Customers 
  GROUP BY Country 
  HAVING COUNT(CustomerID) > 7
) c2 on c.Country = c2.Country;

显然,这不适用于Sql Server为什么要对其进行标记?这是一种通常在开发人员知道
customerid
对于每个
国家都是不同的情况下使用的语法,因此他们只是在一个字段上进行分组。我在MythBackend源代码中看到过。不过,我也无法想象有什么好的理由允许这样做。它总是让我感到困扰。@scsimon第一个查询甚至不会在SQL Server上运行,因为
customerid
不包含在聚合公式中,也不存在于
GROUP BY
子句中。除了MySQL之外,所有RDBMS都会出错。我猜想OP造成的混乱与MySQL的古怪行为有关,因为它甚至允许运行第一个查询。@scsimon-如果仔细观察,
select
中存在非聚合列(
CustomerID
),该列不属于
groupby
的一部分,并且查询适用于OP。。所以它不是SqlServer@Pரதீப் 在MySQL的严格模式下,查询将失败,因为您无法选择未按分组的列。显然,这不适用于Sql Server。为什么要对其进行标记?当开发人员知道
customerid
对于每个
国家/地区都是不同的时,通常会使用这种语法,所以他们只是在一个场地上懒洋洋地分组。我在MythBackend源代码中看到过。不过,我也无法想象有什么好的理由允许这样做。它总是让我感到困扰。@scsimon第一个查询甚至不会在SQL Server上运行,因为
customerid
不包含在聚合公式中,也不存在于
GROUP BY
子句中。除了MySQL之外,所有RDBMS都会出错。我猜想OP造成的混乱与MySQL的古怪行为有关,因为它甚至允许运行第一个查询。@scsimon-如果仔细观察,
select
中存在非聚合列(
CustomerID
),该列不属于
groupby
的一部分,并且查询适用于OP。。所以它不是SqlServer@Pரதீப் 在MySQL的严格模式下,查询将失败,因为您无法选择不按其分组的列