连接(JOIN)操作--内连接、外连接、左外连接、右外连接、全外连接

数据库中的 连接(JOIN)操作 用于合并多个表中的数据。以下是 内连接、外连接、左外连接、右外连接 的核心区别与示例说明:


1. 内连接(INNER JOIN)

  • 作用:返回两个表中匹配成功的行(交集)。
  • 结果:仅包含满足连接条件的行,不匹配的行被丢弃。
  • 语法示例
    SELECT * FROM TableA A
    INNER JOIN TableB B ON A.Key = B.Key;
    
  • 示意图
    TableA ∩ TableB
    

2. 外连接(OUTER JOIN)

分为 左外连接右外连接全外连接

(1) 左外连接(LEFT JOIN / LEFT OUTER JOIN)
  • 作用:返回 左表所有行 + 右表匹配的行。若右表无匹配,则补 NULL
  • 结果:左表数据完整保留,右表只保留匹配数据。
  • 语法示例
    SELECT * FROM TableA A
    LEFT JOIN TableB B ON A.Key = B.Key;
    
  • 示意图
    TableA + (匹配的TableB)
    
(2) 右外连接(RIGHT JOIN / RIGHT OUTER JOIN)
  • 作用:返回 右表所有行 + 左表匹配的行。若左表无匹配,则补 NULL
  • 结果:右表数据完整保留,左表只保留匹配数据。
  • 语法示例
    SELECT * FROM TableA A
    RIGHT JOIN TableB B ON A.Key = B.Key;
    
  • 示意图
    (匹配的TableA) + TableB
    
(3) 全外连接(FULL JOIN / FULL OUTER JOIN)
  • 作用:返回 左表所有行 + 右表所有行。匹配失败的部分补 NULL
  • 结果:左右表数据都完整保留。
  • 语法示例
    SELECT * FROM TableA A
    FULL OUTER JOIN TableB B ON A.Key = B.Key;
    
  • 示意图
    TableA ∪ TableB
    

⚠️ MySQL不支持 FULL JOIN,可通过 LEFT JOIN + RIGHT JOIN + UNION 实现。


核心区别总结

连接类型保留左表所有行?保留右表所有行?未匹配数据填充实际应用场景
INNER JOIN丢弃需要精确匹配的数据查询
LEFT JOIN✔️右表补 NULL主表数据必须完整(如用户订单统计)
RIGHT JOIN✔️左表补 NULL较少用(可被左连接替代)
FULL JOIN✔️✔️双方补 NULL合并两个表完整数据(如数据比对)

直观示例对比

假设:

  • 表A(Users)

    UserIDName
    1Alice
    2Bob
  • 表B(Orders)

    OrderIDUserIDProduct
    1011Apple
    1023Banana
(1) INNER JOIN 结果
SELECT * FROM Users
INNER JOIN Orders ON Users.UserID = Orders.UserID;
UserIDNameOrderIDUserIDProduct
1Alice1011Apple
(2) LEFT JOIN 结果
SELECT * FROM Users
LEFT JOIN Orders ON Users.UserID = Orders.UserID;
UserIDNameOrderIDUserIDProduct
1Alice1011Apple
2BobNULLNULLNULL
(3) RIGHT JOIN 结果
SELECT * FROM Users
RIGHT JOIN Orders ON Users.UserID = Orders.UserID;
UserIDNameOrderIDUserIDProduct
1Alice1011Apple
NULLNULL1023Banana

关键注意事项

  1. 左连接 vs 右连接
    二者本质对称,可通过交换表顺序相互转换。实践中 LEFT JOIN 更常用。
  2. 过滤条件位置
    • ON 指定连接条件(连接前过滤)
    • WHERE 指定结果过滤(连接后过滤)。
      错误示例:
    SELECT * FROM A
    LEFT JOIN B ON A.id = B.id
    WHERE B.value > 10; -- 会丢弃B为NULL的行(退化为INNER JOIN)
    
    正确做法:
    SELECT * FROM A
    LEFT JOIN B ON A.id = B.id AND B.value > 10; -- 保留A所有行
    
  3. 性能影响
    外连接通常比内连接开销大,需合理使用索引优化。

💡 简单记忆口诀

  • INNER JOIN → 只要匹配的
  • LEFT JOIN → 左表全保留,右表匹配的
  • RIGHT JOIN → 右表全保留,左表匹配的
  • FULL JOIN → 左右全保留,匹配的合并
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值