📜  Where 和 Group By 之间的区别

📅  最后修改于: 2021-09-09 11:10:19             🧑  作者: Mango

先决条件 – WHERE 子句、GROUP BY、拥有与地点子句
WhereGroup By子句用于根据条件过滤查询返回的行。区别如下。

WHERE 子句指定查询返回的行的搜索条件并将行限制为特定的行集。如果一个表有大量的记录,并且如果有人想要获取特定的记录,那么使用“where”子句是很有用的。

GROUP BY 子句通过在 SELECT 列表中使用适当的聚合函数,如 COUNT()、SUM()、MIN()、MAX(),将相同的行汇总到单个/不同的组中,并返回带有每个组汇总的单行, AVG() 等

用例:
假设某销售公司想要获得去年购买了一定数量商品的客户列表,以便他们今年可以向他们销售更多商品。
有一个名为 SalesOrder 的表,其中包含 CustomerId、SalesOrderId、Order_Date、OrderNumber、OrderItem、UnitPrice、OrderQty
现在我们需要得到去年下订单的客户,即2017年

使用 Where 子句 –

SELECT * 
FROM [Sales].[Orders]
WHERE Order_Date >= '2017-01-01 00:00:00.000'
AND Order_Date < '2018-01-01 00:00:00.000' 

这将返回包含 2017 年所有客户和相应订单的行集。

使用 Group By 子句 –

SELECT CustomerID, COUNT(*) AS OrderNumbers
FROM [Sales].[Orders]
WHERE Order_Date >= '2017-01-01 00:00:00.000'
AND Order_Date < '2018-01-01 00:00:00.000'
GROUP BY CustomerId 

这将返回 2017 年下订单的客户 (CustomerId) 的行集以及每个客户下订单的总数。

使用 have 子句 –
Have 子句用于过滤 Group By 子句中的值。下面的查询过滤掉了一些行

SELECT SalesOrderID,
         SUM(UnitPrice* OrderQty) AS TotalPrice
FROM     Sales.SalesOrderDetail
GROUP BY SalesOrderID
HAVING   TotalPrice > 5000 

由于 WHERE 子句的可见性是一次一行,因此无法评估所有 SalesOrderID 的 SUM。在创建分组后评估 HAVING 子句。

您也可以将“Where”子句与“Having”子句一起使用。 WHERE 子句首先应用于表中的各个行。只有满足 WHERE 子句中条件的行才会被分组。然后将 HAVING 子句应用于结果集中的行。

例子:

SELECT SalesOrderID,
         SUM(UnitPrice * OrderQty) AS TotalPrice
FROM     Sales.SalesOrderDetail
WHERE    SalesOrderID > 500
GROUP BY SalesOrderID
HAVING   SUM(UnitPrice * OrderQty) > 10000 

所以在这里,have 子句将应用于由 where 子句过滤的行。 have 子句只能比较聚合函数的结果或 group by 的列部分。

结论:

  1. WHERE用于在对单行进行任何分组之前过滤记录。
  2. GROUP BY聚合/分组行并返回每个组的摘要。
  3. HAVING用于过滤分组后的值。