了解 SQL:环境准备

为保障后续 SQL 学习的顺畅推进,将提前搭建一套标准化的学习环境。本套环境选用行业应用广泛、社区支持完善且对新手友好的 MySQL 5.7 版本。

环境搭建完成后,我们将围绕一个贴近实际业务的场景,设计并创建多张关联数据表,同时向表中插入足量的模拟业务数据。

通过构建这样一套包含真实业务逻辑的数据环境,能让后续的 SQL 查询、数据操作、多表关联等实践练习更具针对性和代入感,帮助你快速将理论知识转化为实操能力。

安装 MySQL

MySQL 是一款开源免费的关系型数据库管理系统(RDBMS),由瑞典 MySQL AB 公司最初开发,后被 Sun 公司收购,最终归入 Oracle 旗下。作为全球最流行的数据库之一,MySQL 凭借轻量、高效、易用的特性,成为中小规模应用、互联网项目的首选,也是 SQL 入门学习的标杆性数据库。

本教程将采用 MySQL5.7 版本,如何安装参考如下文章:

创建数据表&模拟数据

成功安装 MySQL 后,我们将创建名为 sql_demo 的数据库,然后在该数据库中创建四张表,分别为订单表(order)、订单商品表(order_product)、商品表(product)和用户表(user),如下图:

环境准备

其中,一个用户可以拥有多张订单,每个订单可以包含多个商品。它们的 ER 实体关系图如下:

环境准备

下面是数据库完整的 SQL 脚本:

-- 1. 创建用户表
CREATE TABLE `user` (
  `user_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户唯一ID',
  `name` VARCHAR(50) NOT NULL COMMENT '姓名',
  `gender` ENUM('男','女','未知') DEFAULT '未知' COMMENT '性别',
  `age` TINYINT UNSIGNED COMMENT '年龄',
  `phone` VARCHAR(20) UNIQUE COMMENT '手机号',
  `email` VARCHAR(100) UNIQUE COMMENT '邮箱',
  `address` VARCHAR(255) COMMENT '地址',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

-- 2. 创建商品表
CREATE TABLE `product` (
  `product_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商品唯一ID',
  `name` VARCHAR(100) NOT NULL COMMENT '商品名称',
  `price` DECIMAL(10,2) NOT NULL COMMENT '商品价格',
  `stock` INT UNSIGNED NOT NULL COMMENT '库存量',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

-- 3. 创建订单表
CREATE TABLE `order` (
  `order_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '订单唯一编号',
  `user_id` BIGINT UNSIGNED NOT NULL COMMENT '所属用户ID',
  `status` ENUM('待支付','已支付','已完成') NOT NULL COMMENT '订单状态',
  `total_amount` DECIMAL(10,2) NOT NULL COMMENT '总金额',
  `payment_method` ENUM('支付宝','微信','银行卡') NULL COMMENT '支付方式(未支付时为NULL)',
  `payment_time` DATETIME NULL COMMENT '支付时间(未支付时为NULL)',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`order_id`),
  KEY `idx_user_id` (`user_id`),
  CONSTRAINT `fk_order_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

-- 4. 创建订单商品表
CREATE TABLE `order_product` (
  `order_product_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '订单商品关联ID',
  `order_id` BIGINT UNSIGNED NOT NULL COMMENT '订单编号',
  `product_id` BIGINT UNSIGNED NOT NULL COMMENT '商品ID',
  `quantity` INT UNSIGNED NOT NULL COMMENT '商品数量',
  `product_price` DECIMAL(10,2) NOT NULL COMMENT '下单时商品价格',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`order_product_id`),
  UNIQUE KEY `uk_order_product` (`order_id`,`product_id`),
  KEY `idx_product_id` (`product_id`),
  CONSTRAINT `fk_order_product_order` FOREIGN KEY (`order_id`) REFERENCES `order` (`order_id`) ON DELETE CASCADE,
  CONSTRAINT `fk_order_product_product` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单商品表';

-- 1. 插入10个用户
INSERT INTO `user` (`name`, `gender`, `age`, `phone`, `email`, `address`, `create_time`) VALUES
('张三', '男', 25, '13800138000', 'zhangsan@example.com', '北京市朝阳区建国路88号', DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('李四', '女', 30, '13800138001', 'lisi@example.com', '上海市浦东新区张江路100号', DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('王五', '男', 28, '13800138002', 'wangwu@example.com', '广州市天河区天河路385号', DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('赵六', '女', 22, '13800138003', 'zhaoliu@example.com', '深圳市南山区科技园10号', DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('孙七', '男', 35, '13800138004', NULL, '杭州市西湖区西湖路58号', DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('周八', '女', 27, '13800138005', 'zhouba@example.com', '成都市武侯区武侯祠大街231号', DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('吴九', NULL, 32, '13800138006', 'wujiu@example.com', '重庆市渝中区解放碑路18号', DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('郑十', '女', 29, '13800138007', 'zhengshi@example.com', '武汉市武昌区中南路99号', DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('钱十一', '男', 24, '13800138008', 'qianshiyi@example.com', '西安市雁塔区雁塔路15号', DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('孙十二', '女', 31, '13800138009', NULL, '南京市玄武区玄武湖路78号', DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE));

-- 2. 插入10个商品
INSERT INTO `product` (`name`, `price`, `stock`, `create_time`) VALUES
('小米14手机', 4999.00, 1000, DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('华为Mate60 Pro', 6999.00, 800, DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('苹果iPhone 15', 7999.00, 1200, DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('vivo X100', 3999.00, 1500, DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('OPPO Find X7', 4499.00, 900, DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('荣耀Magic6', 4299.00, 1100, DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('红米K70', 2499.00, 2000, DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('一加12', 4599.00, 850, DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('真我GT Neo5', 2599.00, 1800, DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE)),
('三星S24 Ultra', 8999.00, 600, DATE_ADD('2025-01-01 00:00:00', INTERVAL FLOOR(RAND()*30*24*60) MINUTE));

-- 3. 插入20个订单(分配给前6个用户:1-6号用户)
INSERT INTO `order` (`user_id`, `status`, `total_amount`, `payment_method`, `payment_time`) VALUES
(1, '已完成', 4999.00, '支付宝', '2025-12-01 10:30:00'),
(1, '已支付', 11998.00, '微信', '2025-12-05 14:20:00'),
(1, '待支付', 2499.00, NULL, NULL),
(2, '已完成', 6999.00, '银行卡', '2025-12-02 09:15:00'),
(2, '已支付', 4499.00, '支付宝', '2025-12-06 11:40:00'),
(2, '待支付', 8999.00, NULL, NULL),
(3, '已完成', 3999.00, '微信', '2025-12-03 16:00:00'),
(3, '已完成', 4299.00, '银行卡', '2025-12-07 15:30:00'),
(3, '已支付', 7999.00, '支付宝', '2025-12-09 13:10:00'),
(3, '待支付', 4599.00, NULL, NULL),
(4, '已完成', 2599.00, '微信', '2025-12-04 18:25:00'),
(4, '已支付', 4999.00, '银行卡', '2025-12-08 10:05:00'),
(4, '待支付', 3999.00, NULL, NULL),
(5, '已完成', 6999.00, '支付宝', '2025-12-01 11:50:00'),
(5, '已完成', 2499.00, '微信', '2025-12-04 17:15:00'),
(5, '已支付', 8999.00, '银行卡', '2025-12-07 08:45:00'),
(5, '待支付', 4299.00, NULL, NULL),
(6, '已完成', 4499.00, '微信', '2025-12-02 14:55:00'),
(6, '已支付', 2599.00, '支付宝', '2025-12-08 16:20:00'),
(6, '待支付', 7999.00, NULL, NULL);

-- 4. 插入订单商品数据(每个订单至少1个商品,最多10个)
INSERT INTO `order_product` (`order_id`, `product_id`, `quantity`, `product_price`) VALUES
(1, 1, 1, 4999.00),
(2, 2, 1, 6999.00),
(2, 1, 1, 4999.00),
(3, 7, 1, 2499.00),
(4, 2, 1, 6999.00),
(5, 5, 1, 4499.00),
(6, 10, 1, 8999.00),
(7, 4, 1, 3999.00),
(8, 6, 1, 4299.00),
(9, 3, 1, 7999.00),
(10, 8, 1, 4599.00),
(11, 9, 1, 2599.00),
(12, 1, 1, 4999.00),
(13, 4, 1, 3999.00),
(14, 2, 1, 6999.00),
(15, 7, 1, 2499.00),
(16, 10, 1, 8999.00),
(17, 6, 1, 4299.00),
(18, 5, 1, 4499.00),
(19, 9, 1, 2599.00),
(20, 3, 1, 7999.00),
(20, 4, 2, 3999.00),
(20, 7, 1, 2499.00);

到这里环境准备完成,可以开始 SQL 学习了,是不是很期待。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号