数据库入门教程:以商品订单系统为例
一、前言
数据库是现代软件开发中不可或缺的基础,掌握数据库的基本概念和操作,是每个开发者的必经之路。本文将以“商品-品牌-客户-订单-订单项”为例,带你快速入门数据库的核心知识和基本操作。
二、数据库基础知识回顾
1. 主键(Primary Key, PK)
主键是表中用来唯一标识一条记录的一列或多列的组合。主键分为业务主键(如身份证号、手机号等有实际业务意义的字段)和代理主键(如自增ID)。
2. 外键(Foreign Key, FK)
外键用于连接两张表,是引用另一张表的主键或唯一键,用于保证数据的完整性和关联性。
3. 关系范式
- 1NF(第一范式):每一列的值都是不可再分的原子值。
- 2NF(第二范式):表中的每个非主属性都完全依赖于主键。
- 3NF(第三范式):非主属性之间不能有传递依赖。
范式的意义:消除冗余、保证数据完整性和一致性。
三、SQL 语言分类
- DDL(数据定义语言):用于定义和管理数据库对象(如表、视图、索引等)。
CREATE
:创建ALTER
:修改DROP
:删除TRUNCATE
:清空GRANT
:授权
- DML(数据操作语言):用于对数据进行增删改查(CRUD)。
INSERT
:插入SELECT
:查询UPDATE
:更新DELETE
:删除
- TCL(事务控制语言):用于管理事务。
四、常用数据类型
- 数值类型:
bit
、tinyint
、smallint
、int
、bigint
、decimal
、double
- 文本类型:
CHAR
、VARCHAR
、TEXT
、BLOB
、ENUM
、SET
- 日期时间类型:
DATE
、TIME
、DATETIME
、TIMESTAMP
、YEAR
- JSON类型:用于存储结构化数据(如数组、对象)
五、实战:商品订单系统表设计
1. 创建数据库
CREATE DATABASE shopdb;
USE shopdb;
2. 创建表结构
(1)品牌表
CREATE TABLE brand (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(32) NOT NULL
);
(2)商品表
CREATE TABLE product (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(64) NOT NULL,price DECIMAL(10,2) NOT NULL,brand_id INT,FOREIGN KEY (brand_id) REFERENCES brand(id)
);
(3)客户表
CREATE TABLE customer (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(32) NOT NULL,tel CHAR(11),birthday DATE
);
(4)订单表
CREATE TABLE orders (id INT PRIMARY KEY AUTO_INCREMENT,customer_id INT,order_date DATETIME DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (customer_id) REFERENCES customer(id)
);
(5)订单项表
CREATE TABLE order_item (id INT PRIMARY KEY AUTO_INCREMENT,order_id INT,product_id INT,quantity INT NOT NULL,FOREIGN KEY (order_id) REFERENCES orders(id),FOREIGN KEY (product_id) REFERENCES product(id)
);
3. 插入数据示例
-- 插入品牌
INSERT INTO brand(name) VALUES ('华为'), ('苹果');-- 插入商品
INSERT INTO product(name, price, brand_id) VALUES ('Mate60', 4999.00, 1), ('iPhone15', 6999.00, 2);-- 插入客户
INSERT INTO customer(name, tel, birthday) VALUES ('张三', '13800000001', '1990-01-01'), ('李四', '13800000002', '1992-02-02');-- 插入订单
INSERT INTO orders(customer_id) VALUES (1), (2);-- 插入订单项
INSERT INTO order_item(order_id, product_id, quantity) VALUES (1, 1, 2), (1, 2, 1), (2, 2, 3);
4. 查询数据示例
-- 查询所有订单及其客户信息
SELECT o.id AS 订单号, c.name AS 客户名, o.order_date
FROM orders o
JOIN customer c ON o.customer_id = c.id;-- 查询某订单的商品明细
SELECT oi.order_id, p.name AS 商品名, oi.quantity, p.price
FROM order_item oi
JOIN product p ON oi.product_id = p.id
WHERE oi.order_id = 1;