SQL力扣练习(七)
发布人:shili8
发布时间:2025-02-23 20:30
阅读次数:0
**SQL力扣练习(七)**
### 一、表结构定义在本题中,我们将使用以下四个表:
| 表名 | 字段 |
| --- | --- |
| `Users` | id(int), name(varchar), age(int) |
| `Orders` | id(int), user_id(int), order_date(date), total_price(float) |
| `OrderItems` | id(int), order_id(int), product_id(int), quantity(int) |
| `Products` | id(int), name(varchar), price(float) |
### 二、问题一:获取用户的订单总数**问题描述**
为每个用户计算其订单总数。
**SQL代码**
sqlSELECT u.id, COUNT(o.id) AS order_countFROM Users uLEFT JOIN Orders o ON u.id = o.user_idGROUP BY u.id;
**注释**
* 我们使用 `LEFT JOIN` 来连接 `Users` 和 `Orders` 表,确保每个用户都有一个订单总数。
* `COUNT(o.id)` 计算每个用户的订单总数。
### 三、问题二:获取最近一年的订单总额**问题描述**
为每个用户计算其最近一年内的订单总额。
**SQL代码**
sqlSELECT u.name, SUM(oi.quantity * p.price) AS total_amountFROM Users uJOIN Orders o ON u.id = o.user_idJOIN OrderItems oi ON o.id = oi.order_idJOIN Products p ON oi.product_id = p.idWHERE o.order_date >= DATE_SUB(CURDATE(), INTERVAL1 YEAR) GROUP BY u.name;
**注释**
* 我们使用 `JOIN` 来连接四个表,计算每个用户的订单总额。
* `SUM(oi.quantity * p.price)` 计算每个用户的订单总额。
* `WHERE o.order_date >= DATE_SUB(CURDATE(), INTERVAL1 YEAR)` 过滤最近一年内的订单。
### 四、问题三:获取最常购买的产品**问题描述**
为每个用户计算其最常购买的产品。
**SQL代码**
sqlSELECT u.name, p.name AS product_name, COUNT(oi.id) AS purchase_countFROM Users uJOIN Orders o ON u.id = o.user_idJOIN OrderItems oi ON o.id = oi.order_idJOIN Products p ON oi.product_id = p.idGROUP BY u.name, p.nameORDER BY purchase_count DESC;
**注释**
* 我们使用 `JOIN` 来连接四个表,计算每个用户的最常购买产品。
* `COUNT(oi.id)` 计算每个用户对某个产品的购买次数。
* `GROUP BY u.name, p.name` 分组每个用户和产品。
* `ORDER BY purchase_count DESC` 排序结果按购买次数降序。
### 五、问题四:获取总订单数**问题描述**
计算所有用户的总订单数。
**SQL代码**
sqlSELECT COUNT(o.id) AS total_order_countFROM Orders o;
**注释**
* 我们使用 `COUNT` 函数计算所有用户的总订单数。
### 六、问题五:获取最近一年的订单总额**问题描述**
为每个产品计算其最近一年内的订单总额。
**SQL代码**
sqlSELECT p.name, SUM(oi.quantity * p.price) AS total_amountFROM Products pJOIN OrderItems oi ON p.id = oi.product_idWHERE oi.order_date >= DATE_SUB(CURDATE(), INTERVAL1 YEAR) GROUP BY p.name;
**注释**
* 我们使用 `JOIN` 来连接两个表,计算每个产品的订单总额。
* `SUM(oi.quantity * p.price)` 计算每个产品的订单总额。
* `WHERE oi.order_date >= DATE_SUB(CURDATE(), INTERVAL1 YEAR)` 过滤最近一年内的订单。
以上是本题中五个问题的解决方案。