前言:
在上个实习生做的模块之中,在列表接口,涉及到多个表的联表查询的时候总会出现多条不匹配数据的奇怪的bug,我在后期维护的时候发现了,原来是这位实习生对MySQL的左连接和内连接不能正确的区分而导致的这种的情况。
表设置
-- 创建用户表
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 创建订单表
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2)
);
-- 插入测试数据
INSERT INTO users (id, name) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie');
INSERT INTO orders (id, user_id, amount) VALUES
(101, 1, 100.00),
(102, 1, 200.00), -- Alice 有2个订单
(103, 2, 150.00); -- Bob 有1个订单
-- Charlie 没有订单
联表查询
场景:
比如我现在要实现一个列表接口展示每一个用户的每一笔订单花费情况,只有有订单的用户才能展示。
解决方法:
内连接查询解决:
这个时候用内连接查询是最能解决这个场景的,内连接**仅返回两表中满足连接条件的匹配行。如果某行在左表或右表中无对应匹配,则该行不出现。**
左连接其实也能解决
当读者阅读到这里的时候也会想怎么左连接也能解决呢?其实也是能简单的,只要在查询的后面加上一个where条件,将order_id!=0加上去也可以实现这种需求。但是在实际的开发之中这样写大概率会被小组长或者项目经理说的。
如果不加这个where查询条件会怎么样呢?
上面的查询就很好的说明左连接查询是:返回左表的所有行,即使右表无匹配。右表无匹配时,相关字段填充为NULL。
右连接解决
在场景要求之中不是提到了我们想要每一个用户每一笔订单的消费情况,我也可以理解为每一笔订单对应的每一个用户的消费情况,这样的话我们也可以用右连接进行解决。
所以说右连接是:保留右表所有行,左表无匹配时填充NULL`;可视为左连接的镜像操作。
这时候需要读者注意的是:内连接的时候我知道主表是FROM后面的表,左连接也是也是FROM后面的表作为坐标,但是右连接的时候是JOIN后面的表当作右表。
总结:
在作者接触到的实际开发之中,接触到最多的就是内连接和左连接。希望读者充分理解上述三种表连接的查询方式,在进行多表连接查询的业务的时候才不会出现逻辑错误。