先决条件 – WHERE 子句、GROUP BY、拥有与地点子句
Where和Group 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 的列部分。
结论:
- WHERE用于在对单行进行任何分组之前过滤记录。
- GROUP BY聚合/分组行并返回每个组的摘要。
- HAVING用于过滤分组后的值。