🚀 从零到精通:MySQL 开发实战全攻略
作者:你的昵称
标签:MySQL | SQL 基础 | 数据库实战 | CRUD | 数据约束
发布时间:2025-05-18
欢迎来到 MySQL 世界!如果你正在为“如何快速上手数据库操作”而发愁,或者想在项目中游刃有余地玩转 CRUD、约束和多表联动,那么这篇文章绝对不容错过。让我们带着好奇心,动手实战,一步步攻克 MySQL 的“五大关卡”吧!🎯
📚 目录
- 准备篇:创建 & 切换数据库
- 建表篇:认识常用字段类型
- 插入篇:一条、批量、子查询插入技巧
- 更新篇:如何优雅地改数据
- 删除篇:DELETE vs TRUNCATE
- 约束篇:让数据乖乖“听话”
- 实战篇:多表联动 & 练习题
- 总结 & 拓展阅读
准备篇:创建 & 切换数据库
-- 1️⃣ 新建一个数据库
CREATE DATABASE dbtest3;
-- 2️⃣ 切换到刚创建的数据库
USE dbtest3;
Tip:给不同项目分库管理,能让测试与生产环境“互不干扰”。
🧱 建表篇:认识常用字段类型
CREATE TABLE IF NOT EXISTS emp1 (
id INT,
`name` VARCHAR(15),
hire_date DATE,
salary DOUBLE(10,2)
);
字段名称 | 类型 | 说明 |
---|---|---|
id | INT | 整型,自然主键或索引列 |
name | VARCHAR(15) | 员工姓名,最长 15 个字符 |
hire_date | DATE | 入职日期 |
salary | DOUBLE(10,2) | 工资,保留两位小数 |
🎯 小彩蛋:
IF NOT EXISTS
能有效避免重复建表报错,是开发中的“小护身符”!
🚀 插入篇:一条、批量、子查询插入技巧
1️⃣ 单条插入(全字段 / 指定字段)
-- 全字段插入
INSERT INTO emp1 VALUES (1, 'eric', '2024-07-28', 3400);
-- 指定字段插入(其他字段自动为 NULL)
INSERT INTO emp1 (id, `name`) VALUES (3, 'miller');
💡 小贴士 :指定字段插入时,未写出的字段会默认填入
NULL
,务必确保字段允许为空。
2️⃣ 批量插入
INSERT INTO emp1 VALUES
(4, 'oscar', '2024-01-12', 5500),
(5, 'lily', '2024-05-14', 3400),
(6, 'lucy', '2024-04-18', 2300);
📌 优点: 一次插入多条记录,性能更佳,代码更整洁,适合初始化导入数据。
3️⃣ 子查询一键导入
INSERT INTO emp1 (id, `name`, hire_date, salary)
SELECT employee_id, last_name, hire_date, salary
FROM dbtest2.employees
WHERE department_id IN (60, 70);
🎯 妙用: 跨库拉数据、复用已有查询逻辑,一键导入超高效,既省力又规范!
🧠 总结:
插入方式 | 场景 | 优点 |
---|---|---|
单条插入 | 测试或手动补录个别数据 | 简单直观 |
批量插入 | 初始化或快速导入小批量数据 | 语句短、效率高 |
子查询插入 | 跨库迁移、逻辑复用 | 结合查询逻辑,自动插入数据 |
🛠️ 更新篇:如何优雅地改数据
在实际开发中,更新数据不仅仅是简单的 UPDATE
,学会精准控制和批量修改,才能提升操作的优雅度与效率。
✅ 全部更新:一键重置所有入职日期
UPDATE emp1 SET hire_date = CURDATE();
📌说明: 将所有员工的入职日期统一设置为当前日期。
🎯 条件更新:精准打击某位员工
UPDATE emp1
SET salary = salary * 1.2
WHERE `name` LIKE '%a%';
📌 说明: 只更新姓名中包含字母
a
的员工,工资上浮 20%。
🔧 多字段更新:一条语句搞定多个改动
UPDATE emp1
SET hire_date = '2024-07-13', salary = 1900
WHERE id = 3;
📌 说明: 同时更新入职日期与工资,锁定
id = 3
的员工。
🗑️ 删除篇:DELETE vs TRUNCATE
🔹 DELETE:可加条件,逐条删除,慢但可回滚
DELETE FROM emp1 WHERE id = 3;
🔹 TRUNCATE:一键清空表,快速但无法回滚
TRUNCATE TABLE emp1;
⚠️ 警告: 使用 TRUNCATE 前请三思,数据直接飞走不找回!
🔐 约束篇:让数据乖乖“听话”
在数据库设计中,约束(Constraint)就像“规矩”,可以让数据更规范、更安全。我们来认识几个最常用的字段约束👇
1️⃣ NOT NULL
(非空约束)
确保字段不能为空,不允许插入
NULL
值。
CREATE TABLE test_not_null (
id INT NOT NULL,
last_name VARCHAR(15) NOT NULL,
email VARCHAR(25)
);
2️⃣ UNIQUE
(唯一约束)
保证某一列或组合列的值在表中唯一,避免“撞车”。
CREATE TABLE test_unique (
id INT UNIQUE,
email VARCHAR(25) UNIQUE,
salary DECIMAL(10,2),
CONSTRAINT uk_name UNIQUE (last_name)
);
3️⃣ PRIMARY KEY
(主键约束)
表中每条记录的“身份证”,唯一且非空。常用于
id
字段,保障数据的唯一性与可识别性。
CREATE TABLE test_pk (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
4️⃣ FOREIGN KEY
(外键约束)
用于建立表与表之间的关联关系,让数据结构更具“家族谱系”。
📌 场景示例:员工 emp
属于某个部门 dept
🔹 主表:部门表
CREATE TABLE dept (
dept_id INT PRIMARY KEY,
dname VARCHAR(50)
);
🔹 从表:员工表(引用主表)
CREATE TABLE emp (
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(15),
department_id INT,
CONSTRAINT fk_dept FOREIGN KEY (department_id)
REFERENCES dept(dept_id)
ON DELETE SET NULL
ON UPDATE CASCADE
);
🎯 说明:
FOREIGN KEY (department_id)
:指定emp
表中的department_id
字段为外键。REFERENCES dept(dept_id)
:引用dept
表中的dept_id
字段。ON DELETE SET NULL
:如果部门被删除,相关员工的department_id
将被置为NULL
,防止数据孤岛。ON UPDATE CASCADE
:如果部门编号更新,员工表中对应的值也将自动更新,保持同步。
🧠 小贴士:
- 外键确保了数据之间的完整性,避免“部门不存在但员工已归属”这类问题。
- 设置外键约束后,插入或更新时必须确保关联记录存在,否则会报错。
🚀 实战篇:多表联动 & 练习题
🏆 多表删除一条龙
DELETE m, u
FROM my_employees m
JOIN users u
ON m.userid = u.userid
WHERE m.userid = 'Bbiri';
📝 综合练习
🔍 查询工资在 1200–1300 之间的员工
SELECT * FROM employee WHERE salary BETWEEN 1200 AND 1300;
📝 综合练习(更多操作示例)
🔍 查询姓“刘”的员工
SELECT id, NAME, addr FROM employee WHERE NAME LIKE '刘%';
🔧 修改“李四”的地址为“广东韶关”
UPDATE employee SET addr = '广东韶关' WHERE NAME = '李四';
💪 动手试一试,看看能否一次性搞定多个需求!
🧠 总结 & 拓展阅读
✅ 掌握五大 CRUD 技能:
- 建库(CREATE DATABASE)
- 建表(CREATE TABLE)
- 增(INSERT)
- 删(DELETE / TRUNCATE)
- 改(UPDATE)
- 查(SELECT)
- 加约束(PRIMARY KEY、FOREIGN KEY、UNIQUE 等)
💡 实用小贴士:
- ✅ 多用事务控制(
BEGIN
/COMMIT
/ROLLBACK
)提升数据安全性 - ⚠️ 避免盲目使用
TRUNCATE
,它无法回滚,操作需谨慎
📈 进阶方向推荐:
- 🔍 索引与性能调优
- 🔀 复杂 JOIN 与分区表操作
- 🔒 事务隔离级别与死锁处理
🎉 恭喜你,已经掌握了 MySQL 日常开发的核心要点!
如果觉得这篇内容对你有帮助,不要忘了:
👍 点赞 ⭐ 收藏 💬 评论 📌 关注!
👉 下次我们一起聊聊 索引优化 和 高并发事务处理,不见不散!