
★hello,大家好,我是程序员黎明 ,本期我们将学习数据库MySQL的操作,当学完基本的指令后,我将以电商系统的数据库设计为例,和大家深入探讨各个知识点,并结合实际操作中的经验与技巧,帮助你更好地理解并应用MySQL。
1. MySQL 是什么?
MySQL 是一种开源的关系型数据库管理系统。它的主要功能是用来存储、管理和查询结构化数据。比如,你运营一个在线商城,用户的账户信息、订单详情、产品列表等都可以保存在 MySQL 中。
案例:假设你要创建一个保存顾客信息的数据库。通过 MySQL,我们可以轻松创建并管理表格,保存用户的信息,如姓名、地址和订单等。
CREATE DATABASE my_shop;
USE my_shop;
CREATE TABLE customers (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100),
address VARCHAR(255)
);
这里我们创建了一个新的数据库,并在其中创建一个顾客表,记录顾客的信息。
2. 数据库和表
数据库是一个大的容器,里面包含很多表,表则是具体数据的载体。每个表可以理解为一个结构化的二维表格。行是数据记录,列是记录的属性。
案例:比如你有一个 orders 表记录用户的订单信息,里面可能包括订单号、顾客 ID、产品名称和购买时间。
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
product_name VARCHAR(100),
order_date DATE
);
每当有新的订单产生时,系统会往 orders 表中插入一行新的记录。
3. 常用 SQL 语句
SQL 是 MySQL 数据库的操作语言,掌握基本的增删改查语句能应对大多数需求。
1) 查询数据(SELECT)
查询是最常用的操作之一。比如,想要查询 customers 表里所有顾客的名字和邮箱,可以使用 SELECT 语句。
案例:
SELECT name, email FROM customers;
结果会返回所有顾客的名字和邮箱。想要筛选特定条件的顾客,比如年龄大于 30 的顾客,可以使用 WHERE 进行条件筛选:
SELECT name, email FROM customers WHERE age > 30;
2) 插入数据(INSERT)
插入数据意味着往表里添加一条新的记录。
案例:新增一位顾客:
INSERT INTO customers (name, email, address) VALUES ('李雷', 'lilei@example.com', '北京市朝阳区');
3) 更新数据(UPDATE)
更新数据是修改现有的记录,比如更新顾客的地址。
案例:
UPDATE customers SET address = '北京市海淀区' WHERE name = '李雷';
4) 删除数据(DELETE)
删除数据是移除表中的某些记录。
案例:
DELETE FROM customers WHERE name = '李雷';
这会将所有名字为李雷的顾客记录删除。
4. 数据类型
MySQL 支持多种数据类型,每个列的数据类型需要提前定义。常见的类型包括:
-
INT:整数; -
VARCHAR:可变长度的字符串; -
DATE:日期; -
DECIMAL:精确的小数,适用于存储价格等数据。
案例:在设计一个电子商务系统时,订单中的金额应该使用 DECIMAL 类型来保证金额的精度。
CREATE TABLE payments (
payment_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT,
amount DECIMAL(10, 2),
payment_date DATE
);
amount 使用 DECIMAL(10, 2) 表示最多10位数字,且保留两位小数,适合用于价格、金额等字段。
5. 主键(Primary Key)
主键是用来唯一标识表中每一行数据的。例如顾客表中的 id 字段可以作为主键。主键不能重复且不能为空。
案例:假设你有一个 products 表,用主键来唯一标识每件商品。
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(100),
price DECIMAL(10, 2)
);
这里 product_id 就是唯一标识商品的主键。
6. 外键(Foreign Key)
外键是用来建立表与表之间的关系,比如订单表中的顾客 ID 可以作为外键,关联顾客表中的主键。
案例:订单表中的 customer_id 是外键,关联 customers 表中的 id。
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id),
order_date DATE
);
通过外键,orders 表里的 customer_id 必须与 customers 表中的 id 相匹配,确保订单和顾客之间的关联关系。
7. 索引(Index)
索引是为了加速查询的工具,尤其当表中有大量数据时,使用索引可以大幅提升查询效率。
案例:假设你经常按 product_name 查询商品,可以为 product_name 创建索引:
CREATE INDEX idx_product_name ON products(product_name);
这会让 MySQL 更快找到匹配的商品。
8. 事务(Transaction)
事务保证一组操作要么全部成功,要么全部失败,保证了数据的一致性。事务常用于金融系统、订单系统等需要多步操作的场景。
案例:在银行转账时,首先从一个账户扣款,然后再给另一个账户加款。为了确保操作的一致性,我们可以用事务来处理:
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 500 WHERE account_id = 2;
COMMIT;
如果其中任何一步失败,事务会回滚:
ROLLBACK;
9. 视图(View)
视图是虚拟的表,是从一个或多个表中查询数据的结果。视图可以简化复杂查询。
案例:如果你经常查询 VIP 顾客,可以创建一个视图。
CREATE VIEW vip_customers AS
SELECT name, email FROM customers WHERE total_spent > 10000;
这样每次查询 VIP 顾客时就直接查询视图:
SELECT * FROM vip_customers;
10. 备份与恢复
为了防止数据丢失,定期备份数据库非常重要。
案例:备份 my_shop 数据库:
mysqldump -u root -p my_shop > my_shop_backup.sql
恢复数据时可以这样操作:
mysql -u root -p my_shop < my_shop_backup.sql
11. 用户权限管理
MySQL 允许给不同的用户设置不同的权限,确保安全性。
案例:为 newuser 用户赋予对 my_shop 数据库的全部权限:
GRANT ALL PRIVILEGES ON my_shop.* TO 'newuser'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
12. 怎么优化 MySQL 性能
优化 MySQL 可以通过使用索引、合理的表结构设计、以及数据库的分库分表等手段。
案例:
-
使用索引:为查询频繁的列创建索引; -
读写分离:通过主从数据库,分开处理读取和写入操作,提升系统性能。
13. 存储引擎
MySQL 支持多种存储引擎,不同引擎在性能、事务支持等方面有所不同。
案例:在需要事务支持的情况下,可以选择 InnoDB 引擎:
CREATE TABLE transactions (
id INT PRIMARY KEY AUTO_INCREMENT,
amount DECIMAL(10, 2),
transaction_date DATE
) ENGINE=InnoDB;
★学完上面的指令操作后,接下来我们来设计一个较为综合的 MySQL 练习,它会涵盖数据库设计、表操作、数据查询、事务管理等多个知识点。 通过这套练习,相信你们不仅可以掌握 MySQL 的基本操作,还可以学会在实际项目中如何设计高效的数据库。
综合练习:设计一个电商系统的数据库
需求说明:
设计一个简单的电商系统数据库,支持用户、产品、订单三种主要数据。用户可以浏览产品、下订单,每个订单包含一个或多个产品。我们需要考虑用户数据的存储、产品的分类管理、订单的记录和相关的事务处理。
实现步骤:
-
创建数据库 -
设计用户表、产品表、订单表和订单详情表 -
插入测试数据 -
查询操作 -
使用事务处理订单的创建
第一步:创建数据库
首先,我们需要为电商系统创建一个新的数据库。
CREATE DATABASE ecommerce_db;
USE ecommerce_db;
解释:CREATE DATABASE 用来创建数据库,USE 则是选择并切换到该数据库。在创建数据库时,需要为数据库命名,这里命名为 ecommerce_db,表示电商系统的数据库。
第二步:设计表结构
1. 创建用户表 users
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
解释:
-
user_id: 自增的主键,唯一标识每个用户。 -
username: 用户名,最长 50 个字符,不能为空。 -
email: 邮箱,设置了唯一约束,确保每个邮箱只绑定一个账户。 -
password: 密码,长度为 255,通常用来存储哈希后的密码。 -
created_at: 用户注册时间,默认设置为当前时间。
2. 创建产品表 products
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(100) NOT NULL,
category VARCHAR(50),
price DECIMAL(10, 2) NOT NULL,
stock INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
解释:
-
product_id: 自增的主键,标识每个产品。 -
product_name: 产品名称,最长 100 个字符。 -
category: 产品分类,例如“电子产品”、“服装”等。 -
price: 产品价格,DECIMAL(10, 2)确保了价格的精确性,特别适合存储金钱。 -
stock: 库存数量,必须是整数。 -
created_at: 产品的上架时间。
3. 创建订单表 orders
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
order_total DECIMAL(10, 2) NOT NULL,
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status VARCHAR(20) DEFAULT 'pending',
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
解释:
-
order_id: 自增的主键,唯一标识每个订单。 -
user_id: 用户 ID,外键关联users表,表明该订单属于哪个用户。 -
order_total: 订单总金额。 -
order_date: 订单日期,默认为创建时的时间。 -
status: 订单状态,例如pending(待处理)、shipped(已发货)等。 -
FOREIGN KEY (user_id): 外键约束,确保每个订单都有合法的用户 ID。
4. 创建订单详情表 order_items
CREATE TABLE order_items (
order_item_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT,
product_id INT,
quantity INT NOT NULL,
price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
解释:
-
order_item_id: 自增的主键,标识每个订单详情。 -
order_id: 订单 ID,外键关联orders表,指明这条订单详情属于哪个订单。 -
product_id: 产品 ID,外键关联products表,指明订单中的产品。 -
quantity: 购买的产品数量。 -
price: 产品的价格(注意,产品价格可能会变动,所以这里记录订单时的价格)。
第三步:插入测试数据
为了进行后续操作,这里我们需要往表中插入一些测试数据。
-- 插入用户
INSERT INTO users (username, email, password) VALUES
('Alice', 'alice@example.com', 'password123'),
('Bob', 'bob@example.com', 'password456');
-- 插入产品
INSERT INTO products (product_name, category, price, stock) VALUES
('iPhone 12', '电子产品', 699.99, 10),
('MacBook Pro', '电子产品', 1999.99, 5),
('T-Shirt', '服装', 19.99, 100);
-- 插入订单
INSERT INTO orders (user_id, order_total) VALUES
(1, 719.98);
-- 插入订单详情
INSERT INTO order_items (order_id, product_id, quantity, price) VALUES
(1, 1, 1, 699.99),
(1, 3, 1, 19.99);
解释:
-
INSERT INTO是用来向表中插入数据的 SQL 语句。 -
在用户表中插入了两个用户 Alice 和 Bob。 -
在产品表中插入了 iPhone 12、MacBook Pro 和 T-Shirt。 -
在订单表中,创建了 Alice 的一个订单,订单总金额为 719.98。 -
在订单详情表中,记录了 Alice 购买的产品以及相应的数量和价格。
第四步:查询操作
-
查询用户的所有订单
SELECT u.username, o.order_id, o.order_total, o.order_date
FROM users u
JOIN orders o ON u.user_id = o.user_id
WHERE u.username = 'Alice';
解释:
-
通过 JOIN将用户表和订单表关联在一起,查出 Alice 所有的订单。 -
ON后面指定了两个表之间的关联条件,即用户表的user_id和订单表的user_id相同。
-
查询订单中的所有产品
SELECT o.order_id, p.product_name, oi.quantity, oi.price
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.order_id = 1;
解释:
-
通过多表连接,查出某个订单中包含的所有产品信息。
第五步:事务处理订单的创建
当用户下单时,通常涉及多张表的操作,我们可以使用事务来确保数据的一致性。
START TRANSACTION;
-- 更新库存
UPDATE products SET stock = stock - 1 WHERE product_id = 1; -- iPhone 12
UPDATE products SET stock = stock - 1 WHERE product_id = 3; -- T-Shirt
-- 插入订单
INSERT INTO orders (user_id, order_total) VALUES (1, 719.98);
-- 插入订单详情
INSERT INTO order_items (order_id, product_id, quantity, price)
VALUES (LAST_INSERT_ID(), 1, 1, 699.99),
(LAST_INSERT_ID(), 3, 1, 19.99);
COMMIT;
解释:
-
START TRANSACTION开始一个事务,所有操作会在一个原子操作中进行。 -
UPDATE操作用来减少产品的库存。 -
INSERT INTO用来创建新订单和订单详情。 -
LAST_INSERT_ID()获取刚插入订单的 ID,确保正确关联订单详情。 -
COMMIT提交事务,确保所有操作成功完成。
写的时候要注意一些常见坑:
-
事务未提交:如果事务中没有 COMMIT,所有操作都不会生效。忘记提交事务是常见问题。 -
外键约束:确保插入数据时,相关联的外键数据已经存在,比如插入订单时,必须确保用户和产品都已存在。 -
库存管理:在减少库存时,务必考虑并发问题。在高并发场景下,可能需要加锁或使用更复杂的并发控制机制。
通过这个综合练习,你将会学习到如何在 MySQL 中创建数据库、设计表结构、进行数据操作、使用事务保证数据的一致性,以及如何进行多表查询。这些操作几乎涵盖了日常开发中最常见的 MySQL 使用场景,务必把这些指令操作学会哦! 好了,本期我们就学到这里啦,我们下期不见不散!


