大数跨境
0
0

从零开始掌握 MySQL:深入理解与实战技巧

从零开始掌握 MySQL:深入理解与实战技巧 趣聊科技圈
2024-09-06
2
导读:这个综合练习,你将会学习到如何在 MySQL 中创建数据库、设计表结构、进行数据操作、使用事务保证数据的一致性,以及如何进行多表查询。这些操作几乎涵盖了日常开发中最常见的 MySQL 使用场景等

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(102),
  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(102)
);

这里 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(102),
  transaction_date DATE
ENGINE=InnoDB;

学完上面的指令操作后,接下来我们来设计一个较为综合的 MySQL 练习,它会涵盖数据库设计、表操作、数据查询、事务管理等多个知识点。 通过这套练习,相信你们不仅可以掌握 MySQL 的基本操作,还可以学会在实际项目中如何设计高效的数据库。

综合练习:设计一个电商系统的数据库

需求说明:

设计一个简单的电商系统数据库,支持用户、产品、订单三种主要数据。用户可以浏览产品、下订单,每个订单包含一个或多个产品。我们需要考虑用户数据的存储、产品的分类管理、订单的记录和相关的事务处理。

实现步骤:

  1. 创建数据库
  2. 设计用户表、产品表、订单表和订单详情表
  3. 插入测试数据
  4. 查询操作
  5. 使用事务处理订单的创建

第一步:创建数据库

首先,我们需要为电商系统创建一个新的数据库。

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(50NOT NULL,
  email VARCHAR(100NOT NULL UNIQUE,
  password VARCHAR(255NOT 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(100NOT NULL,
  category VARCHAR(50),
  price DECIMAL(102NOT 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(102NOT NULL,
  order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  status VARCHAR(20DEFAULT '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(102NOT 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, passwordVALUES 
('Alice''alice@example.com''password123'),
('Bob''bob@example.com''password456');

-- 插入产品
INSERT INTO products (product_name, category, price, stock) VALUES 
('iPhone 12''电子产品'699.9910),
('MacBook Pro''电子产品'1999.995),
('T-Shirt''服装'19.99100);

-- 插入订单
INSERT INTO orders (user_id, order_total) VALUES 
(1719.98);

-- 插入订单详情
INSERT INTO order_items (order_id, product_id, quantity, price) VALUES 
(111699.99),
(13119.99);

解释

  • INSERT INTO 是用来向表中插入数据的 SQL 语句。
  • 在用户表中插入了两个用户 Alice 和 Bob。
  • 在产品表中插入了 iPhone 12、MacBook Pro 和 T-Shirt。
  • 在订单表中,创建了 Alice 的一个订单,订单总金额为 719.98。
  • 在订单详情表中,记录了 Alice 购买的产品以及相应的数量和价格。

第四步:查询操作

  1. 查询用户的所有订单
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 相同。
  1. 查询订单中的所有产品
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 (1719.98);

-- 插入订单详情
INSERT INTO order_items (order_id, product_id, quantity, price) 
VALUES (LAST_INSERT_ID(), 11699.99),
       (LAST_INSERT_ID(), 3119.99);

COMMIT;

解释

  • START TRANSACTION 开始一个事务,所有操作会在一个原子操作中进行。
  • UPDATE 操作用来减少产品的库存。
  • INSERT INTO 用来创建新订单和订单详情。
  • LAST_INSERT_ID() 获取刚插入订单的 ID,确保正确关联订单详情。
  • COMMIT 提交事务,确保所有操作成功完成。

写的时候要注意一些常见坑

  1. 事务未提交:如果事务中没有 COMMIT,所有操作都不会生效。忘记提交事务是常见问题。
  2. 外键约束:确保插入数据时,相关联的外键数据已经存在,比如插入订单时,必须确保用户和产品都已存在。
  3. 库存管理:在减少库存时,务必考虑并发问题。在高并发场景下,可能需要加锁或使用更复杂的并发控制机制。

通过这个综合练习,你将会学习到如何在 MySQL 中创建数据库、设计表结构、进行数据操作、使用事务保证数据的一致性,以及如何进行多表查询。这些操作几乎涵盖了日常开发中最常见的 MySQL 使用场景,务必把这些指令操作学会哦! 好了,本期我们就学到这里啦,我们下期不见不散!



【声明】内容源于网络
0
0
趣聊科技圈
🧐探索科技,发现乐趣。🤩带你玩遍科技好物!
内容 511
粉丝 0
趣聊科技圈 🧐探索科技,发现乐趣。🤩带你玩遍科技好物!
总阅读484
粉丝0
内容511