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的严格模式下,查询将失败,因为您无法选择不按其分组的列