如何使用外连接连接 SQL 中的 3 个表?
How can I join 3 tables in SQL using outer joins?
所以我试图连接这三个表以列出特定公司提供的产品的名称和价格。
我试过使用自然连接,但我似乎没有得到正确的输出。 (我期待返回 3 行,但我得到的不止于此)
这里的所有答案都建议我使用内部联接,但我不想获得所有行的组合
谢谢
编辑:
我写的查询:
SELECT Pieces.Name, Provides.Price
FROM Pieces
JOIN Provides JOIN Providers
WHERE Providers.Name LIKE "Honda";
上面的查询没有结果
下图是我期待的结果
我想稍微谈谈联接,目的是让您更清楚地了解联接的工作原理:
INNER JOIN 不会导致 "all combinations of rows" - 这就是 CROSS JOIN 的结果
OUTER JOIN 在您有一个 table 具有所有值(实体 table)并且您需要将其连接到其他 table 时很有用必然有任何与实体 table 相关的行 - 这些是稀疏的 tables(数据中的空洞)。外连接有 3 种风格:左连接、右连接和全连接。左和右是一回事,您只需根据 table 的顺序选择合适的关键字即可。 a left join b
和 b right join a
本质上是同一件事 - 关键字 left/right 声明您认为哪些 table 是可靠的,哪些是稀疏的。
实心和稀疏 table 对的内部联接会消除结果中的一些实心行,只留下稀疏行和相关的实心行。外部联接将表示所有实心行和未找到匹配的稀疏行的空单元格
Natural JOIN 是您不明确说明 table 是如何相关的 JOIN,您只是让数据库根据两个 table 中相同的列名进行猜测。不要使用自然的 JOIN,它们几乎总是一个愚蠢的想法并且是一个毫无意义的 "optimisation" 可以节省几秒钟的击键时间来换取数小时令人沮丧的调试
您在这里的查询似乎不需要外部 JOIN,因为您说您想知道哪家公司提供了哪些片段。这只是
SELECT c.* FROM
Provider r
JOIN Provides s ON r.code = s.provider
JOIN Pieces c ON c.code = s.piece
WHERE
R.Name = 'Mattel'
编辑:
Philipxy 提出了一个合理的观点,即关键字 "solid" 和 "sparse" 在数学中具有特定的含义,我想指出,我在这里使用它们来传达一个概念,而不是拖延那个特定的概念数学方面的内容。当您寻求理解时,我想我会以这种方式讨论事情,因为我发现这是一种经典的学习者掌握概念的简单方法,但这些基本上是我自己的术语,用于指代数据库的形状你正在使用的数据,我不一定保证如果你使用的关键字他只34=] 以特定方式。在这种情况下,如果您使用的是 "solid" 和 "sparse",您可能需要添加类似的免责声明,您只是在普遍接受的英语语言含义中表示它们,而不是数学意义上的
所以我试图连接这三个表以列出特定公司提供的产品的名称和价格。
我试过使用自然连接,但我似乎没有得到正确的输出。 (我期待返回 3 行,但我得到的不止于此)
这里的所有答案都建议我使用内部联接,但我不想获得所有行的组合
谢谢
编辑:
我写的查询:
SELECT Pieces.Name, Provides.Price
FROM Pieces
JOIN Provides JOIN Providers
WHERE Providers.Name LIKE "Honda";
上面的查询没有结果
下图是我期待的结果
我想稍微谈谈联接,目的是让您更清楚地了解联接的工作原理:
INNER JOIN 不会导致 "all combinations of rows" - 这就是 CROSS JOIN 的结果
OUTER JOIN 在您有一个 table 具有所有值(实体 table)并且您需要将其连接到其他 table 时很有用必然有任何与实体 table 相关的行 - 这些是稀疏的 tables(数据中的空洞)。外连接有 3 种风格:左连接、右连接和全连接。左和右是一回事,您只需根据 table 的顺序选择合适的关键字即可。 a left join b
和 b right join a
本质上是同一件事 - 关键字 left/right 声明您认为哪些 table 是可靠的,哪些是稀疏的。
实心和稀疏 table 对的内部联接会消除结果中的一些实心行,只留下稀疏行和相关的实心行。外部联接将表示所有实心行和未找到匹配的稀疏行的空单元格
Natural JOIN 是您不明确说明 table 是如何相关的 JOIN,您只是让数据库根据两个 table 中相同的列名进行猜测。不要使用自然的 JOIN,它们几乎总是一个愚蠢的想法并且是一个毫无意义的 "optimisation" 可以节省几秒钟的击键时间来换取数小时令人沮丧的调试
您在这里的查询似乎不需要外部 JOIN,因为您说您想知道哪家公司提供了哪些片段。这只是
SELECT c.* FROM
Provider r
JOIN Provides s ON r.code = s.provider
JOIN Pieces c ON c.code = s.piece
WHERE
R.Name = 'Mattel'
编辑: Philipxy 提出了一个合理的观点,即关键字 "solid" 和 "sparse" 在数学中具有特定的含义,我想指出,我在这里使用它们来传达一个概念,而不是拖延那个特定的概念数学方面的内容。当您寻求理解时,我想我会以这种方式讨论事情,因为我发现这是一种经典的学习者掌握概念的简单方法,但这些基本上是我自己的术语,用于指代数据库的形状你正在使用的数据,我不一定保证如果你使用的关键字他只34=] 以特定方式。在这种情况下,如果您使用的是 "solid" 和 "sparse",您可能需要添加类似的免责声明,您只是在普遍接受的英语语言含义中表示它们,而不是数学意义上的