完整的数据库实践题目:在线书店管理系统
数据库表结构及示例数据
- 书籍表(books)
CREATE TABLE books (
book_id INT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
author VARCHAR(50) NOT NULL,
publisher VARCHAR(50),
publish_year INT,
category VARCHAR(30),
price DECIMAL(10,2),
stock INT DEFAULT 0
);
INSERT INTO books VALUES
(1001, ‘三体’, ‘刘慈欣’, ‘重庆出版社’, 2008, ‘科幻’, 45.00, 50),
(1002, ‘活着’, ‘余华’, ‘作家出版社’, 2012, ‘文学’, 39.00, 30),
(1003, ‘平凡的世界’, ‘路遥’, ‘人民文学出版社’, 2005, ‘文学’, 89.00, 20),
(1004, ‘Python编程从入门到实践’, ‘Eric Matthes’, ‘人民邮电出版社’, 2020, ‘计算机’, 89.00, 100),
(1005, ‘人类简史’, ‘尤瓦尔·赫拉利’, ‘中信出版社’, 2017, ‘历史’, 68.00, 40),
(1006, ‘围城’, ‘钱钟书’, ‘人民文学出版社’, 1991, ‘文学’, 36.00, 25),
(1007, ‘算法导论’, ‘Thomas H.Cormen’, ‘机械工业出版社’, 2013, ‘计算机’, 128.00, 15),
(1008, ‘百年孤独’, ‘加西亚·马尔克斯’, ‘南海出版公司’, 2011, ‘文学’, 55.00, 35),
(1009, ‘时间简史’, ‘史蒂芬·霍金’, ‘湖南科技出版社’, 2010, ‘科普’, 45.00, 20),
(1010, ‘小王子’, ‘圣埃克苏佩里’, ‘人民文学出版社’, 2003, ‘童话’, 25.00, 60);
- 客户表(customers)
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
phone VARCHAR(20),
address VARCHAR(200),
register_date DATE
);
INSERT INTO customers VALUES
(2001, ‘张三’, ‘zhangsan@example.com’, ‘13800138001’, ‘北京市海淀区’, ‘2022-01-15’),
(2002, ‘李四’, ‘lisi@example.com’, ‘13800138002’, ‘上海市浦东新区’, ‘2022-03-10’),
(2003, ‘王五’, ‘wangwu@example.com’, ‘13800138003’, ‘广州市天河区’, ‘2022-05-20’),
(2004, ‘赵六’, ‘zhaoliu@example.com’, ‘13800138004’, ‘深圳市南山区’, ‘2022-07-05’),
(2005, ‘钱七’, ‘qianqi@example.com’, ‘13800138005’, ‘成都市武侯区’, ‘2022-09-18’);
- 订单表(orders)
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
total_amount DECIMAL(12,2),
status VARCHAR(20) CHECK(status IN (‘待付款’,‘已付款’,‘已发货’,‘已完成’,‘已取消’)),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
INSERT INTO orders VALUES
(3001, 2001, ‘2023-01-05’, 84.00, ‘已完成’),
(3002, 2002, ‘2023-01-12’, 133.00, ‘已发货’),
(3003, 2003, ‘2023-01-18’, 178.00, ‘已付款’),
(3004, 2001, ‘2023-02-03’, 45.00, ‘已完成’),
(3005, 2004, ‘2023-02-15’, 113.00, ‘已完成’),
(3006, 2005, ‘2023-03-01’, 89.00, ‘已取消’),
(3007, 2002, ‘2023-03-10’, 68.00, ‘已完成’),
(3008, 2003, ‘2023-03-20’, 164.00, ‘已发货’),
(3009, 2001, ‘2023-04-05’, 55.00, ‘已付款’),
(3010, 2005, ‘2023-04-18’, 25.00, ‘已完成’);
- 订单明细表(order_items)
CREATE TABLE order_items (
item_id INT PRIMARY KEY,
order_id INT,
book_id INT,
quantity INT,
price DECIMAL(10,2),
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (book_id) REFERENCES books(book_id)
);
INSERT INTO order_items VALUES
(4001, 3001, 1001, 1, 45.00),
(4002, 3001, 1006, 1, 36.00),
(4003, 3002, 1003, 1, 89.00),
(4004, 3002, 1010, 1, 25.00),
(4005, 3003, 1005, 2, 68.00),
(4006, 3003, 1009, 1, 45.00),
(4007, 3004, 1001, 1, 45.00),
(4008, 3005, 1004, 1, 89.00),
(4009, 3005, 1006, 1, 36.00),
(4010, 3006, 1003, 1, 89.00),
(4011, 3007, 1005, 1, 68.00),
(4012, 3008, 1008, 2, 55.00),
(4013, 3008, 1010, 1, 25.00),
(4014, 3009, 1008, 1, 55.00),
(4015, 3010, 1010, 1, 25.00);
十个业务问题及SQL查询
问题1:查询库存不足30本的书籍信息
SELECT book_id, title, author, price, stock
FROM books
WHERE stock < 30
ORDER BY stock;
问题2:统计每个图书类别的书籍数量和平均价格
SELECT category, COUNT(*) AS book_count,
ROUND(AVG(price),2) AS avg_price
FROM books
GROUP BY category
ORDER BY book_count DESC;
问题3:查询2023年第一季度(1-3月)的订单总金额
SELECT SUM(total_amount) AS q1_sales
FROM orders
WHERE order_date BETWEEN ‘2023-01-01’ AND ‘2023-03-31’;
问题4:找出购买金额最高的前3名客户
SELECT c.customer_id, c.name, SUM(o.total_amount) AS total_spent
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.name
ORDER BY total_spent DESC
LIMIT 3;
问题5:查询每本书的销售数量和销售总额
SELECT b.book_id, b.title,
SUM(oi.quantity) AS sales_quantity,
SUM(oi.quantity * oi.price) AS sales_amount
FROM books b
LEFT JOIN order_items oi ON b.book_id = oi.book_id
GROUP BY b.book_id, b.title
ORDER BY sales_amount DESC;
问题6:找出购买了"文学"类书籍的客户信息
SELECT DISTINCT c.customer_id, c.name, c.email
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN books b ON oi.book_id = b.book_id
WHERE b.category = ‘文学’;
问题7:计算每个月的订单数量和销售总额
SELECT DATE_FORMAT(order_date, ‘%Y-%m’) AS month,
COUNT(*) AS order_count,
SUM(total_amount) AS monthly_sales
FROM orders
GROUP BY DATE_FORMAT(order_date, ‘%Y-%m’)
ORDER BY month;
问题8:查询购买了超过1本书的订单详情
SELECT o.order_id, o.order_date, c.name,
SUM(oi.quantity) AS total_books,
o.total_amount
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
GROUP BY o.order_id, o.order_date, c.name, o.total_amount
HAVING SUM(oi.quantity) > 1
ORDER BY total_books DESC;
问题9:找出最受欢迎的图书(按销售数量排名)
SELECT b.book_id, b.title, b.author,
SUM(oi.quantity) AS total_sold
FROM books b
JOIN order_items oi ON b.book_id = oi.book_id
GROUP BY b.book_id, b.title, b.author
ORDER BY total_sold DESC
LIMIT 5;
问题10:查询客户购买历史(包含客户信息和购买的所有书籍)
SELECT c.customer_id, c.name,
GROUP_CONCAT(b.title SEPARATOR ', ') AS purchased_books,
COUNT(DISTINCT o.order_id) AS order_count,
SUM(o.total_amount) AS total_spent
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN books b ON oi.book_id = b.book_id
GROUP BY c.customer_id, c.name
ORDER BY total_spent DESC;
这个完整的在线书店管理系统题目包含了:
-
完整的四张表结构设计
-
每张表的示例数据
-
十个从简单到复杂的业务问题
-
每个问题对应的SQL查询解决方案
-
涵盖了SELECT查询、聚合函数、多表连接、分组统计、排序等常见SQL操作
学生可以通过这个完整的案例练习各种SQL查询技巧,理解数据库在实际业务中的应用。