在本教程中,我们将学习如何使用SQL HAVING子句为一组行或聚合指定搜索条件。
HAVING子句通常与SELECT语句中的GROUP BY子句一起使用,用于根据指定的条件筛选行组。
下面是HAVING子句的语法:
SELECT
column1, column2, aggregate_function(expr)
FROM
table
GROUP
BY
column1
HAVING
condition;
如果HAVING子句没有与GROUP BY子句一起使用,那么它的工作原理与WHERE子句类似。HAVING子句和WHERE子句的区别在于WHERE子句用于过滤行,而HAVING子句用于过滤行组。
在这个例子中,我们将查找销售订单的总销售额大于$10000的。我们使用与GROUP BY子句的HAVING子句来完成如下查询:
orderid,
SUM
(unitPrice * quantity) Total
orderdetails
orderid
total > 10000;
数据库引擎将执行下面的操作:首先,对于每个订单行,SQL使用SUM函数计算总金额。(列别名Total用于格式化输出)。其次,GROUP BY子句根据orderid对所选行进行分组。对于每个订单,我们只有一个包含OrderID和Total的组第三,HAVING子句获取总数大于10000的组。
下面的查询选择至少包含5项产品的所有订单。我们将COUNT函数与HAVING和GROUP BY子句一起使用。
orderID,
COUNT
(productID) products
orderID
products > 5;
请看下面的产品表:
categoryID, productID, productName,
MAX
(unitprice)
products A
WHERE
unitprice = (
products B
B.categoryId = A.categoryID)
categoryID;
请注意,语句的WHERE子句中使用了子查询,以便在外部查询中获得正确的结果。
如果出现下面的报错
[Err] 1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'jpetstore.A.ProductID' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
这是因为 如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下为该模式),MySQL将拒绝select list、HAVING condition或ORDER BY list引用未聚合列的查询,这些列既不在groupby子句中命名,也不在功能上依赖于这些列。详细请查看https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
解决方法有两种:
SET
GLOBAL
sql_mode=(
REPLACE
(@@sql_mode,
'ONLY_FULL_GROUP_BY'
,
''
));
categoryID,
categoryID
(unitprice) > 120;
MIN
(unitprice) < 5;
原文链接:https://codingdict.com/