面试的时候被面试官一道SQL题给难住了

背景是这样的,有一个朋友去面试,被面试官出的题难到了,然后根据好友的描述总结了一篇文章,希望大家面试的时候不再踩坑

建表语句和模拟数据

books 表

建表语句

CREATE TABLE books (  
    book_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '书籍ID',  
    title VARCHAR(255) NOT NULL COMMENT '书籍标题',  
    author VARCHAR(255) NOT NULL COMMENT '作者',  
    genre VARCHAR(50) NOT NULL COMMENT '书籍类型',  
    price DECIMAL(10, 2) NOT NULL COMMENT '书籍价格',  
    publish_date DATE NOT NULL COMMENT '出版日期',  
    stock_quantity INT NOT NULL COMMENT '库存数量'  
) COMMENT='书籍信息表';  

模拟数据

-- 模拟数据  
INSERT INTO books (title, author, genre, price, publish_date, stock_quantity) VALUES  
('The Great Gatsby', 'F. Scott Fitzgerald', 'Fiction', 19.99, '1925-04-10', 100),  
('1984', 'George Orwell', 'Dystopian', 9.99, '1949-06-08', 50),  
('To Kill a Mockingbird', 'Harper Lee', 'Fiction', 14.99, '1960-07-11', 75),  
('Brave New World', 'Aldous Huxley', 'Science Fiction', 12.99, '1932-05-14', 80),  
('Moby Dick', 'Herman Melville', 'Fiction', 16.99, '1851-11-14', 60),  
('Pride and Prejudice', 'Jane Austen', 'Romance', 11.99, '1813-01-28', 90),  
('War and Peace', 'Leo Tolstoy', 'Historical Fiction', 24.99, '1869-01-01', 40),  
('The Catcher in the Rye', 'J.D. Salinger', 'Fiction', 13.99, '1951-07-16', 120);

sales 表

建表语句

CREATE TABLE sales (  
    sale_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '销售ID',  
    book_id INT NOT NULL COMMENT '书籍ID(外键)',  
    quantity INT NOT NULL COMMENT '销售数量',  
    sale_date DATE NOT NULL COMMENT '销售日期',  
    customer_id INT NOT NULL COMMENT '客户ID',  
    FOREIGN KEY (book_id) REFERENCES books(book_id)  
) COMMENT='销售记录表'; 

模拟数据

-- 模拟数据  
INSERT INTO sales (book_id, quantity, sale_date, customer_id) VALUES  
(1, 2, '2023-01-01', 101),  
(2, 1, '2023-01-02', 102),  
(3, 3, '2023-01-03', 103),  
(1, 1, '2023-01-04', 104),  
(4, 2, '2023-01-05', 105),  
(2, 5, '2023-01-06', 101),  
(3, 1, '2023-01-07', 106),  
(5, 3, '2023-01-08', 102),  
(6, 2, '2023-01-09', 107),  
(7, 4, '2023-01-10', 108),  
(8, 1, '2023-01-11', 109),  
(1, 2, '2023-01-12', 110),  
(4, 1, '2023-01-13', 101),  
(2, 3, '2023-01-14', 102),  
(6, 1, '2023-01-15', 111);

要求1

查找销售数量最多的书籍的标题、作者和销售数量。

分析要求

题目分析:
我们先分析一下面试官给的要求

  1. 首先,我们需要对sales表进行分组,按book_id计算总销售数量。
  2. 然后,我们需要将上一步的结果与books表连接,以获取书籍的标题和作者。
  3. 最后,我们需要对上一步的结果按销售数量降序排序,并只返回销售数量最多的书籍。

答案SQL

-- 计算每本书的总销售数量  
WITH book_sales AS (  
    SELECT  
        book_id,  
        SUM(quantity) AS total_quantity  
    FROM  
        sales  
    GROUP BY  
        book_id  
),  
-- 找到销售数量最多的书籍ID  
max_sales_book AS (  
    SELECT  
        book_id  
    FROM  
        book_sales  
    ORDER BY  
        total_quantity DESC  
    LIMIT 1  
)  
-- 获取书籍的详细信息  
SELECT  
    b.title,  
    b.author,  
    bs.total_quantity  
FROM  
    books b  
JOIN  
    book_sales bs ON b.book_id = bs.book_id  
JOIN  
    max_sales_book msb ON b.book_id = msb.book_id;  

分析答案

  1. book_sales CTE计算了每本书的总销售数量。
  2. max_sales_book CTE找到了销售数量最多的书籍ID。
  3. 最后的SELECT语句将上述两个CTE与books表连接,并返回了所需的信息。

查询结果

titleauthortotal_quantity
1984George Orwell9

要求2

查找每个作者销售总额最高的书籍的标题、作者和销售总额。如果有多个书籍销售总额相同且最高,则只需返回其中一个。

分析要求

我们还是先分析一下给出的要求

  1. 首先,我们需要对sales表和books表进行连接,并按作者和书籍ID分组,计算每本书的销售总额。
  2. 然后,我们需要对每个作者的销售总额进行排名,只保留排名最高的书籍(如果有多个书籍销售总额相同,则只保留一个)。
  3. 最后,我们返回书籍的标题、作者和销售总额。

答案SQL

-- 计算每本书的销售总额  
WITH book_author_sales AS (  
    SELECT  
        b.author,  
        b.title,  
        SUM(s.quantity * b.price) AS total_sales  
    FROM  
        books b  
    JOIN  
        sales s ON b.book_id = s.book_id  
    GROUP BY  
        b.author, b.title  
),  
-- 对每个作者的销售总额进行排名  
ranked_book_author_sales AS (  
    SELECT  
        *,  
        RANK() OVER (PARTITION BY author ORDER BY total_sales DESC) AS sales_rank  
    FROM  
        book_author_sales  
)  
-- 返回排名最高的书籍  
SELECT  
    author,  
    title,  
    total_sales  
FROM  
    ranked_book_author_sales  
WHERE  
    sales_rank = 1;  

分析答案

  1. book_author_sales CTE计算了每本书的销售总额。
  2. ranked_book_author_sales CTE对每个作者的销售总额进行了排名。
  3. 最后的SELECT语句返回了排名最高的书籍的标题、作者和销售总额。

结果

authortitletotal_sales
Aldous HuxleyBrave New World38.97
F. Scott FitzgeraldThe Great Gatsby99.95
George Orwell198489.91
Harper LeeTo Kill a Mockingbird59.96
Herman MelvilleMoby Dick50.97
J.D. SalingerThe Catcher in the Rye13.99
Jane AustenPride and Prejudice35.97
Leo TolstoyWar and Peace99.96

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长风清留扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值