惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
aimingoo的专栏
aimingoo的专栏
S
SegmentFault 最新的问题
A
About on SuperTechFans
Engineering at Meta
Engineering at Meta
宝玉的分享
宝玉的分享
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 叶小钗
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
MyScale Blog
MyScale Blog
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 聂微东
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Blog — PlanetScale
Blog — PlanetScale
T
Tailwind CSS Blog
Recent Announcements
Recent Announcements
Jina AI
Jina AI
大猫的无限游戏
大猫的无限游戏
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks

博客园 - hjswlqd

python pip 离线包安装 whl格式 tar gz格式 py-radius python linux 调试 vscode timeline不显示|不正常|异常|no filtered timeline information was provided|Timeline does not work es scroll id 每次都相同 python 安装 echarts的渐变色配置 LinearGradient 联想 进入bios u盘启动 kibana筛选数据 vscode python 3.7 pylance debugpy 插件 vsix vsix 离线 编译 转 | 一次搞懂数据大屏适配方案 (vw vh、rem、scale) 分辨率 缩放比 转 | element-ui组件table去除下方滚动条,实现鼠标左右拖拽移动表格 vscode 提示js 函数的插件 | vue3项目的插件 Window中查看端口被哪个进程占用,并结束进程的方法 nodejs 统计算指定后缀,格式的文件 python windows命令行 批处理 统计算指定后缀,格式的文件 保存 |下载 | 提取 win10 win11 电脑 锁屏壁纸 vscode process terminal 3221225506 终端打不开 默认打开powershell
mysql 连接查询 左连接 右连接 笛卡尔积 等
hjswlqd · 2025-04-27 · via 博客园 - hjswlqd

参考 

SQL 避免笛卡尔积  https://deepinout.com/sql/sql-questions/848_sql_sql_avoid_cartesian_product.html

面试官:说一下Mysql中from多表跟join表的区别

https://juejin.cn/post/7322733301668216847?searchId=202504271017074EFBA4F9AC54FE23B3C8

什么是笛卡尔积?

在数据库中,笛卡尔积是指通过将两个或多个表中的每一行进行组合,得到一个包含所有可能组合的结果集。如果没有明确的连接条件,使用笛卡尔积会导致结果集的大小迅速增长,从而影响查询性能。

让我们通过一个例子来说明。假设我们有两个表:A和B,它们的结构如下所示:

表A:

idname
1 Alice
2 Bob
3 Charlie

表B:

idaddress
1 USA
2 UK

如果我们执行以下查询:

结果将是:

idnameidaddress
1 Alice 1 USA
1 Alice 2 UK
2 Bob 1 USA
2 Bob 2 UK
3 Charlie 1 USA
3 Charlie 2 UK

这个结果集包含了两个表中所有可能的组合,而不仅仅是它们的相关行。这是因为在查询中没有指定连接条件,导致产生了笛卡尔积。

如何避免产生笛卡尔积?

避免产生笛卡尔积的关键是在查询中使用适当的连接条件。下面是一些常用的连接条件及其用法:

内连接(INNER JOIN)

内连接是最常用的连接类型,它只返回两个表中相关行的组合。内连接使用JOIN关键字来指定连接条件。

例如,如果我们要获取同时存在于表A和表B中的行,我们可以使用以下查询:

结果将是:

idnameidaddress
1 Alice 1 USA
2 Bob 2 UK

这个结果集只包含了两个表中相关的行,而不是所有可能的组合。

左连接(LEFT JOIN)

左连接返回左表中的所有行以及与右表相关联的行。如果右表中没有匹配的行,则会返回NULL。左连接使用LEFT JOIN关键字来指定连接条件。

以下是一个使用左连接的例子:

结果将是:

idnameidaddress
1 Alice 1 USA
2 Bob 2 UK
3 Charlie NULL NULL

这个结果集包含了左表中的所有行,以及与右表相关联的行。对于右表中没有匹配的行,NULL值被填充。

右连接(RIGHT JOIN)

右连接返回右表中的所有行以及与左表相关联的行。如果左表中没有匹配的行,则会返回NULL。右连接使用RIGHT JOIN关键字来指定连接条件。

以下是一个使用右连接的例子:

结果将是:

idnameidaddress
1 Alice 1 USA
2 Bob 2 UK
NULL NULL 3 NULL

这个结果集包含了右表中的所有行,以及与左表相关联的行。对于左表中没有匹配的行,NULL值被填充。

全连接(FULL OUTER JOIN)

全连接返回两个表中的所有行,并根据连接条件进行组合。如果某个表中没有匹配的行,则会返回NULL。全连接使用FULL OUTER JOIN关键字来指定连接条件。

以下是一个使用全连接的例子:

结果将是:

idnameidaddress
1 Alice 1 USA
2 Bob 2 UK
3 Charlie NULL NULL
NULL NULL 3 NULL

这个结果集包含了两个表中的所有行,对于没有匹配的行,NULL值被填充。

总结

在进行SQL查询时,避免产生笛卡尔积是非常重要的。通过使用适当的连接条件,我们可以控制查询结果集的大小,提高查询性能。内连接、左连接、右连接和全连接是常用的连接类型,根据具体需求选择合适的连接类型能够避免产生笛卡尔积,从而获得准确且高效的查询结果。