快速过一遍MySQL的核心知识。
第一部分:核心概念 – 连接(JOIN)
想象一下,我们有两张Excel表格:
表1:员工表 (employees)
| id | name | department_id |
|---|---|---|
| 1 | 张三 | 1 |
| 2 | 李四 | 2 |
| 3 | 王五 | 1 |
| 4 | 赵六 | (NULL) |
表2:部门表 (departments)
| id | department_name |
|---|---|
| 1 | 技术部 |
| 2 | 销售部 |
| 3 | 行政部 |
现在,我们想把两个表的信息合并起来看,这就需要“连接”。
1. 内连接 (INNER JOIN)
通俗理解:取两个表的“交集”。只返回两个表中能完全匹配上的行。
场景: 我想知道每个员工属于哪个部门,但只关心那些已经分配了部门的员工。
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
结果:
| name | department_name |
|---|---|
| 张三 | 技术部 |
| 李四 | 销售部 |
| 王五 | 技术部 |
你发现了什么?
- 员工“赵六”不见了,因为他的
department_id是NULL,在部门表里找不到匹配项。 - 部门“行政部”也不见,因为员工表里没人属于部门3。
INNER JOIN 就像一次严格的相亲大会,必须男女双方都看对眼(匹配上)才会成功。
2. 左外连接 (LEFT OUTER JOIN 或 LEFT JOIN)
通俗理解:以左表为主。返回左表的所有记录,以及右表中能匹配上的记录。右表匹配不上的地方就用NULL填充。
场景: 我想列出所有员工,并显示他们的部门信息。就算他没部门(比如新员工),我也要看到他的名字。
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
结果:
| name | department_name |
|---|---|
| 张三 | 技术部 |
| 李四 | 销售部 |
| 王五 | 技术部 |
| 赵六 | (NULL) |
你发现了什么?
- 左表(员工表) 的所有记录都出来了。
- 赵六虽然没部门,但他的名字依然在。
- 部门“行政部”还是没出现,因为它是右表独有的。
LEFT JOIN 就像保护左表的“护犊子”家长:“我左表的人一个都不能少!右表你看着配,配不上就空着。”
3. 右外连接 (RIGHT OUTER JOIN 或 RIGHT JOIN)
通俗理解:以右表为主。返回右表的所有记录,以及左表中能匹配上的记录。左表匹配不上的地方就用NULL填充。
场景: 我想列出所有部门,并看看每个部门有哪些员工。就算某个部门一个人都没有(比如刚成立的部门),我也要看到这个部门。
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
结果:
| name | department_name |
|---|---|
| 张三 | 技术部 |
| 李四 | 销售部 |
| (NULL) | 行政部 |
| 王五 | 技术部 |
你发现了什么?
- 右表(部门表) 的所有记录都出来了。
- “行政部”虽然没员工,但部门名显示出来了。
- 员工“赵六”不见了,因为他是左表独有的。
RIGHT JOIN 和 LEFT JOIN 反过来,是“护着”右表的家长。
4. 外连接 (FULL OUTER JOIN)
通俗理解:取两个表的“并集”。返回左右两表的所有记录,匹配不上的地方都用NULL填充。
场景: 我想做一个全量的核对清单,既要看到所有员工(包括没部门的),也要看到所有部门(包括没员工的)。
-- 注意:MySQL不直接支持FULL OUTER JOIN,但可以用LEFT JOIN和RIGHT JOIN的UNION来实现
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id
UNION
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
结果:
| name | department_name |
|---|---|
| 张三 | 技术部 |
| 李四 | 销售部 |
| 王五 | 技术部 |
| 赵六 | (NULL) |
| (NULL) | 行政部 |
你发现了什么?
- 两个表的数据全都出来了!一个都没少。
FULL OUTER JOIN 就像一个大团圆,谁都不能少。
快速记忆口诀
- INNER JOIN: 俩都有的才要 → 交集
- LEFT JOIN: 左表全要,右表看着配 → 保左
- RIGHT JOIN: 右表全要,左表看着配 → 保右
- FULL JOIN: 我全都要! → 并集
第二部分:MySQL 快速入门知识树
光会连接还不够,我们来搭建一个MySQL的知识框架。
1. 数据库是啥?
就是一个高级的、多用户的Excel文件,能安全、高效地存储和管理大量数据。
2. SQL是啥?
是跟数据库“说话”的语言。你下命令,它去执行。
3. 必须掌握的四大核心操作(CRUD)
- C (Create – 增): 往表里插新数据。
INSERT INTO employees (name, department_id) VALUES ('钱七', 2); - R (Read – 查): 从表里读数据。这是你最常用的操作!
SELECT name, department_id FROM employees WHERE department_id = 1; -- 查找技术部所有人 - U (Update – 改): 修改表里已有的数据。
UPDATE employees SET department_id = 3 WHERE name = '赵六'; -- 给赵六分配到行政部 - D (Delete – 删): 从表里删除数据。(慎用!)
DELETE FROM employees WHERE name = '钱七'; -- 开除钱七
4. 关键子句(让查询更精准)
WHERE: 过滤条件,像Excel的筛选功能。WHERE age > 18ORDER BY: 排序。ORDER BY score DESC(按分数降序排)GROUP BY: 分组,常和统计函数一起用。-- 统计每个部门有多少人 SELECT department_id, COUNT(*) as employee_count FROM employees GROUP BY department_id;HAVING: 对分组后的结果进行过滤,和WHERE类似,但用在GROUP BY之后。
5. 给小白的学习路径建议
- 第一步:安装MySQL 去MySQL官网下载MySQL Community Server,或者安装XAMPP/MAMP这类集成环境,更简单。
- 第二步:练熟CRUD 自己创建一张表,比如
学生表(id, 姓名, 成绩),疯狂练习增、删、改、查。 - 第三步:理解“关系” 再创建一张
课程表,然后用学生ID把两张表关联起来。这时你就可以练习今天学的各种JOIN了。 - 第四步:实战小项目 尝试设计一个“个人博客系统”的数据库:
用户表:存用户信息。文章表:存文章,里面有一个用户ID字段指向是谁写的。 然后你就可以用JOIN查询出“某用户写的所有文章”了。
总结
- 连接(JOIN) 是SQL的核心,用于合并多个相关联的表的数据。
- 内连接 最常用,左连接 也非常常见,务必掌握。
- 学习MySQL不要怕,就从最基础的
CREATE DATABASE,CREATE TABLE,INSERT,SELECT开始动手敲代码。 - 遇到报错是正常的,那是电脑在教你正确的语法,仔细读错误信息。
你已经迈出了非常重要的一步!理解了连接,就等于打开了关系型数据库的大门。接下来就是多练习,把知识变成你的本能。加油!如果还有任何问题,随时可以再问我。




