首页 > 解决方案 > SQL 问题:链接表时 WHERE/INNER JOIN 子句的顺序重要吗?

问题描述

考试题(AQA A-level 计算机科学):
[星号显示的主键]

Athlete(*AthleteID*, Surname, Forename, DateOfBirth, Gender, TeamName)
EventType(*EventTypeID*, Gender, Distance, AgeGroup)
Fixture(*FixtureID*, FixtureDate, LocationName)
EventAtFixture(*FixtureID*, *EventTypeID*)
EventEntry(*FixtureID*, *EventTypeID*, *AthleteID*)

将制作一份所有参加 18 年 9 月 17 日举行的比赛的运动员的名单。名单必须包括这些运动员的姓氏、名字和出生日期,不得包含其他详细信息。该列表应按姓氏的字母顺序显示。

编写 SQL 查询以生成列表。

我知道您可以通过两种方式做到这一点,一种使用 WHERE 子句,另一种使用 INNER JOIN 子句。但是,我想知道链接表格时顺序是否重要。

第一个示例解决方案:

SELECT Surname, Forename, DateOfBirth
FROM Athlete, EventEntry, Fixture
WHERE FixtureDate = "17/09/2018"
 AND Athlete.AthleteID = EventEntry.AthleteID
 AND EventEntry.FixtureID = Fixture.FixtureID
ORDER BY Surname

这是第一个示例解决方案,如果我在 WHERE 子句中切换表的顺序是否仍然正确,例如:

WHERE FixtureDate = "17/09/2018"
AND EventEntry.AthleteID = Athlete.AthleteID
AND Fixture.FixtureID = EventEntry.FixtureID

对于 INNER JOIN 子句,我有同样的问题,这是第二个示例解决方案:

SELECT Surname, Forename, DateOfBirth
FROM Athlete 
INNER JOIN EventEntry ON Athlete.AthleteID = EventEntry.AthleteID 
INNER JOIN Fixture ON EventEntry.FixtureID = Fixture.FixtureID
WHERE FixtureDate = "17/09/2018"
ORDER BY Surname

同样,如果我使用此命令是否正确:

INNER JOIN EventEntry ON Fixture.FixtureID = EventEntry.FixtureID

如果顺序确实很重要,有人可以向我解释为什么它是示例中显示的顺序吗?

标签: sqlinner-joinwhere

解决方案


一些忠告:

  • 切勿FROM子句中使用逗号。 始终使用正确、明确、标准 JOIN的语法。
  • 使用作为表名缩写的表别名。
  • 使用标准日期格式!
  • 限定所有列名。

然后,比较的顺序对于相等性无关紧要。我建议使用规范排序。

因此,查询应该更像:

SELECT a.Surname, a.Forename, a.DateOfBirth
FROM Athlete a INNER JOIN
     EventEntry ee
     ON a.AthleteID = ee.AthleteID INNER JOIN
     Fixture f
     ON ee.FixtureID = f.FixtureID
WHERE a.FixtureDate = '2018-09-17'
ORDER BY a.Surname;

我猜想中的所有列SELECT都来自Athlete. 如果不是这样,则调整表别名。


推荐阅读