为什么在为 SQL 表添加别名时要使用“AS”?

问题描述 投票:0回答:8

我刚刚遇到一个使用 AS 为表别名的 SQL 语句,如下所示:

SELECT all, my, stuff
FROM someTableName AS a
INNER JOIN someOtherTableName AS b
    ON a.id = b.id

我习惯看到的是:

SELECT all, my, stuff
FROM someTableName a
INNER JOIN someOtherTableName b
    ON a.id = b.id

我假设没有区别,只是语法糖,但其中哪一个更普遍/广泛传播?有什么理由更喜欢其中一种吗?

编辑以澄清:

我很欣赏所有的答案和提出的所有观点,但问题是不是为什么或为什么不使用表别名。问题纯粹是关于使用“AS”关键字进行表别名或将其省略。

sql syntax standards syntactic-sugar
8个回答
25
投票

它是语法糖,打字需要更长的时间,但有些人发现它更具可读性和清晰性。我使用它的原因是,当读取大型查询时,通过查找

AS
可以更轻松地找出别名。

另一个原因,有时完整的表名很长,输入起来很麻烦。当您没有自动完成等奇特功能时,或者当您只是感到懒惰时,使用较短的别名有时可以使事情变得更容易。 ;)

...正如其他一些人在我之前指出的那样,它在进行自连接时很有用。


7
投票

通常是首选。考虑一下如果您使用旧的“逗号表示法”进行连接,并且漏掉了一个逗号,会发生什么情况。

代替:

select *
from Orders, Customers;

你最终会得到:

select *
from Orders Customers; --Customers is now the alias for Orders.

虽然这不能通过引入“as”来解决,但您可以更轻松地判断它是否是有意为之(因为我可能实际上想将订单别名为客户,具体取决于我在查询期间对其执行的其他操作)。


4
投票

据我所知,并不是所有的数据库都支持AS语句。 (甲骨文?) 但由于某种原因,它看起来更具可读性。

编辑: Oracle 不支持此处的“AS”关键字;

ORA-00933: SQL command not properly ended

4
投票

首先,使用别名“a”进行别名实际上通常被认为是一件坏事(我们在编码标准中正式禁止它)。原因是,在长时间复杂的多表查询中,人们会忘记哪个别名代表哪个表。

在考虑可读性/可维护性时,节省 2 秒的打字时间(尤其是在这个智能 IDE 时代)有点愚蠢。

  • 别名的主要合法用途是进行自连接。在这种情况下,请使用语义命名别名;不只是添加无意义的“1,2,3” - 所以“position1”作为“position”表的别名是不好的; “昨天的位置”很好。
  • 如果您确实使用别名,请使其变得明显且易于理解,而不必引用“FROM”子句 - 再次强调,理想情况下是具有语义意义。 “a”不好。 “p”不好(除其他原因外,连接中的许多表可能以“p”开头。如果您的表名称是“position_tracking”并且查询中没有其他内容可能被解释为类似于“pos”,则“pos”是可以的。
  • 不要忘记命名事物是计算机科学中两个最难的问题之一

1
投票

字段别名是为了输出的可读性。表别名是为了提高查询结构的可读性。特别是当您处理长表名甚至可能跨数据库引用时。

如果查询中存在重复的表引用,则应始终使用表别名来区分一个表和另一个表。例如,父子连接可能看起来像这样:

SELECT parent.Name AS ParentName,
child.Name AS ChildName
FROM MyTable AS parent
INNER JOIN MyTable as child
ON parent.ID = child.ParentID

0
投票

也许通过使用 AS,您可以快速查看哪些表被用作别名。


0
投票

如果您有一个包含各种连接的庞大 SQL 语句,别名可以让您更轻松地阅读/理解列的来源

我们的一个应用程序无法处理列名称中的连字符(不要问我为什么),因此别名是将

COLUMN-NAME
转换为
COLUMN_NAME

的完美方法

0
投票

至于何时应明确指定

AS
,这取决于特定引擎支持的语法个人偏好(甚至是政策)。

在 SQL Server(这就是我处理的所有内容)中,在 FROM 或 JOIN 中关系名称后面的情况下,

AS
是可选的。在这种情况下,由于我的偏好,我会跳过关键字,并且我发现当与一致的面向行的连接表单一起使用时,它不会“降低可读性”。

但是,当使用派生查询时,SQL Server 需要

AS
关键字,因此在这种情况下我会努力将其包含在内。

再次,由于偏好,在输出子句中,我包含了

AS
。我相信我在这里选择关键字是因为与我的连接格式不同,通常情况下多个标识符出现在同一行上。

所以,对于我在 SQL Server 中:

SELECT a.all AS my, a.stuff  -- AS    (preference)
FROM someTableName a         -- no AS (preference)
INNER JOIN (
    SELECT ..
    ) AS b                   -- AS (required)
  ON a.id = b.id
© www.soinside.com 2019 - 2024. All rights reserved.