目录
题目
分析
代码
题目
表: Product
+--------------+---------+ | Column Name | Type | +--------------+---------+ | product_id | int | | product_name | varchar | | unit_price | int | +--------------+---------+ product_id 是该表的主键(具有唯一值的列)。 该表的每一行显示每个产品的名称和价格。
表:Sales
+-------------+---------+ | Column Name | Type | +-------------+---------+ | seller_id | int | | product_id | int | | buyer_id | int | | sale_date | date | | quantity | int | | price | int | +------ ------+---------+ 这个表可能有重复的行。 product_id 是 Product 表的外键(reference 列)。 该表的每一行包含关于一个销售的一些信息。
编写解决方案,报告 2019年春季
才售出的产品。即 仅 在 2019-01-01
(含)至 2019-03-31
(含)之间出售的商品。
以 任意顺序 返回结果表。
结果格式如下所示。
示例 1:
输入:
Product table:
+------------+--------------+------------+
| 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 |
+-----------+------------+----------+------------+----------+-------+
输出:
+-------------+--------------+
| product_id | product_name |
+-------------+--------------+
| 1 | S8 |
+-------------+--------------+
解释:
id 为 1 的产品仅在 2019 年春季销售。
id 为 2 的产品在 2019 年春季销售,但也在 2019 年春季之后销售。
id 为 3 的产品在 2019 年春季之后销售。
我们只返回 id 为 1 的产品,因为它是 2019 年春季才销售的产品。
分析
两个表,产品表和销售表
输出包括product_id和product_name,需要连接两表,
from Sales s, Product p where s.product_id = p.product_id
这里也可以直接使用自然连接natural join,需要注意自然连接的局限性,
from Sales s natural join Product p
报告 2019年春季 才售出的产品
报告产品,同一产品可能在销售表中有不同销售情况,组合起来,group by product_id
仅在2019-01-01 (含)至 2019-03-31 (含)之间出售的商品。
限制条件为“仅”和时间段内出售,having min(sale_date)>="2019-01-01" and max(sale_date)<="2019-03-31"
单独使用between不可行,原因在于同一产品可以分段、分期、分价格销售。
补充:natural join。
在执行natural join时,SQL 会自动查找两个表中名称相同的列,并使用这些列作为连接条件。需要注意:
- 列名冲突:若两张表中存在多个同名列,natural join会基于所有这些列进行连接,可能导致意外结果。
- 性能问题:由于natural join自动查找同名列,因此它会比显式指定连接条件的连接操作更慢一些。
- 可读性明确性:使用natural join可能降低查询的可读性和明确性,尤其是需要进行多列连接的情况。
代码
select s.product_id, p.product_name
from Sales s, Product p
where s.product_id = p.product_id
-- from Sales s natural join Product p
group by product_id
having min(sale_date)>="2019-01-01" and max(sale_date)<="2019-03-31"