MST

星途 面试题库

面试题:MySQL中等难度:复杂与简单查询的场景区分

在一个电商数据库中,有商品表(products)包含字段商品ID(product_id)、商品名称(product_name)、价格(price)、库存(stock),订单表(orders)包含订单ID(order_id)、商品ID(product_id)、下单数量(quantity)、下单时间(order_time)。现在要统计每个月销量最高的商品名称及其销量。请分别阐述简单查询和复杂查询在解决此问题上的思路,并写出复杂查询的SQL语句。
47.9万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

简单查询思路

  1. 首先通过 orders 表和 products 表根据 product_id 进行连接,计算出每个商品的总销量。
  2. 对计算出的销量按月份分组,找出每个月销量最高的商品。这可能需要先将 order_time 提取出月份信息,然后通过临时表或者子查询来逐步实现。

复杂查询思路

  1. 通过 orders 表和 products 表连接,计算每个商品每个月的销量。
  2. 使用窗口函数,按月份分区,对每个月内的商品销量进行排序,找到每个月销量排名第一的商品。

复杂查询的SQL语句

WITH monthly_sales AS (
    SELECT
        p.product_name,
        SUM(o.quantity) AS total_sales,
        EXTRACT(MONTH FROM o.order_time) AS sale_month
    FROM
        products p
    JOIN
        orders o ON p.product_id = o.product_id
    GROUP BY
        p.product_name, EXTRACT(MONTH FROM o.order_time)
)
SELECT
    sale_month,
    product_name,
    total_sales
FROM (
    SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY sale_month ORDER BY total_sales DESC) AS rn
    FROM
        monthly_sales
) ranked_sales
WHERE
    rn = 1;