目录
1. CRUD操作概述
2. Create操作详解
2.1 表的创建
2.2 单行数据插入
2.3 多行数据插入
2.4 插入冲突处理
3. Retrieve操作详解
3.1 基础查询
全列查询(慎用)
指定列查询
表达式查询
结果去重
3.2 条件查询(WHERE子句)
比较运算符
逻辑运算符
NULL处理
3.3 结果排序(ORDER BY)
3.4 分页查询(LIMIT与OFFSET)
4. Update操作详解
4.1 单字段更新
4.2 多字段更新
4.3 基于表达式更新
5. Delete操作详解
5.1 删除指定数据
5.2 清空表数据
6. 高级查询技巧
6.1 聚合函数
6.2 GROUP BY与HAVING
7. 实战案例解析
案例1:去重插入
案例2:分页查询
8. 总结与最佳实践
1. CRUD操作概述
CRUD是数据库操作的四大核心功能:
-
Create(创建):插入数据
-
Retrieve(读取):查询数据
-
Update(更新):修改数据
-
Delete(删除):删除数据
本文将通过丰富的代码示例,详细解析MySQL中CRUD的实现方式及注意事项。
2. Create操作详解
2.1 表的创建
通过CREATE TABLE
语句定义表结构。
CREATE TABLE students (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,sn INT NOT NULL UNIQUE COMMENT '学号',name VARCHAR(20) NOT NULL,qq VARCHAR(20)
);
-
字段说明:
-
id
:主键,自增,无符号整数。 -
sn
:唯一学号,不可为空。 -
name
:姓名,长度限制为20字符。 -
qq
:QQ号,可为空。
-
2.2 单行数据插入
全列插入时,需按表定义的列顺序提供所有值:
INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);
-
注意事项:
-
若省略自增主键(如
id
),MySQL会自动填充。 -
必须保证值的顺序与表结构完全一致。
-
2.3 多行数据插入
指定列插入,适用于部分字段赋值:
INSERT INTO students (id, sn, name) VALUES(102, 20001, '曹孟德'),(103, 20002, '孙仲谋');
-
优势:批量插入提升效率,减少数据库连接开销。
2.4 插入冲突处理
当主键或唯一键冲突时,使用ON DUPLICATE KEY UPDATE
进行更新:
INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师')ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大师';
-
返回值说明:
-
0 rows affected
:冲突数据与更新值相同。 -
1 row affected
:插入新数据。 -
2 rows affected
:更新冲突数据。
-
或使用REPLACE
直接替换冲突记录:
REPLACE INTO students (sn, name) VALUES (20001, '曹阿晴');
-
注意:
REPLACE
会删除原记录后插入新数据,可能导致自增ID不连续。
3. Retrieve操作详解
3.1 基础查询
全列查询(慎用)
SELECT * FROM exam_result;
-
缺点:传输数据量大,可能影响索引性能。
指定列查询
SELECT id, name, english FROM exam_result;
表达式查询
计算总分并指定别名:
SELECT name, chinese + math + english AS 总分 FROM exam_result;
结果去重
SELECT DISTINCT math FROM exam_result;
3.2 条件查询(WHERE子句)
比较运算符
-- 英语不及格的同学
SELECT name, english FROM exam_result WHERE english < 60;-- 语文成绩在80到90分之间
SELECT name, chinese FROM exam_result
WHERE chinese BETWEEN 80 AND 90;
逻辑运算符
-- 姓孙且不叫孙某的同学
SELECT name FROM exam_result
WHERE name LIKE '孙%' AND name NOT LIKE '孙_';
NULL处理
-- 查询QQ号已知的同学
SELECT name, qq FROM students WHERE qq IS NOT NULL;
3.3 结果排序(ORDER BY)
-- 按数学成绩降序,英语成绩升序
SELECT name, math, english FROM exam_result
ORDER BY math DESC, english ASC;
3.4 分页查询(LIMIT与OFFSET)
-- 每页3条数据,查询第2页
SELECT * FROM exam_result
ORDER BY id LIMIT 3 OFFSET 3;
-
注意:
OFFSET
起始位置从0开始。
4. Update操作详解
4.1 单字段更新
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';
4.2 多字段更新
UPDATE exam_result SET math = 60, chinese = 70
WHERE name = '曹孟德';
4.3 基于表达式更新
-- 总成绩倒数前三的数学成绩加30分
UPDATE exam_result SET math = math + 30
ORDER BY chinese + math + english LIMIT 3;
5. Delete操作详解
5.1 删除指定数据
DELETE FROM exam_result WHERE name = '孙悟空';
5.2 清空表数据
-
DELETE:逐行删除,可回滚,保留自增计数。
DELETE FROM for_delete;
-
TRUNCATE:直接清空表,不可回滚,重置自增ID。
TRUNCATE TABLE for_truncate;
6. 高级查询技巧
6.1 聚合函数
-- 统计数学成绩总分
SELECT SUM(math) FROM exam_result;-- 计算平均总分
SELECT AVG(chinese + math + english) AS 平均总分 FROM exam_result;
6.2 GROUP BY与HAVING
-- 按部门统计平均工资
SELECT deptno, AVG(sal) FROM EMP GROUP BY deptno;-- 筛选平均工资低于2000的部门
SELECT deptno, AVG(sal) AS avg_sal FROM EMP
GROUP BY deptno HAVING avg_sal < 2000;
7. 实战案例解析
案例1:去重插入
-- 创建临时表并插入去重数据
CREATE TABLE no_duplicate_table LIKE duplicate_table;
INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table;
RENAME TABLE duplicate_table TO old_duplicate_table, no_duplicate_table TO duplicate_table;
案例2:分页查询
-- 按ID分页,每页3条
SELECT * FROM exam_result ORDER BY id LIMIT 3 OFFSET 6;
8. 总结与最佳实践
-
避免全列查询:减少数据传输量,提升性能。
-
谨慎使用UPDATE/DELETE:操作前备份数据,或添加
LIMIT
限制。 -
合理使用索引:WHERE和ORDER BY字段建立索引可加速查询。
-
事务管理:批量操作时开启事务,确保数据一致性。
通过本文的系统学习,读者可掌握MySQL核心操作,应对日常开发中的各类数据管理需求。