左连接,右连接,全外连接的区别是什么?

说起这个join语法,真是又爱又恨。
记得那一年,我正在修复公司数据库中的数据。
那时,蜂窝桌就有那么多。
如果不是 join 语法,我会很头疼。

正如你所看到的,在数据​​库设计中,为了遵循规范,数据必须分布在不同的表中。
这本来是一件好事,但问题来了。
如果你想从这些表中获取数据,那就很烦人了。
就像在一堆散落的珍珠中找到一条项链一样,需要付出很大的努力。

记得有一次,那是一个阳光明媚的日子,我正在公司的数据库中查看学生的成绩。
结果,我不得不使用多种沟通方式将成绩列表和学生列表整合在一起。
当时inner join被频繁使用,而且非常有效。

然后我发现left join也很有用。
例如,如果我想查看哪些学生没有成绩,我应该使用更软的连接。
左表(学生表)中的所有记录将被取出并与右表(结果表)进行匹配。
如果没有匹配,则使用 null 代替。
这个技巧确实救了我的命。

这同样适用于正确的连接。
右表中的所有记录将被删除,然后与左表进行匹配。
这个东西在处理一些特殊情况的时候特别有用。

Full join,理论上就是取出两个表的所有记录,但是MySQL不支持,所以必须用左连接和右连接加并集来模拟。
这招虽然有点复杂,但是在关键时刻还是很管用的。

还有一种交叉连接,它返回两个表的笛卡尔积,即将另一张表的每一行记录合并起来。
这通常作为查询多个表时的第一步,创建虚拟表,以方便后续操作。

总而言之,这些通信方法都有其自己的用途。
内连接查找交集,左连接和右连接从各自的表中获取数据,完全连接需要两个表中的所有数据,而交叉连接是笛卡尔积。
这七种连接方式只是多表查询基础知识的基础。
了解了这一点之后,查询起来就容易多了。

什么是内连接、外连接、交叉连接、笛卡尔积

今天在公司的数据库培训中,讲到连接类型的时候,我突然想到,比如我去年做的项目中,如果数据库表中的数据使用左外连接的话,左表中与右表不匹配的数据也可以显示出来。
我记得那是三月。
在销售报表中,客户信息表中缺少一些客户。
通过使用左外连接解决了问题。
但MySQL不支持全外连接,所以只能用UNION来模拟。
等等,还有一件事。
我记得培训师也说过,虽然可以实现交叉连接,但是效率很低。
当数据量很大时,最好尽可能少用。
嗯,看来连接方式的选择真是一门学问。

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

这个数据库连接操作真是让人头疼。
当我在杭州做一个项目时,我向客户吹嘘我可以很快地出报告,因为我不懂这个。
结果数据不符,被客户骂了。
所以我现在告诉你的是我曾经踩过的陷阱。

INNER JOIN,这是最简单的事情。
只会为您提取两个表中指定列中相互匹配的字段。
例如,在我之前的一个项目中,有两张表,一张称为产品,一张称为类别。
如果我想查找所有产品及其相应的类别,我将使用 products INNER JOINcategories ON products.category_id =categories.id。
因此,只有那些产品被分类,那些未分类或分类不存在的产品将不会提供给您。

外连接,这很有趣。
左外连接(LEFT JOIN),例如,如果你使用products LEFT JOINcategories ON products.category_id =categories.id,则无论category是否有对应的category,products中的所有产品都必须给你。
如果产品中的产品在类别中没有找到对应的类别,那么在结果中,类别列将为您填充 NULL。
在北京的一个项目中,我用这个来检查用户的订单。
无论用户是否有订单,用户信息都必须提供给您。
如果没有订单信息,则填写NULL。

RIGHT JOIN 另一方面,无论产品是否有对应的,类别中的都必须给你。
在上海的一个项目中,我用它来检查类别和产品。
无论该类别下是否有产品,都必须将类别信息提供给您。
如果没有产品信息,则为NULL。

全外连接(FULL JOIN),这个最好笑,给你两个表,不管是否有对应关系。
MySQL不直接支持,所以必须一起使用LEFT JOIN和RIGHT JOIN。
在广州的一个项目中,我使用了UNION来组合左右外连接的结果,这样无论哪张表有对应,或者没有对应,都可以给你看。
但该查询性能较差,当表包含大量数据时应谨慎使用。

CROSS JOIN,这个是最强大的东西,两个表直接合并。
我在深圳做的一个项目中,本来是想用这个来做抽奖,把所有用户和奖品结合起来。
结果数据量太大,服务器崩溃了。
所以这个东西一般不会用,除非你知道自己在做什么。

总而言之,内连接只提供匹配的数据,外连接提供一个表的完整数据,如果另一表不匹配则返回 NULL。
完全外连接会提供两个表,如果不匹配则返回 NULL。
交叉连接直接组合所有数据。
一旦理解了这一点,在处理数据库时就不会那么容易出错。