WhereGroup By 子句用于根据条件过滤查询返回的行。 区别如下:

  • WHERE子句指定查询返回的行的搜索条件,并将行限制为特定的行集。 如果一个表有大量记录,并且如果有人想要获取特定记录,那么使用where子句很有用。
  • GROUP BY子句将相同的行汇总到一个/不同的组中,并通过在 SELECT 列表中使用适当的聚合函数,如:COUNT()SUM()MIN()MAX(),返回单个行以及每个组的摘要 , AVG() 等。

用例:

假设某个销售公司想要获得一份去年购买了一些商品的客户的列表,以便他们今年可以向他们销售更多的东西。
有一个名为 SalesOrder 的表,其中包含 CustomerIdSalesOrderIdOrder_DateOrderNumberOrderItemUnitPriceOrderQty 这些字段。
现在需要获取去年即 2022 年下订单的客户

使用 Where 子句 –

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

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

使用 Group By 子句 –

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

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

使用从句
Having 子句用于过滤 Group By 子句中的值。 下面的查询过滤掉一些行:

由于 WHERE 子句的可见性是一次一行,因此无法评估所有 SalesOrderIDSUM。 在创建分组后评估 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

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

结论

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