Where vs Having - 为什么我在设置日期条件时得到不同的结果? (Mysql)

Where vs Having - Why do I get different results when setting date conditions? (Mysql)

当我在代码的 'WHERE' 部分和 'HAVING' 部分设置日期条件时,我试图了解 MySql 如何以不同方式处理日期条件。您能帮我理解以下情况在逻辑上有什么区别吗?为什么我使用 HAVING 应用日期条件时只得到一个产品,但如果我使用 WHERE 却得到两个?

问题:编写一个 SQL 查询,报告仅在 spring 2019 年销售的产品。也就是说,在 2019-01-01 和 2019-03-31 之间(含)。

+------------+--------------+------------+
| product_id | product_name | unit_price |
+------------+--------------+------------+
| 1          | S8           | 1000       |
| 2          | G4           | 800        |
| 3          | iPhone       | 1400       |
+------------+--------------+------------+

Sales table:
+-----------+------------+----------+------------+----------+-------+
| seller_id | product_id | buyer_id | sale_date  | quantity | price |
+-----------+------------+----------+------------+----------+-------+
| 1         | 1          | 1        | 2019-01-21 | 2        | 2000  |
| 1         | 2          | 2        | 2019-02-17 | 1        | 800   |
| 2         | 2          | 3        | 2019-06-02 | 1        | 800   |
| 3         | 3          | 4        | 2019-05-13 | 2        | 2800  |
+-----------+------------+----------+------------+----------+-------+
  1. HAVING OPTION(正确的)

    FROM Sales s 
    JOIN Product p 
    ON s.product_id = p.product_id
    GROUP by s.product_id
    HAVING min(sale_date)>='2019-01-01' AND max(sale_date)<='2019-03-31'
    
    
  2. 有结果 {"headers": ["product_id", "product_name"], "值": [[1, "S8"]]}

  3. 哪里有选项

    FROM Sales s 
    JOIN Product p 
    ON s.product_id = p.product_id
    WHERE sale_date BETWEEN '2019-01-01' AND '2019-03-31'
    GROUP by s.product_id
    
    
    
  4. 结果在哪里 {"headers": ["product_id", "product_name"], "值": [[1, "S8"], [2, "G4 "]]}

那个2,G4是哪里来的? (如果这是微不足道的,请提前道歉,我真的在努力自学,我没有人可以问)

WHERE 正在筛选行以仅考虑 1 月、2 月和 3 月的销售额。因此,任何在此期间有销售的产品都包括在内。

另一方面,HAVING 正在考虑产品的 all 销售额。然后对于每个产品,它正在查看最小和最大日期。仅包括在 1 月、2 月和 3 月有 全部 销售额的产品。

考虑product_id = 2。它在 2 月份有促销活动,因此它会包含在 WHERE 子句中。但是,它在 6 月也有促销活动。所以最大日期是 Jun -- HAVING 子句将其过滤掉。