文章目录
- 一、题目
- 二、思路分析
- 三、SQL代码
一、题目
二、思路分析
首先,需要找到满足2019年第一季度的对应信息,所以要用到where或者having,但是这两个不一样:
- where约束声明,where不能使用聚合函数,where是在结果返回之前起作用的;
- having是一个过滤声明,在查询返回结果集后,对查询结果进行的过滤操作;并且在having中可以使用聚合函数(常见的聚合函数,如COUNT、SUM、AVG、MIN、MAX等,这题就可以同时使用
MAX
和MIN
选定满足题目要求的时间范围)。 - 用GROUP BY分组后可以用HAVING取出想要的组。SQL在使用 HAVING 子句时 SELECT 语句的顺序为:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。
- 注意:其中SELECT的执行顺序在 GROUP BY 子句之后,ORDER BY 子句之前。也就是说,当在ORDER BY中使用别名时,已经知道了SELECT设置的别名存在,但是在GROUP BY中使用别名时还不知道别名的存在,所以不能在ORDER BY中可以使用别名,但是在GROUP BY中不能使用别名。
所以就是标量子查询,按照题目要求,分组后通过HAVING
选定范围得到product_id
。
三、SQL代码
# Write your MySQL query statement below
SELECT product_id, product_name
FROM product
WHERE product_id in(
SELECT product_id
FROM sales
GROUP BY product_id
HAVING max(sale_date) <= '2019-03-31'
and min(sale_date) >= '2019-01-01'
) # 找到满足条件的所有product_id
当然也可以先直接inner join内联结后直接和刚才一样的一顿操作(分组后HAVING):
# Write your MySQL query statement below
SELECT Product.product_id, product_name
FROM Product
INNER JOIN Sales
WHERE Product.product_id = Sales.product_id
GROUP BY Product.product_id
HAVING max(Sales.sale_date) <= '2019-03-31' and min(Sales.sale_date) >= '2019-01-01';