数据库左连接、右连接、内连接、全连接笔记

数据库连接类型是将不同数据表集成到数据库查询中的一种方式。
主要有左连接、右连接、内连接和全连接。
INNERJOIN 用于显示两个表共有的数据,可以将其视为集合的交集。
用维恩图来表示,两个集合的交集面积就是内部连接的结果。
在MySQL中,实现内连接的代码如下。
查询结果显示两个表共有的数据。
左连接(LEFTJOIN)显示左表中的所有数据和右表中的公共数据。
如果右表中没有匹配的部分,则显示为空值。
左表是左合并操作的对象。
在维恩图表示中,左表集连接到右表集,但不包括右表中的数据。
下面是左连接的代码实现和查询结果。
右连接操作(RIGHTJOIN)与左连接操作相反,它显示右表中的所有数据以及左表的公共部分。
如果右表中没有匹配的部分,则显示为空值。
右表显示了操作的主体。
下面是维恩图表示和右连接代码实现,以及相应的查询结果。
全连接(OUTERJOIN)查询两个表中的所有数据,但排除重复数据。
在维恩图中,它由左表和右表的并集表示。
由于MySQL不支持全连接,所以必须将左连接和右连接结合起来才能达到全连接的效果。
全连接代码和查询结果如下所示。
左连接不包含内连接(LEFTJOINEXCLUDINGINNERJOIN),只查询左表的数据,不包括两表共有的数据。
在维恩图表示中,仅保留左侧表组,并且不显示右侧表组中的数据。
该类型查询的代码实现和结果如下。
右连接不包含内连接(RIGHTJOINEXCLUDINGINNERJOIN),只查询右表的数据,不包括两表共有的数据。
在维恩图表示中,保留右侧表组,并且不显示左侧表组中的数据。
下面是右连接(不包括内连接)的代码和查询结果。
外连接不包括内连接(OUTERJOINEXCLUDINGINNERJOIN)来查询两个表各自保存的数据,不包括公共数据。
通过MySQL代码实现并显示相应的查询结果。
请注意,MySQL 并不直接支持全连接。
您需要将左合并和右合并合并并删除重复项以获得完整的合并效果。
完全合并的代码如下。
查询结果显示使用左连接和右连接排除重复数据后得到的结果。

超越基础:精通MySQL的JOIN操作(INNER, LEFT, RIGHT, CROSS)

MySQL的JOIN操作涵盖四种核心类型:INNER、LEFT、RIGHT和CROSS。
它们的区别、适用场景和优化策略如下: 1 、INNERJOIN 和 LEFTJOIN 的核心区别和应用场景 核心区别 INNERJOIN:只返回两个表中匹配的行,结果集是两个表的交集。
如果某一行存在于一个表中,但在另一表中没有匹配项,则该行将不会出现在结果中。
LEFTJOIN:返回左表中的所有行,当右表中没有匹配时填充NULL。
结果集包含左表中的所有数据,无论右表是否匹配。
应用场景 INNERJOIN:适合需要严格关联的场景,比如查询已下订单的客户(客户需要匹配订单表)。
分析库存产品(产品需与库存表相符)。
LEFTJOIN:适用于需要保留主表中所有数据的场景,例如:列出所有客户(包括未下订单的客户,以订单ID为NULL来标识)。
统计产品库存(包括缺货产品,以NULL库存标识)。
性能比较 INNERJOIN 通常更快,因为它处理的数据量较小。
当右表有索引时,LEFTJOIN 的性能差异可能不明显,但需要注意 NULL 值的处理逻辑。
2 、RIGHTJOIN和CROSSJOIN的用途 RIGHTJOIN逻辑:与LEFTJOIN对称,返回右表的所有行,左表没有匹配的时候填充NULL。
使用场景:当查询逻辑基于右表时(例如右表是参考数据集),RIGHTJOIN可以让意图更加清晰。
实际上可以通过交换表顺序来替换为LEFTJOIN,例如: --RIGHTJOINSELECT*FROMtableARIGHTJOINtableBONtableA.id=tableB.id; --等效 LEFTJOINSELECT*FROMtableBLEFTJOINtableAONtableA.id=tableB.id; CROSSJOIN逻辑:生成两个表的笛卡尔积,结果集中的行数是两个表的行数的乘积。
独特用途:生成组合:例如产品和颜色的所有可能组合(用于 SKU 生成)。
数据初始化:快速构建测试数据或完整配置表。
时间序列相关性:生成连续时间点与维度表之间的相关性(如保证每个产品在每个时间点都有记录)。
统计分析:计算所有维度组合的度量。
风险:警惕数据爆炸,仅在结果集可控时使用。
3 .优化MySQL JOIN查询的策略 索引优化 为JOIN列(ON子句中的列),特别是外键列创建索引。
例如: ALTERTABLEordersADDINDEXidx_customer_id(customer_id);ALTERTABLEcustomersADDINDEXidx_customer_id(customer_id); 使用EXPLAIN分析,通过EXPLAIN查看查询执行计划,关注索引使用情况、扫描行数和JOIN顺序,定位性能瓶颈。
选择适当的 JOIN 类型。
当您只需要匹配行时,请使用 INNERJOIN。
使用LEFTJOIN后避免过滤NULL值(增加计算负担)。
尽早过滤数据。
在JOIN之前或JOIN条件中过滤数据,以减少参与JOIN的数据量。
例如: --低效:先JOIN大表再过滤 SELECTo.order_id,c.customer_nameFROMordersoINNERJOINcustomerscONo.customer_id=c.customer_idWHEREc.registration_date>'2 02 3 -01 -01 '; --高效:先过滤小表SEL ECTo.order_id,c.customer_nameFROMordersoINNERJOIN(SELECTcustomer_id,customer_nameFROMcustomersWHEREregistration_date>'2 02 3 -01 -01 ')cONo.customer_id=c.customer_id; 避免 JOIN 列函数运营。
避免在 ON 子句中使用函数(例如 DATE()、LOWER()),否则索引将失败。
例如: --效率低下:索引无效 SELECT*FROMordersoINNERJOINcustomerscONDATE(o.order_date)=DATE(c.registration_date); --高效:直接比较日期 SELECT*FROMordersoINNERJOINcustomerscONo.order_date=c.registration_date; 调整 JOIN 顺序 手动调整 FROM 子句中表的顺序,使结果集较小的表先进行 JOIN。
必要时使用 STRAIGHT_JOIN 强制排序。
选择存储引擎。
优先使用InnoDB(支持事务和行级锁),避免MyISAM的表级锁瓶颈。
反范式设计(具体场景) 在读密集型报表中,可以通过冗余存储或物化视图预先计算JOIN结果,但需要权衡数据一致性和维护成本。
4 .总结 INNERJOIN适合严格关联,LEFTJOIN适合保留主表数据,RIGHTJOIN可以用LEFTJOIN代替,CROSSJOIN慎用。
优化策略需要结合索引、EXPLAIN分析、过滤逻辑、JOIN顺序和存储引擎选择,不断验证和调整,以达到性能和准确性之间的平衡。

MySQL 的内连接、左连接、右连接有什么区别?

内连接关键字:innerjoin;左连接:左连接;右联:右联。
内连接显示相关数据匹配;左连接显示左侧所有表,右侧表显示符合条件的数据;右嫁接则相反。

MySQL left join、right join和join的区别

MySQL中的leftjoin、rightjoin和join的区别如下: 1 、Leftjoin特点:将焦点放在左表上,左表的所有记录都会显示在结果集中。
行为:如果左表中的记录在右表中没有匹配项,则结果集中的相应列将显示为 NULL。
用途:用于确保左表中的所有记录都出现在查询结果中,同时显示与右表关联的记录。
2 、RightJoin 特点:将焦点放在右表上,右表中的所有记录都会显示在结果集中。
行为:如果右表中的记录与左表中没有匹配项,则结果集中的相应列将显示为 NULL。
用途:用于确保右表中的所有记录都出现在查询结果中,同时显示与左表关联的记录。
3 、Join特性:只显示两个表中匹配的记录,即两个表的交集。
行为:两个表中不存在匹配记录的部分将不会显示。
用途:用于从两个表中检索公共记录。
仅当两个表中都存在匹配的记录时,这些记录才会出现在结果集中。
总结:leftjoin适用于需要保留左表所有记录并显示右表关联记录的场景。
rightjoin适用于需要保留右表所有记录并显示左表关联记录的场景。
join适合只需要从两个表中检索公共记录的场景。
正确选择连接方式对于提高查询效率、保证输出结果准确至关重要。