MySQL left join、right join和join的区别

数据库中外连接,内连接,交叉连接有何区别?

mysql的left join、right join、inner join

说实话,当我第一次接触MySQL JOIN的时候,我纠结了很长一段时间。
特别是左连接、右连接和内连接之间的区别。
光看理论很容易让人困惑。
我给大家举一个具体的例子,说明我是如何走进陷阱的,可能更直观一些。

比如我以前在一个电商项目中处理用户订单数据。
我们有两张表:users(用户信息)和orders(订单信息)。
此时,如果想查看所有用户及其订单状态,使用JOIN就至关重要。

我们先来说一下LEFT JOIN。
当时我很困惑,想着用LEFT JOIN用户订单,但是我发现很多用户没有订单,但是他们在users表中的所有数据都被我保留了,订单列为NULL。
这其实就是LEFT JOIN的本质:根据左表的用户,如果右表没有匹配的订单则填充NULL。
有趣的是,如果用户在订单表中有多个订单,例如小明下了两个订单,那么结果会返回两条记录。
小明在用户表中只占据一个位置,但在结果集中却扩展了。
调试了半天,发现这和ON条件的写法有一点关系。
主要取决于相应表中的匹配记录是多条还是单条。

然后右加入。
我很少接触过这个东西,但后来我发现它特别有用。
例如,如果我想查看所有订单信息,即使用户不存在,也必须为我保存订单数据。
我尝试了RIGHT JOIN用户订单,但发现如果用户不存在,则会填充NULL,但返回所有订单记录。
这是与LEFT JOIN的镜像关系,即标准表改变了。
说实话,RIGHT JOIN在实际业务中用得比LEFT JOIN少,但是有阶段性要求。
例如,报告系统应确保涵盖所有数据源。

最后,我们来谈谈内部联盟。
这种情况比较常见。
说白了,只保留两个表完全重叠的部分给你。
我之前已经处理过与用户和订单相关的数据,使用用户订单 AS INNER ON users.id =orders.user_id。
结果是只有那些自定义用户才会出现在最终结果中。
例如,如果用户仅注册但未下订单,则会被自动过滤掉。
INNER JOIN最关键的是ON条件。
如果ON条件可以唯一确定匹配(例如使用两个字段一起搜索),则结果集中的行数为两个表中匹配数据的乘积;如果ON条件导致多对多,结果集可能会爆炸性增长。
在一个项目中,由于ON条件写得不好,结果集直接从几百变成了几万,CPU都快烧坏了。

所以总结一下,ON条件怎么写直接影响结果集。
LEFT/RIGHT JOIN存储标准表和JOIN I中的所有数据INTERNAL 仅存储交集。
在设计SQL的时候,首先要想清楚自己需要什么数据。
如果ON条件写得不好,很快就会出现性能问题。
WHERE子句是后处理的,不会改变JOIN本身的匹配逻辑。
一开始我几乎对此感到困惑。

如何在mysql中使用INNER JOIN和LEFT JOIN

INNERJOIN:仅返回匹配的行。
例如:用户订单统计。
LEFTJOIN:返回左表中的所有内容。
如果右表没有匹配项,则填空。
示例:列出所有用户。
INNERJOIN:分析发生的行为,LEFTJOIN:显示整个主表。
优化连接条件,分散NULL,分析多表连接。