SQL作为关系型数据库的核心操作语言,在实际业务开发中应用非常广泛,下面通过一个电商订单管理的综合案例,完整演示SQL从建表到复杂查询的全流程操作。

案例背景说明
本次案例模拟一个小型电商平台的订单管理场景,需要存储用户信息、商品信息、订单信息以及订单商品明细信息,后续会基于这些表完成各类业务查询需求。
第一步:设计表结构并创建表
首先根据业务需求设计四张核心表,分别是用户表、商品表、订单表、订单商品关联表,每张表的字段设计如下:
| 表名 | 用途 | 核心字段 |
|---|---|---|
| user_info | 存储用户基础信息 | user_id(主键), user_name, phone, register_time |
| product_info | 存储商品基础信息 | product_id(主键), product_name, price, stock |
| order_info | 存储订单主信息 | order_id(主键), user_id, order_time, total_amount, order_status |
| order_product | 存储订单和商品的关联关系 | id(主键), order_id, product_id, buy_num, subtotal |
接下来编写建表SQL语句,这里以MySQL数据库为例:
-- 创建用户表 CREATE TABLE user_info ( user_id INT PRIMARY KEY AUTO_INCREMENT, user_name VARCHAR(50) NOT NULL, phone VARCHAR(20) UNIQUE NOT NULL, register_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 创建商品表 CREATE TABLE product_info ( product_id INT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT NOT NULL DEFAULT 0 ); -- 创建订单主表 CREATE TABLE order_info ( order_id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, order_time DATETIME DEFAULT CURRENT_TIMESTAMP, total_amount DECIMAL(10,2) NOT NULL, order_status TINYINT NOT NULL DEFAULT 1, FOREIGN KEY (user_id) REFERENCES user_info(user_id) ); -- 创建订单商品关联表 CREATE TABLE order_product ( id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL, product_id INT NOT NULL, buy_num INT NOT NULL, subtotal DECIMAL(10,2) NOT NULL, FOREIGN KEY (order_id) REFERENCES order_info(order_id), FOREIGN KEY (product_id) REFERENCES product_info(product_id) );
第二步:插入测试数据
表创建完成后,向四张表中插入测试数据,方便后续查询操作验证:
-- 插入用户数据
INSERT INTO user_info (user_name, phone) VALUES
('张三', '13800138001'),
('李四', '13800138002'),
('王五', '13800138003');
-- 插入商品数据
INSERT INTO product_info (product_name, price, stock) VALUES
('无线鼠标', 89.90, 100),
('机械键盘', 299.00, 50),
('笔记本电脑', 5999.00, 20);
-- 插入订单主表数据
INSERT INTO order_info (user_id, total_amount, order_status) VALUES
(1, 389.80, 1),
(2, 5999.00, 2),
(1, 299.00, 1);
-- 插入订单商品关联数据
INSERT INTO order_product (order_id, product_id, buy_num, subtotal) VALUES
(1, 1, 2, 179.80),
(1, 2, 1, 209.90),
(2, 3, 1, 5999.00),
(3, 2, 1, 299.00);
第三步:单表基础查询操作
先完成一些简单的单表查询需求,熟悉基础语法的使用:
需求1:查询所有库存大于30的商品信息
SELECT product_id, product_name, price, stock FROM product_info WHERE stock > 30;
需求2:查询注册时间在最近30天的用户
SELECT user_id, user_name, phone, register_time FROM user_info WHERE register_time >= DATE_SUB(NOW(), INTERVAL 30 DAY);
第四步:多表关联查询操作
实际业务中大部分查询都需要关联多张表,下面演示常见的关联查询场景:
需求1:查询每个订单对应的用户名称和订单总金额
这里需要关联order_info表和user_info表,通过user_id字段关联:
SELECT o.order_id, u.user_name, o.total_amount, o.order_time FROM order_info o JOIN user_info u ON o.user_id = u.user_id;
需求2:查询订单ID为1的所有商品名称和购买数量
需要关联order_product表和product_info表,通过product_id字段关联:
SELECT op.order_id, p.product_name, op.buy_num, op.subtotal FROM order_product op JOIN product_info p ON op.product_id = p.product_id WHERE op.order_id = 1;
第五步:聚合统计查询操作
聚合查询常用于业务统计场景,下面演示几个常见的统计需求:
需求1:统计每个用户的订单总金额
SELECT u.user_name, SUM(o.total_amount) AS total_spent FROM user_info u JOIN order_info o ON u.user_id = o.user_id GROUP BY u.user_id, u.user_name;
需求2:查询销量最高的前3个商品
需要关联order_product和product_info表,对购买数量求和后排序取前3:
SELECT p.product_name, SUM(op.buy_num) AS total_sold FROM order_product op JOIN product_info p ON op.product_id = p.product_id GROUP BY p.product_id, p.product_name ORDER BY total_sold DESC LIMIT 3;
注意事项说明
- 编写SQL时要注意表别名的使用,避免字段名冲突,尤其是多表关联场景
- 外键关联可以保证数据一致性,但高并发场景下部分业务会选择逻辑关联而非物理外键
- 聚合查询中如果使用
WHERE过滤分组前的数据,使用HAVING过滤分组后的结果 - 实际业务中查询语句要根据索引情况优化,避免全表扫描影响性能
以上案例覆盖了SQL最常用的操作场景,读者可以自行修改表结构和查询条件,尝试更多业务场景的SQL编写,加深对不同语法的理解。