一、SELECT 查询语句详解
概念和特性
SELECT 语句是 MySQL 中最常用的数据检索命令,它允许我们从数据库表中提取数据。SELECT 查询不会修改数据,只是读取数据。主要特性包括:
可以从单个或多个表中检索数据
支持复杂的条件筛选
可以对结果进行排序、分组和聚合
支持多表连接查询
可以使用内置函数处理数据
使用意义
SELECT 查询是数据库应用的基础,几乎所有业务场景都需要使用查询功能:
用户界面展示数据
生成报表和数据分析
数据导出和转换
业务逻辑处理的基础
语句概述
基本 SELECT 语句结构包含以下部分:
SELECT 子句:指定要检索的列
FROM 子句:指定数据来源的表
WHERE 子句:指定筛选条件
GROUP BY 子句:指定分组依据
HAVING 子句:对分组结果筛选
ORDER BY 子句:指定排序方式
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)
示例代码详细解析
逐行分析
SELECT开始查询语句e.employee_id选择员工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薪资大于5000的条件ORDER BY e.salary DESC按薪资降序LIMIT 5限制5条结果
执行步骤表
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[结束]
容易犯的错误
忘记添加连接条件导致笛卡尔积
在WHERE中使用SELECT子句中的别名
混淆GROUP BY和HAVING的使用时机
在大表上不使用索引的查询
使用SELECT * 检索不需要的列
注意事项
为常用查询条件创建索引
避免在WHERE子句中对列使用函数
使用EXPLAIN分析查询性能
考虑使用分页处理大量数据
注意NULL值的处理方式
二、INSERT 插入语句详解
概念和特性
INSERT 语句用于向表中添加新记录,主要特性包括:
可以插入单行或多行数据
支持从其他表查询数据插入
可以指定要插入的列
支持批量插入提高性能
可以处理重复键情况
使用意义
INSERT 是数据录入的基础操作:
用户注册信息添加
订单创建
系统日志记录
数据迁移和导入
语句概述
基本 INSERT 语句形式:
单行插入:INSERT INTO ... VALUES ...
多行插入:INSERT INTO ... VALUES (...), (...), ...
查询插入:INSERT INTO ... SELECT ...
重复处理: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
示例代码详细解析
逐行分析
INSERT INTO products指定要插入的表(product_id, product_name, ...)指定要插入的列VALUES (NULL, 'Wireless Mouse', ...)提供对应列的值NULL表示自增ID由MySQL生成NOW()函数插入当前时间戳批量插入部分为同一订单的三个不同产品
执行步骤表
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[结束]容易犯的错误
列和值数量不匹配
忘记自增列的处理
字符串未加引号
日期格式不正确
违反唯一约束
注意事项
使用参数化查询防止SQL注入
批量插入提高性能
大表插入考虑暂时禁用索引
注意事务大小控制
处理自增ID的获取方式
三、UPDATE 更新语句详解
概念和特性
UPDATE 语句用于修改表中的现有记录,主要特性包括:
可以更新单行或多行数据
支持基于条件的更新
可以使用表达式计算新值
可以同时更新多个列
支持ORDER BY和LIMIT控制更新顺序和数量
使用意义
UPDATE 是数据维护的核心操作:
用户信息修改
订单状态更新
价格调整
批量数据处理
语句概述
基本 UPDATE 语句结构:
单表更新:UPDATE ... SET ... WHERE ...
多表更新:UPDATE ... JOIN ... SET ... WHERE ...
限制更新:UPDATE ... SET ... WHERE ... LIMIT ...
排序更新: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
示例代码详细解析
逐行分析
UPDATE products指定要更新的表SET price = price * 1.05价格上调5%updated_at = NOW()更新修改时间戳WHERE category_id = 3只更新类别3的产品AND discontinued = 0且未停产的产品多表更新示例中同时更新订单和状态表
执行步骤表
UPDATE语句流程图
graph TD A[开始] --> B[解析SQL] B --> C[验证权限] C --> D[定位数据] D --> E[获取行锁] E --> F[检查约束] F --> G[修改数据] G --> H[更新索引] H --> I[写入日志] I --> J[返回结果] J --> K[结束]
容易犯的错误
忘记WHERE条件导致全表更新
多表更新时列名歧义
死锁问题
未考虑触发器影响
事务过大导致锁等待超时
注意事项
更新前先备份重要数据
大表更新分批进行
使用事务保证一致性
注意WHERE条件的准确性
考虑使用乐观锁处理并发更新
四、DELETE 删除语句详解
概念和特性
DELETE 语句用于从表中删除记录,主要特性包括:
可以删除单行或多行数据
支持基于条件的删除
可以控制删除顺序和数量
删除操作通常不可逆
会触发相关的外键约束检查
使用意义
DELETE 是数据清理的重要操作:
用户账号注销
订单取消
过期数据清理
临时数据删除
语句概述
基本 DELETE 语句形式:
单表删除:DELETE FROM ... WHERE ...
多表删除:DELETE ... FROM ... JOIN ... WHERE ...
限制删除:DELETE FROM ... WHERE ... LIMIT ...
排序删除: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)
示例代码详细解析
逐行分析
DELETE FROM orders指定要删除的表WHERE status = 'Cancelled'删除已取消的订单AND created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR)且创建超过1年多表删除示例中同时删除订单和关联的订单项
执行步骤表
DELETE语句流程图
graph TD A[开始] --> B[解析SQL] B --> C[验证权限] C --> D[定位数据] D --> E[检查约束] E --> F[获取行锁] F --> G[删除数据] G --> H[更新索引] H --> I[写入日志] I --> J[返回结果] J --> K[结束]
容易犯的错误
忘记WHERE条件导致全表删除
忽略外键约束导致删除失败
未考虑级联删除的影响
大表删除导致锁表时间过长
未备份重要数据直接删除
注意事项
删除前先备份数据
考虑使用软删除(标记删除)替代
大表删除分批进行
注意事务大小的控制
检查外键约束关系