0

这是一个有点学术性的问题,因为我试图更好地掌握 SQL。

为什么会这样:

SELECT id FROM nerds AS nerdnumber

但这不会?

SELECT nerds.id AS nerdnumber

对我来说,如果我的 SELECT 已经标识了表,则不需要 FROM。

4

4 回答 4

3

在 select 子句中包含表名是为了在进行连接时消除歧义。From 子句指定语句正在访问哪些表。

于 2013-03-14T00:53:42.050 回答
3

因此,在幕后实际发生的是引擎获取您的查询并将其分解并确定要触发的实际指令以获取您的数据。

使用的语法(SELECT blah FROM ...)已开发和标准化(大部分),这就是使用的。需要 FROM 的原因是......因为它是:)

可以更改/编写查询解析器以按照您建议的方式工作吗不明白为什么不这样做,但会给解析器带来额外的复杂性。SELECT、FROM、UPDATE、SET 和所有其他关键字对于让解析器找到锚点以从中提取数据很重要。

这就像...最快最肮脏的原因,你当然可以去阅读关于 SQL 标准的发展,阅读关于查询优化和解析,阅读一些非常有趣和疯狂的东西 :)

于 2013-03-14T00:59:12.097 回答
2

SELECT id FROM nerds AS nerdnumber并且SELECT nerds.id AS nerdnumber不是等效的查询。第一个将表 nerds 别名为 nerdsnumber,第二个尝试将 nerds.id 别名为 nerdersnumber。但我看到了你的问题。

你问的可能吗?是的。应该这样做吗?可能不是。使用 FROM 子句的原因是定义数据的来源。select 子句中的字段用于确定您从定义的数据集中使用什么。这是一种非常易于阅读和理解的语言(因此最初的 SEQL = 结构化英语查询语言)。添加您想要的功能会突然变得很难理解查询值的来源。如果您定义了该表怎么办?如果您在查询中将该表名重新定义为别名怎么办?

它最终只会增加歧义。

于 2013-03-14T01:00:30.340 回答
0

如果编写得当,两者都可以工作。

如果我正确理解了您的示例,那么在第一种情况下,您为table建立 alias ,在第二种情况下为field建立别名。

所以没有错SELECT nerds.id AS nerdfield FROM nerdstable AS nerds;

于 2013-03-14T00:55:40.947 回答