SQL WHERE 子句中的约束?

SQL constraints in WHERE clause?

我想 select 所有报价中至少有 3 件价格在 5 到 20 之间的产品的商店,我需要显示商店 ID 和名称以及满足条件的产品数量。这是代码:

SELECT SHOP.SHOP_ID, SHOP.SHOP_NAME, COUNT(PRODUCT.PRODUCT_ID) AS NUM
FROM SHOP JOIN PRODUCT USING (SHOP_ID)
GROUP BY SHOP_ID
HAVING (SELECT SHOP_ID FROM PRODUCT WHERE COST IS BETWEEN 5 AND 20 AND NUM>=3)

我遇到的问题是 NUM>3 的约束有效,但结果我同时获得了价格低于 5 和超过 20 的产品。就好像没有 BETWEEN 的部分,我也没有得到为什么会这样。

在 聚合之前对价格 进行过滤:

SELECT SHOP_ID, s.SHOP_NAME, COUNT(*) AS NUM
FROM SHOP s JOIN
     PRODUCT p
     USING (SHOP_ID)
WHERE p.COST BETWEEN 5 AND 20
GROUP BY SHOP_ID, SHOP_NAME
HAVING COUNT(*) >= 3;

大多数(但不是全部)数据库也允许您编写 HAVING NUM > 3。同样,将所有未聚合的列包含在 GROUP BY 中是一种很好的做法——除非您真的、真的知道自己在做什么。