一张图看懂 SQL 的各种 join 用法

INNER JOIN 就是这样的东西。
简而言之,它为您检索两个表中所有匹配的行。
例如,如果您有一个员工表和一个工资表,您可以使用 INNER JOIN 将它们连接起来以查看哪些员工有工资记录。
这是经常使用的,几乎每个写报告的人都用过它。

LEFT JOIN 扫描左侧的表(例如,Employees 表)。
不管右边的表(工资表)是否匹配,左边的所有行都会给你。
如果右侧的行不匹配,请输入 NULL。
我之前跟一个新手讲过这个,他说:“这不是像 INNER JOIN 吗?”我说:“这远非事实。
INNER JOIN 必须匹配。

RIGHT JOIN 另一方面,请查看右侧的表。
如果左侧的值不匹配,请输入 NULL。
这种使用频率较低,但有时客户想要的数据是他们想要所有项目的信息,无论是否有人参与。

OUTER JOIN 要求最高。
无论它们是否匹配,您都会获得两个表中的所有行。
如果不匹配,请输入 NULL。
它很少被使用,但有时确实有必要。

然后是这些 EXCLUSIVE INNER JOINS,正如您可以从它们的名称中看出的那样:“给我除了 INNER JOIN 之外的所有内容。
”例如,LEFT JOIN EXCLUDING INNER JOIN 是左表中无法在右表中找到的行。
这个我没实际用过,不过看图你就明白了。
只不过是画了一个圆而已。
圈内的是符合条件的人。
划掉 INNER JOIN 部分,其余部分将单独保留。

说实话,当我第一次开始做这些JOIN时,我有点困惑,尤其是FULL OUTER JOIN和LEFT JOIN EXCEPT INNER JOIN。
在我看来,这些名字似乎混淆了。
但如果你多画几张图,多做几次练习,你就会慢慢明白了。
现在我帮新手写SQL的时候,经常会先画一张电路图,这比只靠文字说要有效得多。

图解 SQL 中 JOIN 的各种用法

其实,刚开始学习JOIN的时候,我真的很困惑。
我查看了各种 JOIN,尤其是 INNER JOIN 和 LEFT JOIN,但我无法区分它们。
后来我想只有找到了真实的场景才能真正理解。

我记得有一次,在进行用户订单分析时,我必须将用户表与订单表关联起来。
在使用INNER JOIN的过程中,我突然发现,有些现有用户虽然很早就注册了,却从未下过订单,直接被INNER JOIN筛选掉。
当时我很困惑。
难道是重要数据丢失了?
查了资料,发现需要LEFT JOIN。
具体场景如下:我想查看所有注册用户,即使他们从未下过订单。
在这种情况下,使用 LEFT JOIN 将显示用户表中的所有用户。
如果没有连接到订单表,则填写NULL。
当时看到SQL执行结果就安心了,也符合实际。

有趣的是,右连接很少。
我在分析供应商数据时使用过一次,因为我需要查看所有产品,即使供应商停止与我合作。
例如,如果您使用 RIGHT JOIN 查找所有产品和供应商,则对于停止营业的供应商将显示 NULL。

最烦人的是FULL OUTER JOIN。
说实话,我很少在工作中使用它。
我感觉我只在数据库理论考试中遇到过这个。
无奈只用了一次,而且写的SQL特别长,屏幕上满是NULL的结果让人眼花缭乱。
当时,我坐在工作台前,盯着屏幕发呆。
我到底在检查什么?
交叉连接更加有趣。
有一次,当我编写测试用例时,我不小心使用了 CROSS JOIN,结果我的数据库崩溃了。
然后,运维人员过来敲了敲我的键盘。
我查看了 1 0,000 行凌乱的输出。
我真的很想责怪自己。
这根本不是我想要的数据!
其实理解JOIN的关键是理解“谁是完整的,谁是左边的”。
想一想。
当我们分析业务时,我们通常关注关键实体。
例如,由于用户是焦点,因此“用户”表自然会位于左侧。
这种思维方式对我确实很有帮助。

我记得数据是关于X的,请检查当前数据库的执行计划。
不同系统的优化可能会有很大差异。
当时我不明白为什么某些 JOIN 在 MySQL 中很快,但在 Oracle 中却很慢。
我个人从未在这方面运行过 PostgreSQL,但最好自己测试一下。

SQL如何连接表_SQL多表连接的JOIN操作指南

您好,您问了一些有关 SQL 多表连接的非常详细的问题。
我简单总结一下:
上周有客户问我什么是SQL多表连接,我告诉了他。
首先,您提到的 JOIN 运算符是表连接的核心。
这就像将不同的数据表汇集在一起​​,让您看到更多相关信息。

1 .类型连接:
INNER JOIN 仅返回匹配的行,就像两个人有订单一样,他们将出现在结果中。

OUTER JOIN 包含不匹配的行,LEFT JOIN 保留左表中的所有行,RIGHT JOIN 保留右表中的所有行,FULL JOIN 包含两者。

CROSS JOIN 是笛卡尔积,相当于组合两个表中的所有行。
我们用得不多。

SELF JOIN是表和自身之间的连接,通常需要别名来区分。

2 连接步骤:
首先确定基表,如客户或订单。

然后使用 JOIN 运算符逐渐连接其他表。

使用别名以避免列名冲突。

明确连接条件,例如ON子句。

根据您的需要选择 JOIN 类型。

3 性能优化:
在连接列上创建索引,例如 CustomerID 和 OrderID。

避免使用 SELECT 并仅查询您需要的列。

WHERE 子句的位置必须正确,以避免退化为 INNER JOIN。

更新统计信息,例如分析表。

调整连接顺序,先连接结果集较小的表。

使用EXPLAIN来分析执行计划。

4 常见错误:
隐式CROSS JOIN,如果不指定ON子句,可以整体写。

列名冲突应通过表别名来区分。
要处理 NULL 值,请使用 COALESCE 或 IFNULL。

总之,通过合理使用JOIN,可以从多个表中提取非常有用的信息。
但是,请记住优化性能并避免不必要的复杂查询。
不管怎样,这取决于你,多练习。
我还在思考这个问题,希望对你有帮助!