MySQL 中的表连接(JOIN)详解

06-01 1136阅读

在 MySQL 中,表连接(JOIN)用于根据相关列在两个或多个表之间进行数据查询

常见的连接方式包括:

  1. INNER JOIN(内连接)
  2. LEFT JOIN(左连接)
  3. RIGHT JOIN(右连接)
  4. FULL JOIN(全连接,MySQL 不直接支持)
  5. CROSS JOIN(交叉连接)

1. INNER JOIN(内连接)

作用:返回两个表中 匹配 的记录,不匹配的记录不会出现在结果集中

示例

假设有两个表:

users 表(用户表)
idnamecountry_id
1张三1
2李四2
3王五3
countries 表(国家表)
idcountry_name
1中国
2美国
4英国
SELECT users.id, users.name, countries.country_name
FROM users
INNER JOIN countries ON users.country_id = countries.id;

结果

idnamecountry_name
1张三中国
2李四美国

解析:

  • 只返回 users.country_id = countries.id 的匹配记录
  • 王五(country_id=3) 没有匹配项,因此被排除
  • 英国(id=4) 在 users 表中没有引用,因此也被排除

    2. LEFT JOIN(左连接)

    作用:返回左表(users)的所有记录,如果右表(countries)中有匹配的,则一起返回;如果没有匹配,则右表的字段返回 NULL

    示例

    SELECT users.id, users.name, countries.country_name
    FROM users
    LEFT JOIN countries ON users.country_id = countries.id;
    

    结果

    idnamecountry_name
    1张三中国
    2李四美国
    3王五NULL

    解析:

    • 张三 和 李四 有匹配项,所以 country_name 正常显示
    • 王五 没有匹配的 country_id=3,但因 LEFT JOIN,它仍然会出现在结果集中,只是 country_name 为 NULL

      3. RIGHT JOIN(右连接)

      作用:返回右表(countries)的所有记录,如果左表(users)中有匹配的,则一起返回;如果没有匹配,则左表的字段返回 NULL。

      示例

      SELECT users.id, users.name, countries.country_name
      FROM users
      RIGHT JOIN countries ON users.country_id = countries.id;
      

      结果

      idnamecountry_name
      1张三中国
      2李四美国
      NULLNULL英国

      解析:

      • 张三 和 李四 有匹配项,正常返回
      • 英国(id=4)在 users 表中没有匹配项,但因 RIGHT JOIN,它仍然会出现在结果集中,只是 users 的字段返回 NULL

        4. FULL JOIN(全连接,MySQL 不直接支持)

        作用:返回 左右两张表的所有记录,匹配的合并,不匹配的部分会填充 NULL

        MySQL 不支持 FULL JOIN,但可以使用 UNION 结合 LEFT JOIN 和 RIGHT JOIN 来实现:

        SELECT users.id, users.name, countries.country_name
        FROM users
        LEFT JOIN countries ON users.country_id = countries.id
        UNION
        SELECT users.id, users.name, countries.country_name
        FROM users
        RIGHT JOIN countries ON users.country_id = countries.id;
        

        结果

        MySQL 中的表连接(JOIN)详解
        (图片来源网络,侵删)
        idnamecountry_name
        1张三中国
        2李四美国
        3王五NULL
        NULLNULL英国

        5. CROSS JOIN(交叉连接)

        作用:返回 笛卡尔积,即两张表的所有可能组合,不需要 ON 条件

        示例

        SELECT users.name, countries.country_name
        FROM users
        CROSS JOIN countries;
        

        结果

        MySQL 中的表连接(JOIN)详解
        (图片来源网络,侵删)
        namecountry_name
        张三中国
        张三美国
        张三英国
        李四中国
        李四美国
        李四英国
        王五中国
        王五美国
        王五英国

        解析:

        • 3 个用户 × 3 个国家 = 9 条记录

          JOIN 方式对比总结

          连接方式作用是否包含不匹配数据
          INNER JOIN仅返回匹配的记录
          LEFT JOIN返回左表所有数据,右表无匹配时填充 NULL是(左表)
          RIGHT JOIN返回右表所有数据,左表无匹配时填充 NULL是(右表)
          FULL JOIN返回两表所有数据,填充 NULL是(左右表)
          CROSS JOIN返回两表的笛卡尔积(所有组合)N/A

          结论

          • INNER JOIN 是最常用的方式,只获取匹配的数据
          • LEFT JOIN 在查询“即使没有关联数据也要展示左表数据”时非常有用(如用户未选择国家的情况)
          • RIGHT JOIN 类似 LEFT JOIN,但更少用(一般交换表位置改用 LEFT JOIN)
          • FULL JOIN 适用于“取并集”的场景,但 MySQL 需要 UNION 方式实现
          • CROSS JOIN 适用于所有组合的情况,但大数据量时慎用,容易导致性能问题
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码