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:

idname
1 Alice
2 Bob
3 Charlie

表B:

idaddress
1 USA
2 UK

如果我们执行以下查询:

SELECT * FROM A, B;
SQL

结果将是:

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中的行,我们可以使用以下查询:

SELECT *
FROM A
INNER JOIN B ON A.id = B.id;
SQL

结果将是:

idnameidaddress
1 Alice 1 USA
2 Bob 2 UK

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

左连接(LEFT JOIN)

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

 

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

SELECT *
FROM A
LEFT JOIN B ON A.id = B.id;
SQL

结果将是:

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

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

右连接(RIGHT JOIN)

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

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

SELECT *
FROM A
RIGHT JOIN B ON A.id = B.id;
SQL

结果将是:

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

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

全连接(FULL OUTER JOIN)

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

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

SELECT *
FROM A
FULL OUTER JOIN B ON A.id = B.id;
SQL

结果将是:

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

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

总结

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

 

posted @ 2025-04-27 10:39  hjswlqd  阅读(71)  评论(0)    收藏  举报