没有逗号的SQL FROM子句是什么意思?

3
我今天注意到这个查询
 select * from table1 table2 where column_from_table1 = ?;

它工作了。它与(相同的列返回)相同。

 select * from table1 where column_from_table1 = ?;

前者不应该是语法错误吗?它将table2解释为什么?


3
记录一下,无论如何都不要在“FROM”子句中使用逗号。应该使用正确、明确、标准的“JOIN”语法。 - Gordon Linoff
2个回答

3

看起来它将其解释为重命名表,即使table2存在,它也会愉快地允许重命名,这也可以使用:

 select * from table1 asdf where asdf.column_from_table1 = ?;

1
有趣的是,如果你在where子句中加上table1.column_from_table1限定,你就会得到你期望的错误。非常糟糕的查询。 - Twelfth

2
select * from table1 table2 where column_from_table1 = ?;

table2 作为 table1 的表别名使用,它根本没有被用作数据库中对象的名称。表名为 table2 的存在与此查询完全无关。通常你会看到类似这样的语句:

select t.id, t.name from table1 t where t.column_from_table1 = ?;

一些关系型数据库需要使用关键字as,因此您也会看到这样的写法:

SELECT t.id, t.name FROM table1 AS t WHERE t.column_from_table1 = ?;

表别名对于编写涉及多个表的查询非常有用,特别是当它们具有需要限定的共享列名时。它们也对自连接至关重要,其中一个表连接到自身。

使用别名进行连接的示例:

SELECT t1.Id,
    t1.Name as t1_Name
    t2.Name as t2_Name
FROM table1 t1
    JOIN table2 t2
        ON t1.id = t2.id
WHERE t1.column_from_table1 = ?;

例如,为了查找重复的Name值进行自连接:

SELECT t1.Name,
    t1.Id
    t2.Id as Dupe_Id
FROM table1 t1
    JOIN table1 t2
        ON t1.Name = t2.Name
WHERE t1.Id < t2.Id;

请注意,此查询两次引用了table1,并使用别名t1t2来区分它所指的是哪个。
请注意,逗号连接(如FROM table1, table2 WHERE table1.id = table2.id)是非常老旧的语法,写查询时应明确避免使用。这种较老的语法难以阅读和维护,并且不支持外部连接,除非通过特定于供应商的扩展。新的语法使用JOIN关键字,在1992年的标准SQL中引入。没有理由仍然使用逗号连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接