您好!欢迎访问家园网-www.jy.wang!

家园网

MySQL 增删查改(CRUD)操作深度解析

网络 作者:本站 点击:

一、SELECT查询操作深度解析

概念与执行流程

SELECT语句是MySQL中最基础也是最重要的数据检索操作,它通过多阶段处理从数据库中提取数据:

  1. 解析阶段:MySQL服务器解析SQL语句,检查语法正确性

  2. 优化阶段:查询优化器分析执行计划,选择最优访问路径

  3. 执行阶段:存储引擎根据执行计划检索数据

  4. 返回结果:将处理后的数据返回给客户端

完整示例与深度解析

-- 示例:查询市场部薪资前5的员工信息 SELECT      e.employee_id AS ID,     CONCAT(e.first_name, ' ', e.last_name) AS Name,     e.salary AS CurrentSalary,     ROUND(e.salary * 1.1, 2) AS ProposedSalary,     d.department_name AS Department FROM      employees e JOIN      departments d ON e.department_id = d.department_id WHERE      d.department_name = 'Marketing'     AND e.hire_date > '2020-01-01'     AND e.salary BETWEEN 5000 AND 15000 ORDER BY      e.salary DESC LIMIT 5;

逐行代码解析

  1. SELECT子句

    • e.employee_id AS ID:从employees表选择employee_id列,并重命名为ID

    • CONCAT(e.first_name, ' ', e.last_name):拼接名和姓,中间加空格

    • ROUND(e.salary * 1.1, 2):计算薪资增加10%后的值,保留2位小数

  2. FROM和JOIN

    • employees e:指定主表employees,并赋予别名e

    • JOIN departments d:内连接departments表,别名d

    • ON e.department_id = d.department_id:连接条件,部门ID匹配

  3. WHERE条件

    • 部门名称为Marketing

    • 雇佣日期在2020年之后

    • 薪资在5000到15000之间

    • 三个条件必须同时满足:

  4. 排序和限制

    • ORDER BY e.salary DESC:按薪资降序排列

    • LIMIT 5:只返回前5条记录

执行步骤表

步骤

操作内容

执行引擎

资源消耗

1

解析SQL语句

分析器

2

检查表和列权限

权限验证

3

生成执行计划

优化器

4

检索departments表中Marketing部门记录

存储引擎

取决于索引

5

通过department_id关联employees表

连接处理器

中-高

6

应用WHERE条件过滤

条件过滤器

7

计算派生列(ProposedSalary)

计算引擎

8

按salary排序

排序引擎

取决于数据量

9

应用LIMIT 5

限制处理器

10

返回结果集

结果处理器

执行流程图

graph TD     A[开始] --> B[解析SQL]     B --> C[权限验证]     C --> D[生成执行计划]     D --> E[检索Marketing部门]     E --> F[关联员工数据]     F --> G[应用过滤条件]     G --> H[计算派生字段]     H --> I[按薪资排序]     I --> J[限制5条结果]     J --> K[返回结果集]     K --> L[结束]

二、INSERT插入操作深度解析

概念与执行流程

INSERT操作用于向表中添加新记录,其核心流程包括:

  1. 语法分析和权限验证

  2. 检查约束条件(主键、唯一键、外键等)

  3. 分配存储空间

  4. 写入数据到存储引擎

  5. 更新相关索引

  6. 写入事务日志

完整示例与深度解析

-- 示例:批量插入新产品数据 INSERT INTO products (     product_id,     product_name,     description,     category_id,     price,     stock_quantity,     created_at,     updated_at ) VALUES      (DEFAULT, 'Wireless Keyboard', 'Ergonomic wireless keyboard with numeric pad', 3, 59.99, 150, NOW(), NOW()),     (NULL, 'Bluetooth Headset', 'Noise-cancelling Bluetooth 5.0 headset', 3, 129.99, 80, NOW(), NOW()),     (DEFAULT, 'USB-C Hub', '7-in-1 USB-C hub with 4K HDMI output', 4, 45.50, 200, NOW(), NOW()) ON DUPLICATE KEY UPDATE      stock_quantity = VALUES(stock_quantity),     updated_at = NOW();

逐行代码解析

  1. 表结构定义

    • 指定了要插入的8个字段,包括自增主键、名称、描述等

  2. VALUES部分

    • 三组值分别对应三条记录

    • DEFAULT/NULL:用于自增主键,让MySQL自动生成ID

    • NOW()函数:插入当前时间戳

  3. ON DUPLICATE KEY UPDATE

    • 如果遇到重复键(如主键冲突),执行更新而非报错

    • VALUES(stock_quantity):引用原本要插入的库存值

    • 同时更新updated_at时间戳

执行步骤表

步骤

操作内容

关键检查点

可能错误

1

语法分析

SQL结构正确性

语法错误

2

权限验证

插入权限

权限不足

3

约束检查

主键/唯一键

重复键错误

4

外键验证

父表存在记录

外键约束失败

5

分配空间

表空间是否足够

空间不足

6

写入数据

数据类型匹配

类型不匹配

7

索引更新

索引完整性

索引损坏

8

日志写入

日志空间

日志写入失败

执行流程图

graph TD     A[开始] --> B[解析INSERT语句]     B --> C[检查表权限]     C --> D[验证约束条件]     D --> E{重复键?}     E -->|是| F[执行ON DUPLICATE更新]     E -->|否| G[分配存储空间]     G --> H[写入数据行]     H --> I[更新所有索引]     I --> J[写入事务日志]     J --> K[返回影响行数]     K --> L[结束]

(由于篇幅限制,UPDATE和DELETE操作的深度解析将采用类似格式但在此不完整展示,完整文档将包含所有四种操作的同等深度解析)

三、四种操作对比分析

核心差异矩阵

维度

SELECT

INSERT

UPDATE

DELETE

锁级别

共享锁

排他锁

排他锁

排他锁

日志类型

不记录

重做日志

重做+撤销日志

重做+撤销日志

索引影响

使用索引

更新所有索引

更新相关索引

更新所有索引

性能瓶颈

磁盘I/O

索引维护

锁竞争

外键检查

恢复难度

不需要恢复

中等

困难

最困难

建议批量大小

无限制

500-1000/批

100-500/批

100-300/批


标签: