【SQL】商品销售

目录

题目

分析

代码


题目

表: 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"
相关推荐
Java后端的Ai之路34 分钟前
Text-to-SQL与智能问数完全指南:基本概念、核心原理、Python实战教学及企业项目落地
数据库·python·sql·text-to-sql·智能问数
Elastic 中国社区官方博客34 分钟前
Prometheus Remote Write 在 Elasticsearch 中的摄取原理
大数据·数据库·elasticsearch·搜索引擎·信息可视化·全文检索·prometheus
2601_9498166837 分钟前
Spring boot启动原理及相关组件
数据库·spring boot·后端
2301_7826591838 分钟前
如何使用Navicat连接云端MariaDB_白名单与实例配置
jvm·数据库·python
2301_803875617 小时前
PHP 中处理会话数组时的类型错误解析与修复指南
jvm·数据库·python
m0_743623927 小时前
c++如何批量修改文件后缀名_std--filesystem--replace_extension【实战】
jvm·数据库·python
2501_914245938 小时前
CSS如何处理CSS变量作用域冲突_利用特定类名重写变量值
jvm·数据库·python
maqr_1109 小时前
MySQL数据库迁移到云端如何保障安全_数据加密与SSL连接配置
jvm·数据库·python
u0109147609 小时前
MySQL如何限制触发器递归调用的深度_防止触发器死循环方法
jvm·数据库·python
weixin_381288189 小时前
MySQL中如何使用HEX函数转换十六进制_MySQL进制转换函数
jvm·数据库·python