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

家园网

MySQL 增删查改(CRUD)操作完全指南

网络 作者:本站 点击:

一、SELECT 查询语句详解

概念和特性

SELECT 语句是 MySQL 中最常用的数据检索命令,它允许我们从数据库表中提取数据。SELECT 查询不会修改数据,只是读取数据。主要特性包括:

  • 可以从单个或多个表中检索数据

  • 支持复杂的条件筛选

  • 可以对结果进行排序、分组和聚合

  • 支持多表连接查询

  • 可以使用内置函数处理数据

使用意义

SELECT 查询是数据库应用的基础,几乎所有业务场景都需要使用查询功能:

  • 用户界面展示数据

  • 生成报表和数据分析

  • 数据导出和转换

  • 业务逻辑处理的基础

语句概述

基本 SELECT 语句结构包含以下部分:

  1. SELECT 子句:指定要检索的列

  2. FROM 子句:指定数据来源的表

  3. WHERE 子句:指定筛选条件

  4. GROUP BY 子句:指定分组依据

  5. HAVING 子句:对分组结果筛选

  6. ORDER BY 子句:指定排序方式

  7. LIMIT 子句:限制返回行数

语法结构解析

SELECT 
    [DISTINCT] column1, column2, ...
    [aggregate_function(column) AS alias]
FROM 
    table1
    [JOIN table2 ON join_condition]
[WHERE condition]
[GROUP BY column_name]
[HAVING group_condition]
[ORDER BY column_name [ASC|DESC]]
[LIMIT [offset,] row_count];

示例和输出

-- 查询市场部薪资最高的5名员工
SELECT 
    e.employee_id,
    CONCAT(e.first_name, ' ', e.last_name) AS full_name,
    e.salary,
    d.department_name,
    DATE_FORMAT(e.hire_date, '%Y-%m-%d') AS hire_date
FROM 
    employees e
JOIN 
    departments d ON e.department_id = d.department_id
WHERE 
    d.department_name = 'Marketing'
    AND e.salary > 5000
ORDER BY 
    e.salary DESC
LIMIT 5;

输出:

+-------------+------------------+--------+-----------------+------------+
| employee_id | full_name        | salary | department_name | hire_date  |
+-------------+------------------+--------+-----------------+------------+
|         103 | Alexander Hunold |   9000 | Marketing       | 2020-01-03 |
|         104 | Bruce Ernst      |   6000 | Marketing       | 2021-05-21 |
|         105 | David Austin     |   5500 | Marketing       | 2022-02-15 |
+-------------+------------------+--------+-----------------+------------+
3 rows in set (0.01 sec)

示例代码详细解析

逐行分析

  1. SELECT 开始查询语句

  2. e.employee_id 选择员工ID列

  3. CONCAT(e.first_name, ' ', e.last_name) AS full_name 拼接姓名并设置别名

  4. e.salary 选择薪资列

  5. d.department_name 选择部门名称

  6. DATE_FORMAT(e.hire_date, '%Y-%m-%d') AS hire_date 格式化雇佣日期

  7. FROM employees e 指定主表并设置别名

  8. JOIN departments d ON e.department_id = d.department_id 内连接部门表

  9. WHERE d.department_name = 'Marketing' 筛选市场部

  10. AND e.salary > 5000 薪资大于5000的条件

  11. ORDER BY e.salary DESC 按薪资降序

  12. LIMIT 5 限制5条结果

执行步骤表

步骤操作说明
1解析SQL检查语法正确性
2权限验证检查查询权限
3优化查询生成执行计划
4检索部门找出Marketing部门
5关联员工通过部门ID关联
6应用条件筛选薪资>5000
7计算字段拼接姓名、格式化日期
8排序结果按薪资降序排列
9限制数量只取前5条
10返回结果发送给客户端

SELECT语句流程图

graph TD
    A[开始] --> B[解析SQL]
    B --> C[验证权限]
    C --> D[优化查询]
    D --> E[获取表数据]
    E --> F[应用JOIN条件]
    F --> G[应用WHERE过滤]
    G --> H[计算表达式]
    H --> I[排序结果]
    I --> J[应用LIMIT]
    J --> K[返回结果]
    K --> L[结束]

容易犯的错误

  1. 忘记添加连接条件导致笛卡尔积

  2. 在WHERE中使用SELECT子句中的别名

  3. 混淆GROUP BY和HAVING的使用时机

  4. 在大表上不使用索引的查询

  5. 使用SELECT * 检索不需要的列

注意事项

  1. 为常用查询条件创建索引

  2. 避免在WHERE子句中对列使用函数

  3. 使用EXPLAIN分析查询性能

  4. 考虑使用分页处理大量数据

  5. 注意NULL值的处理方式

二、INSERT 插入语句详解

概念和特性

INSERT 语句用于向表中添加新记录,主要特性包括:

  • 可以插入单行或多行数据

  • 支持从其他表查询数据插入

  • 可以指定要插入的列

  • 支持批量插入提高性能

  • 可以处理重复键情况

使用意义

INSERT 是数据录入的基础操作:

  • 用户注册信息添加

  • 订单创建

  • 系统日志记录

  • 数据迁移和导入

语句概述

基本 INSERT 语句形式:

  1. 单行插入:INSERT INTO ... VALUES ...

  2. 多行插入:INSERT INTO ... VALUES (...), (...), ...

  3. 查询插入:INSERT INTO ... SELECT ...

  4. 重复处理:INSERT ... ON DUPLICATE KEY UPDATE ...

语法结构解析

-- 基本形式
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
-- 多行插入
INSERT INTO table_name (column1, column2, ...)
VALUES 
    (value1, value2, ...),
    (value1, value2, ...),
    ...;
-- 从查询插入
INSERT INTO table_name (column1, column2, ...)
SELECT column1, column2, ...
FROM another_table
WHERE condition;
-- 处理重复
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON DUPLICATE KEY UPDATE 
    column1 = value1,
    column2 = value2;

示例和输出

-- 插入新产品记录
INSERT INTO products (
    product_id,
    product_name,
    category_id,
    price,
    stock_quantity,
    created_at
) VALUES (
    NULL,
    'Wireless Mouse',
    3,
    29.99,
    100,
    NOW()
);
-- 批量插入订单项
INSERT INTO order_items (
    order_id,
    product_id,
    quantity,
    unit_price
) VALUES 
    (1001, 101, 2, 19.99),
    (1001, 205, 1, 59.99),
    (1001, 308, 3, 9.99);

输出:

Query OK, 1 row affected (0.01 sec)
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

示例代码详细解析

逐行分析

  1. INSERT INTO products 指定要插入的表

  2. (product_id, product_name, ...) 指定要插入的列

  3. VALUES (NULL, 'Wireless Mouse', ...) 提供对应列的值

  4. NULL 表示自增ID由MySQL生成

  5. NOW() 函数插入当前时间戳

  6. 批量插入部分为同一订单的三个不同产品

执行步骤表

步骤操作说明
1解析SQL检查语法正确性
2权限验证检查插入权限
3约束检查检查主键、外键等
4分配空间为新记录分配存储
5写入数据将值写入存储引擎
6更新索引更新所有相关索引
7写入日志记录事务日志
8返回结果返回影响行数

INSERT语句流程图

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

容易犯的错误

  1. 列和值数量不匹配

  2. 忘记自增列的处理

  3. 字符串未加引号

  4. 日期格式不正确

  5. 违反唯一约束

注意事项

  1. 使用参数化查询防止SQL注入

  2. 批量插入提高性能

  3. 大表插入考虑暂时禁用索引

  4. 注意事务大小控制

  5. 处理自增ID的获取方式

三、UPDATE 更新语句详解

概念和特性

UPDATE 语句用于修改表中的现有记录,主要特性包括:

  • 可以更新单行或多行数据

  • 支持基于条件的更新

  • 可以使用表达式计算新值

  • 可以同时更新多个列

  • 支持ORDER BY和LIMIT控制更新顺序和数量

使用意义

UPDATE 是数据维护的核心操作:

  • 用户信息修改

  • 订单状态更新

  • 价格调整

  • 批量数据处理

语句概述

基本 UPDATE 语句结构:

  1. 单表更新:UPDATE ... SET ... WHERE ...

  2. 多表更新:UPDATE ... JOIN ... SET ... WHERE ...

  3. 限制更新:UPDATE ... SET ... WHERE ... LIMIT ...

  4. 排序更新:UPDATE ... SET ... WHERE ... ORDER BY ...

语法结构解析

-- 基本形式
UPDATE table_name
SET column1 = value1,
    column2 = value2,
    ...
WHERE condition;
-- 多表更新
UPDATE table1
JOIN table2 ON join_condition
SET table1.column1 = value1,
    table2.column2 = value2
WHERE condition;
-- 限制更新
UPDATE table_name
SET column1 = value1
WHERE condition
LIMIT row_count;

示例和输出

-- 更新产品价格
UPDATE products
SET price = price * 1.05,
    updated_at = NOW()
WHERE category_id = 3
AND discontinued = 0;
-- 更新订单状态
UPDATE orders o
JOIN order_status os ON o.status_id = os.status_id
SET o.status_id = 4,
    os.last_updated = NOW()
WHERE o.order_id = 1001
AND os.current_status = 'Processing';

输出:

Query OK, 12 rows affected (0.02 sec)
Rows matched: 12  Changed: 12  Warnings: 0
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

示例代码详细解析

逐行分析

  1. UPDATE products 指定要更新的表

  2. SET price = price * 1.05 价格上调5%

  3. updated_at = NOW() 更新修改时间戳

  4. WHERE category_id = 3 只更新类别3的产品

  5. AND discontinued = 0 且未停产的产品

  6. 多表更新示例中同时更新订单和状态表

执行步骤表

步骤操作说明
1解析SQL检查语法正确性
2权限验证检查更新权限
3定位数据根据WHERE条件找到记录
4获取锁获取要更新行的锁
5检查约束验证更新不违反约束
6修改数据更新存储引擎中的数据
7更新索引更新相关索引
8写入日志记录事务日志
9返回结果返回匹配和更改的行数

UPDATE语句流程图

graph TD
    A[开始] --> B[解析SQL]
    B --> C[验证权限]
    C --> D[定位数据]
    D --> E[获取行锁]
    E --> F[检查约束]
    F --> G[修改数据]
    G --> H[更新索引]
    H --> I[写入日志]
    I --> J[返回结果]
    J --> K[结束]

容易犯的错误

  1. 忘记WHERE条件导致全表更新

  2. 多表更新时列名歧义

  3. 死锁问题

  4. 未考虑触发器影响

  5. 事务过大导致锁等待超时

注意事项

  1. 更新前先备份重要数据

  2. 大表更新分批进行

  3. 使用事务保证一致性

  4. 注意WHERE条件的准确性

  5. 考虑使用乐观锁处理并发更新

四、DELETE 删除语句详解

概念和特性

DELETE 语句用于从表中删除记录,主要特性包括:

  • 可以删除单行或多行数据

  • 支持基于条件的删除

  • 可以控制删除顺序和数量

  • 删除操作通常不可逆

  • 会触发相关的外键约束检查

使用意义

DELETE 是数据清理的重要操作:

  • 用户账号注销

  • 订单取消

  • 过期数据清理

  • 临时数据删除

语句概述

基本 DELETE 语句形式:

  1. 单表删除:DELETE FROM ... WHERE ...

  2. 多表删除:DELETE ... FROM ... JOIN ... WHERE ...

  3. 限制删除:DELETE FROM ... WHERE ... LIMIT ...

  4. 排序删除:DELETE FROM ... WHERE ... ORDER BY ...

语法结构解析

-- 基本形式
DELETE FROM table_name
WHERE condition;
-- 多表删除
DELETE t1, t2
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id
WHERE condition;
-- 限制删除
DELETE FROM table_name
WHERE condition
LIMIT row_count;

示例和输出

-- 删除过期订单
DELETE FROM orders
WHERE status = 'Cancelled'
AND created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR);
-- 多表删除关联数据
DELETE o, oi
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
WHERE o.customer_id = 101
AND o.status = 'Pending';

输出:

Query OK, 23 rows affected (0.03 sec)
Query OK, 5 rows affected (0.01 sec)

示例代码详细解析

逐行分析

  1. DELETE FROM orders 指定要删除的表

  2. WHERE status = 'Cancelled' 删除已取消的订单

  3. AND created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR) 且创建超过1年

  4. 多表删除示例中同时删除订单和关联的订单项

执行步骤表

步骤操作说明
1解析SQL检查语法正确性
2权限验证检查删除权限
3定位数据根据WHERE条件找到记录
4检查约束验证外键约束
5获取锁获取要删除行的锁
6删除数据从存储引擎删除数据
7更新索引更新相关索引
8写入日志记录事务日志
9返回结果返回删除的行数

DELETE语句流程图

graph TD
    A[开始] --> B[解析SQL]
    B --> C[验证权限]
    C --> D[定位数据]
    D --> E[检查约束]
    E --> F[获取行锁]
    F --> G[删除数据]
    G --> H[更新索引]
    H --> I[写入日志]
    I --> J[返回结果]
    J --> K[结束]

容易犯的错误

  1. 忘记WHERE条件导致全表删除

  2. 忽略外键约束导致删除失败

  3. 未考虑级联删除的影响

  4. 大表删除导致锁表时间过长

  5. 未备份重要数据直接删除

注意事项

  1. 删除前先备份数据

  2. 考虑使用软删除(标记删除)替代

  3. 大表删除分批进行

  4. 注意事务大小的控制

  5. 检查外键约束关系

五、四种语句对比分析

功能对比

操作数据影响返回结果锁级别日志记录性能考虑
SELECT只读结果集共享锁索引优化
INSERT增加数据影响行数排他锁重做日志批量插入
UPDATE修改数据匹配/更改行数排他锁重做+撤销



标签: