MySQL数据库表的CRUD操作完全指南:从基础到高效实践

一、核心操作全景图

CRUD
Create
Read
Update
Delete
CREATE TABLE
INSERT
SELECT
JOIN
UPDATE
DELETE
TRUNCATE

二、创建操作(Create)

2.1 表结构创建

-- 创建电商用户表
CREATE TABLE `users` (
  `user_id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
  `username` VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
  `email` VARCHAR(100) NOT NULL UNIQUE CHECK(email LIKE '%@%') COMMENT '邮箱',
  `balance` DECIMAL(10,2) DEFAULT 0.00 COMMENT '账户余额',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 创建索引
CREATE INDEX idx_username ON users(username);
CREATE FULLTEXT INDEX idx_email ON users(email);

2.2 数据插入

-- 单条插入
INSERT INTO users (username, email, balance)
VALUES ('john_doe', 'john@example.com', 100.00);

-- 批量插入
INSERT INTO users (username, email) VALUES
('alice', 'alice@example.com'),
('bob', 'bob@example.com'),
('charlie', 'charlie@example.com');

-- 插入冲突处理
INSERT INTO users (username, email)
VALUES ('john_doe', 'new_john@example.com')
ON DUPLICATE KEY UPDATE 
  email = VALUES(email),
  updated_at = NOW();

三、查询操作(Read)

3.1 基础查询

-- 条件查询
SELECT user_id, username, balance 
FROM users
WHERE balance > 50.00
  AND created_at BETWEEN '2023-01-01' AND '2023-12-31';

-- 聚合查询
SELECT 
  COUNT(*) AS total_users,
  AVG(balance) AS avg_balance,
  MAX(created_at) AS last_created
FROM users;

-- 分页查询
SELECT * FROM users
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;

3.2 高级查询

-- 多表JOIN
SELECT 
  o.order_id,
  u.username,
  SUM(oi.quantity * oi.unit_price) AS total
FROM orders o
JOIN users u ON o.user_id = u.user_id
JOIN order_items oi ON o.order_id = oi.order_id
GROUP BY o.order_id
HAVING total > 1000.00;

-- 窗口函数
SELECT 
  username,
  balance,
  RANK() OVER (ORDER BY balance DESC) AS wealth_rank,
  balance - LAG(balance) OVER (ORDER BY created_at) AS balance_diff
FROM users;

-- JSON查询
SELECT 
  user_id,
  JSON_EXTRACT(profile, '$.address.city') AS city,
  JSON_CONTAINS(profile, '{"hobbies": "reading"}') AS has_reading
FROM users
WHERE JSON_VALUE(profile, '$.age') > 18;

四、更新操作(Update)

4.1 数据修改

-- 条件更新
UPDATE users
SET balance = balance * 1.05
WHERE created_at < '2023-06-01'
  AND balance < 500.00;

-- JOIN更新
UPDATE orders o
JOIN users u ON o.user_id = u.user_id
SET o.status = 'canceled'
WHERE u.username = 'john_doe';

-- JSON更新
UPDATE users
SET profile = JSON_SET(
  profile,
  '$.address.street', '123 Main St',
  '$.phone', '+123456789'
)
WHERE user_id = 1001;

4.2 事务处理

START TRANSACTION;

UPDATE accounts 
SET balance = balance - 500.00
WHERE user_id = 1001;

UPDATE products
SET stock = stock - 1
WHERE product_id = 2005;

INSERT INTO orders (user_id, total_amount)
VALUES (1001, 500.00);

COMMIT;

五、删除操作(Delete)

5.1 数据删除

-- 条件删除
DELETE FROM login_logs
WHERE login_time < '2022-01-01';

-- 级联删除
DELETE u, o, oi
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
LEFT JOIN order_items oi ON o.order_id = oi.order_id
WHERE u.user_id = 1001;

-- 快速清空
TRUNCATE TABLE temp_sessions;

5.2 软删除实现

-- 添加删除标记列
ALTER TABLE users
ADD COLUMN is_deleted TINYINT DEFAULT 0 COMMENT '删除标记';

-- 标记删除
UPDATE users
SET is_deleted = 1
WHERE user_id = 1001;

-- 查询时过滤
SELECT * FROM users
WHERE is_deleted = 0;

六、性能优化实践

6.1 索引策略

-- 慢查询分析
EXPLAIN ANALYZE
SELECT * FROM users
WHERE YEAR(created_at) = 2023;

-- 索引优化
ALTER TABLE users
ADD INDEX idx_created_at (created_at);

-- 强制索引
SELECT * FROM users FORCE INDEX (idx_username)
WHERE username LIKE 'john%';

6.2 批量操作优化

-- 批量插入优化
INSERT INTO audit_logs (event_type, details)
VALUES 
  ('login', '{"ip": "192.168.1.1"}'),
  ('logout', '{"time": "2023-08-01"}'),
  ('purchase', '{"amount": 50}');

-- 分批次删除
DELETE FROM big_table
WHERE id < 1000000
LIMIT 1000;

七、安全最佳实践

7.1 防止SQL注入

# Python示例:使用参数化查询
cursor.execute(
    "SELECT * FROM users WHERE username = %s AND password = %s",
    (username, hashed_password)
)

7.2 权限控制

-- 创建只读用户
CREATE USER 'report_user'@'%' IDENTIFIED BY 'SecurePass123!';
GRANT SELECT ON ecommerce.* TO 'report_user'@'%';

-- 列级权限控制
GRANT UPDATE (email, phone) ON users TO 'support_user'@'localhost';

八、常见问题解决方案

8.1 死锁处理

-- 查看死锁日志
SHOW ENGINE INNODB STATUS;

-- 设置锁超时
SET innodb_lock_wait_timeout = 30;

-- 重试机制示例(伪代码)
attempts = 0
while attempts < 3:
    try:
        execute_transaction()
        break
    except Deadlock:
        rollback()
        sleep(random.uniform(0.1, 0.5))
        attempts += 1

8.2 数据恢复

-- 使用binlog恢复
mysqlbinlog --start-datetime="2023-08-01 09:00:00" \
            --stop-datetime="2023-08-01 10:00:00" \
            binlog.000001 | mysql -u root -p

-- 从备份恢复
system mysqldump -u root -p dbname > backup.sql
mysql -u root -p dbname < backup.sql

九、现代CRUD扩展

9.1 JSON类型操作

-- 创建JSON列
ALTER TABLE products
ADD COLUMN specs JSON;

-- JSON路径查询
SELECT 
  product_id,
  specs->>'$.cpu' AS cpu_model,
  JSON_EXTRACT(specs, '$.memory.size') AS memory_size
FROM products
WHERE specs->>'$.brand' = 'Apple';

9.2 生成列(Generated Columns)

ALTER TABLE orders
ADD COLUMN total_weight DECIMAL(10,2) AS 
  (SELECT SUM(weight * quantity) FROM order_items WHERE order_id = orders.order_id);

完整代码示例已托管至GitHub:https://github.com/example/mysql-crud-guide
配套工具包包含:

  • 数据库初始化脚本
  • 压力测试工具集
  • 慢查询分析工具

欢迎在评论区提交您遇到的CRUD难题,我们将挑选典型问题进行深度解析!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只蜗牛儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值