我必须使用 JOIN 的 SQL 实例...打开,无法将其替换为 FROM...哪里



过去几天我一直在学习SQL,似乎JOIN。。。ON是一个相当常见的运算符。但大多数时候我发现,如果我使用FROM编写相同的SQL代码。。。在WHERE,它将返回相同的结果。

以下代码取自SQL教程网站

SELECT games.yr, city.country
FROM games JOIN city
ON (games.city = city.name)

但我把它重新编码成

SELECT games.yr, city.country
FROM games, city
WHERE(games.city = city.name)

并且它仍然返回相同的输出。有了这个,我真的很难理解JOIN ON的概念。

你能提供一个JOIN ON是必要的并且不能被FROM WHERE取代的例子吗?

只有两个表,使用哪一个都没什么大不了的。然而,若有更多的表,那个么where子句的哪个部分和哪个JOIN一起使用会很快变得混乱。查询可能变得几乎无法读取。此外,在某些情况下,旧的Sql-89 A,B语法在含义上是不明确的,而在其他情况下,该语法根本无法表达查询所需的内容。。。尤其是涉及外部连接。

例如,让我们看看这个查询:

SELECT *
FROM A
INNER JOIN B ON B.X = A.X AND B.Y = '1'

这很容易转换为旧语法,因为这与额外的AND部分无关:

SELECT * FROM A,B WHERE A.X = B.X and B.Y = '1'

但是这个呢:

SELECT * 
FROM A
LEFT JOIN B ON B.X = A.X AND B.Y = '1'

现在不太清楚该怎么办了。对于查询来说,B.Y = '1'表达式是JOIN的一部分还是WHERE的一部分可能很重要,因为这可以确定结果需要哪些记录。在这种情况下,有一个*= sytnax表示子句是联接的一部分。。。但是,在仍然没有考虑到所有可能的解释的情况下,可以构造查询。

今天,包括我在内的许多数据库专业人士都会告诉您,永远不要使用旧的A、B语法,并始终使用新的sql-92语法。

两个查询的结果相同,但我们都更喜欢使用INNER JOIN语法。

SELECT games.yr, city.country
FROM games 
INNER JOIN city
ON (games.city = city.name)

Inner Join语法更具可读性,并且告诉使用哪个条件来联接两个表。

始终将联接条件保留在ON子句中,并将筛选器移动到Where子句中。显然,内部联接语法可以帮助您找到哪个是联接,哪个是过滤器。

但旧式Comma Separated Join的情况并非如此,所有内容都将包含在where子句中。

相关内容

最新更新