mysql 连接查询 左连接 右连接 笛卡尔积 等
参考
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:
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
表B:
| id | address |
|---|---|
| 1 | USA |
| 2 | UK |
如果我们执行以下查询:
结果将是:
| id | name | id | address |
|---|---|---|---|
| 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中的行,我们可以使用以下查询:
结果将是:
| id | name | id | address |
|---|---|---|---|
| 1 | Alice | 1 | USA |
| 2 | Bob | 2 | UK |
这个结果集只包含了两个表中相关的行,而不是所有可能的组合。
左连接(LEFT JOIN)
左连接返回左表中的所有行以及与右表相关联的行。如果右表中没有匹配的行,则会返回NULL。左连接使用LEFT JOIN关键字来指定连接条件。
以下是一个使用左连接的例子:
结果将是:
| id | name | id | address |
|---|---|---|---|
| 1 | Alice | 1 | USA |
| 2 | Bob | 2 | UK |
| 3 | Charlie | NULL | NULL |
这个结果集包含了左表中的所有行,以及与右表相关联的行。对于右表中没有匹配的行,NULL值被填充。
右连接(RIGHT JOIN)
右连接返回右表中的所有行以及与左表相关联的行。如果左表中没有匹配的行,则会返回NULL。右连接使用RIGHT JOIN关键字来指定连接条件。
以下是一个使用右连接的例子:
结果将是:
| id | name | id | address |
|---|---|---|---|
| 1 | Alice | 1 | USA |
| 2 | Bob | 2 | UK |
| NULL | NULL | 3 | NULL |
这个结果集包含了右表中的所有行,以及与左表相关联的行。对于左表中没有匹配的行,NULL值被填充。
全连接(FULL OUTER JOIN)
全连接返回两个表中的所有行,并根据连接条件进行组合。如果某个表中没有匹配的行,则会返回NULL。全连接使用FULL OUTER JOIN关键字来指定连接条件。
以下是一个使用全连接的例子:
结果将是:
| id | name | id | address |
|---|---|---|---|
| 1 | Alice | 1 | USA |
| 2 | Bob | 2 | UK |
| 3 | Charlie | NULL | NULL |
| NULL | NULL | 3 | NULL |
这个结果集包含了两个表中的所有行,对于没有匹配的行,NULL值被填充。
总结
在进行SQL查询时,避免产生笛卡尔积是非常重要的。通过使用适当的连接条件,我们可以控制查询结果集的大小,提高查询性能。内连接、左连接、右连接和全连接是常用的连接类型,根据具体需求选择合适的连接类型能够避免产生笛卡尔积,从而获得准确且高效的查询结果。

浙公网安备 33010602011771号