Where
和 Group By
子句用于根据条件过滤查询返回的行。 区别如下:
WHERE
子句指定查询返回的行的搜索条件,并将行限制为特定的行集。 如果一个表有大量记录,并且如果有人想要获取特定记录,那么使用where
子句很有用。GROUP BY
子句将相同的行汇总到一个/不同的组中,并通过在SELECT
列表中使用适当的聚合函数,如:COUNT()
、SUM()
、MIN()
、MAX()
,返回单个行以及每个组的摘要 , AVG() 等。
用例:
假设某个销售公司想要获得一份去年购买了一些商品的客户的列表,以便他们今年可以向他们销售更多的东西。
有一个名为 SalesOrder
的表,其中包含 CustomerId
、SalesOrderId
、Order_Date
、OrderNumber
、OrderItem
、UnitPrice
、OrderQty
这些字段。
现在需要获取去年即 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
子句的可见性是一次一行,因此无法评估所有 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
所以在这里,having
子句将应用于由 where
子句过滤的行。 having
子句只能比较聚合函数的结果或分组依据的列部分。
结论
WHERE
用于在对单行进行任何分组之前过滤记录。GROUP BY
聚合/分组行并返回每个组的摘要。HAVING
用于在分组后过滤值。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/264222.html