WHERE子句中的SQL约束?

WHERE子句中的SQL约束?,sql,group-by,having,Sql,Group By,Having,我想选择所有的商店,至少有三种产品在他们的报价中,价格在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和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。好像中间没有任何部分,我不明白为什么会这样。

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

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;

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

rdbms
之间是什么?