Sql 必须在其中使用JOIN…ON和can';不要用“从哪里来”替换它

Sql 必须在其中使用JOIN…ON和can';不要用“从哪里来”替换它,sql,join,Sql,Join,在过去的几天里,我一直在学习SQL,而JOIN…ON似乎是一个相当常见的操作符。但大多数时候,我发现如果我使用FROM…WHERE编写相同的SQL代码,它将返回相同的结果 下面的代码取自一个SQL教程网站 SELECT games.yr, city.country FROM games JOIN city ON (games.city = city.name) 但我把它重新编码成了 SELECT games.yr, city.country FROM games, city WHERE(gam

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

下面的代码取自一个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)
它仍然返回相同的输出。有了这个,我真的很难理解加入的概念


您能否提供一个示例,说明连接是必需的,并且不能由“从何处开始”替换

两个查询的结果相同,但我们都更喜欢使用
内部联接
语法

SELECT games.yr, city.country
FROM games 
INNER JOIN city
ON (games.city = city.name)
内部联接
语法更具可读性并告诉您使用哪个条件联接两个表

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


但是旧式的
逗号分隔联接的情况并非如此
一切都将在
where
子句中。

两个查询的结果相同,但我们都更喜欢使用
内部联接
语法

SELECT games.yr, city.country
FROM games 
INNER JOIN city
ON (games.city = city.name)
内部联接
语法更具可读性并告诉您使用哪个条件联接两个表

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


但是旧式的
逗号分隔的Join
并非如此,所有内容都将在
where
子句中。

仅使用两个表,使用它没有什么大不了的。但是,如果有更多的表,很快就会弄不清where子句的哪个部分与哪个JOIN一起使用。查询几乎无法读取。此外,在某些情况下,旧的Sql-89
A,B
语法在含义上不明确,而在其他情况下,该语法根本无法表达您从查询中需要的内容。。。特别是涉及到外部连接

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

SELECT *
FROM A
INNER JOIN B ON B.X = A.X AND B.Y = '1'
这很容易转换为旧语法,因为它与额外的
部分无关:

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'
表达式是连接的一部分还是WHERE的一部分可能很重要,因为这可以确定结果需要哪些记录。在本例中,有一个
*=
sytnax表示子句是连接的一部分。。。但是,在仍然不能解释所有可能的解释的情况下,构造查询是可能的


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

仅使用两个表,使用它没什么大不了的。但是,如果有更多的表,很快就会弄不清where子句的哪个部分与哪个JOIN一起使用。查询几乎无法读取。此外,在某些情况下,旧的Sql-89
A,B
语法在含义上不明确,而在其他情况下,该语法根本无法表达您从查询中需要的内容。。。特别是涉及到外部连接

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

SELECT *
FROM A
INNER JOIN B ON B.X = A.X AND B.Y = '1'
这很容易转换为旧语法,因为它与额外的
部分无关:

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'
表达式是连接的一部分还是WHERE的一部分可能很重要,因为这可以确定结果需要哪些记录。在本例中,有一个
*=
sytnax表示子句是连接的一部分。。。但是,在仍然不能解释所有可能的解释的情况下,构造查询是可能的


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

这是否只是一种语言惯例?按照惯例,JOIN…ON的使用比我的方式更广泛presented@user3277633通常,这只是惯例。然而,有一些东西加入了。。。ON可以做到其他语法无法做到的,当您向查询中添加更多表时,可读性的东西真的开始快速增加。您现在可能看不出有什么不同,但如果再处理几个数据库项目,您就会看到。这是否只是语言约定的情况?按照惯例,JOIN…ON的使用比我的方式更广泛presented@user3277633通常,这只是惯例。然而,有一些东西加入了。。。ON可以做到其他语法无法做到的,当您向查询中添加更多表时,可读性的东西真的开始快速增加。现在您可能看不出有什么不同,但如果再处理几个数据库项目,您就会发现。