
👨💻 关于作者:会编程的土豆
"不是因为看见希望才坚持,而是坚持了才看见希望。"
你好,我是会编程的土豆,一名热爱后端技术的Java学习者。
📚 正在更新中的专栏:
-
《数据结构与算法》😊😊😊
-
《leetcode hot 100》🥰🥰🥰🤩🤩🤩
-
《数据库mysql》
💕作者简介:后端学习者
一、先搞清楚一件事:为什么要多表?
你先记住一句话:
数据库里的数据,不会全放在一张表里
举个最简单的例子:
用户表 user
| id | name |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
订单表 orders
| id | user_id | price |
|---|---|---|
| 1 | 1 | 100 |
| 2 | 1 | 200 |
现在问题来了:
我要查:"张三买了多少钱"
你会发现:
-
user 表里没有 price
-
orders 表里没有 name
所以必须:
把两张表"拼在一起"查
这就是多表查询。
二、最原始的多表查询
先看一个最笨的方法:
SELECT *
FROM user, orders;
结果会是:
两张表"乱配对"(笛卡尔积)
张三 + 订单1
张三 + 订单2
李四 + 订单1
李四 + 订单2
明显有问题
三、加一个条件
SELECT *
FROM user, orders
WHERE user.id = orders.user_id;
现在就正常了:
只匹配"对得上的"
张三 + 订单1
张三 + 订单2
四、进化版写法:JOIN
上面的写法还能用,但现在基本都用 JOIN:
SELECT *
FROM user
JOIN orders
ON user.id = orders.user_id;
你可以这样理解:
-
FROM user → 先拿用户表
-
JOIN orders → 把订单表拿过来
-
ON → 规定怎么匹配
五、第一种连接:INNER JOIN
SELECT *
FROM user
INNER JOIN orders
ON user.id = orders.user_id;
含义:
只要"匹配成功"的数据
也就是说:
-
有订单的用户 → 保留
-
没订单的用户 → 直接消失
六、第二种连接:LEFT JOIN
现在加一个用户:
| id | name |
|---|---|
| 3 | 王五 |
但他没有订单。
用 INNER JOIN:
SELECT *
FROM user
JOIN orders
ON user.id = orders.user_id;
王五直接没了
用 LEFT JOIN:
SELECT *
FROM user
LEFT JOIN orders
ON user.id = orders.user_id;
结果:
张三 + 订单
李四 + NULL
王五 + NULL
一句话理解:
LEFT JOIN = 左边的表,全都要!
右边没有就补 NULL。
七、你现在真正需要记住的核心
就这两句:
INNER JOIN
只要匹配上的
LEFT JOIN
左表全要,右表没有就 NULL
八、写一个完整实战
需求:查"用户 + 订单金额"
SELECT user.name, orders.price
FROM user
LEFT JOIN orders
ON user.id = orders.user_id;
九、多表查询(3张表)
再加一张表:
商品表 product
| id | name |
|---|---|
| 1 | 手机 |
| 2 | 电脑 |
orders 变成:
| id | user_id | product_id | price |
查:谁买了什么
SELECT u.name, p.name, o.price
FROM user u
JOIN orders o ON u.id = o.user_id
JOIN product p ON o.product_id = p.id;
理解顺序(非常重要)
user
↓
join orders
↓
join product
一层一层拼
十、新手最容易犯的错
错误1:不写 ON
JOIN orders
直接炸(不知道怎么匹配)
错误2:字段不加表名
SELECT id
多表里 id 会冲突
正确写法:
SELECT user.id
或者用别名:
SELECT u.id
错误3:LEFT JOIN + WHERE 写错
SELECT *
FROM user u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.price > 100;
这会把 LEFT JOIN 变成 INNER JOIN
因为 NULL 被过滤掉了。
十一、一个技巧
查:没有订单的用户
SELECT u.*
FROM user u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;
核心思路:
-
先 LEFT JOIN
-
再找 NULL