MySQL 中的表连接(JOIN)详解
在 MySQL 中,表连接(JOIN)用于根据相关列在两个或多个表之间进行数据查询
常见的连接方式包括:
- INNER JOIN(内连接)
- LEFT JOIN(左连接)
- RIGHT JOIN(右连接)
- FULL JOIN(全连接,MySQL 不直接支持)
- CROSS JOIN(交叉连接)
1. INNER JOIN(内连接)
作用:返回两个表中 匹配 的记录,不匹配的记录不会出现在结果集中
示例
假设有两个表:
users 表(用户表)
id | name | country_id |
---|---|---|
1 | 张三 | 1 |
2 | 李四 | 2 |
3 | 王五 | 3 |
countries 表(国家表)
id | country_name |
---|---|
1 | 中国 |
2 | 美国 |
4 | 英国 |
SELECT users.id, users.name, countries.country_name FROM users INNER JOIN countries ON users.country_id = countries.id;
结果
id | name | country_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;
结果
id name country_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;
结果
id name country_name 1 张三 中国 2 李四 美国 NULL NULL 英国 解析:
- 张三 和 李四 有匹配项,正常返回
- 英国(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;
结果
(图片来源网络,侵删)id name country_name 1 张三 中国 2 李四 美国 3 王五 NULL NULL NULL 英国 5. CROSS JOIN(交叉连接)
作用:返回 笛卡尔积,即两张表的所有可能组合,不需要 ON 条件
示例
SELECT users.name, countries.country_name FROM users CROSS JOIN countries;
结果
(图片来源网络,侵删)name country_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 适用于所有组合的情况,但大数据量时慎用,容易导致性能问题
- 3 个用户 × 3 个国家 = 9 条记录
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。