SQL关键字“ AS”的目的是什么?


137

您可以在SQL中设置表别名,然后在表名后面键入标识符。

SELECT * FROM table t1;

您甚至可以使用关键字AS来表示别名。

SELECT * FROM table AS t1;

它们之间有什么区别?

我看到DBA的老人们倾向于编写不带的语句AS,但是大多数新教程都使用它。

更新:我知道表和列别名的用途是什么。我很好奇,在没有别名的情况下使用单独的关键字设置别名的原因是什么。


12
来自msdn.microsoft.com/zh-cn/library/ms179300.aspx AS子句是ISO标准中定义的语法,用于将名称分配给结果集列。这是SQL Server使用2005年的首选语法
阿德里安旁观者

3
它还用于将过程的声明与其脚本分开。CREATE PROC Test @Param1 INT AS SELECT @Param1
Tom'Blue'Piddock

Answers:


134

以上两个语句之间没有区别。AS只是提及别名的一种更明确的方式


10
实际上,SQL没有区别,但是某些依赖的工具/库可以依赖于此小关键字。例如:JDBC 4.0。取决于使用带“ AS原因”和不带别名的别名,您将收到不同的行为-请参阅此答案stackoverflow.com/a/4271250/814304。我想建议始终使用完整形式的语义来避免此类问题。
iMysak

我可以为多个栏使用别名吗?例如,两列具有单个别名?
Deepak Keynes

@凯恩斯是的。只需串联(||)列,然后为其赋予别名,例如SELECT foo || bar作为foobar。
Rupert Madden-Abbott

是的,@ RupertMadden-Abbott,谢谢!但我等了很长时间,我的语境是。
Deepak Keynes

38

在我之前回答的每个人都是正确的。当您有很长的查询或具有联接的查询时,可以将它用作表的别名快捷方式名称。这是几个例子。

例子1

SELECT P.ProductName,
       P.ProductGroup,
       P.ProductRetailPrice
FROM   Products AS P

例子2

SELECT P.ProductName,
       P.ProductRetailPrice,
       O.Quantity
FROM   Products AS P
LEFT OUTER JOIN Orders AS O ON O.ProductID = P.ProductID
WHERE  O.OrderID = 123456

示例3 使用AS关键字是一种很好的做法,强烈建议使用AS关键字,但是也可以在没有查询的情况下执行相同的查询(而且我经常这样做)。

SELECT P.ProductName,
       P.ProductRetailPrice,
       O.Quantity
FROM   Products P
LEFT OUTER JOIN Orders O ON O.ProductID = P.ProductID
WHERE  O.OrderID = 123456

如您所知,在上一个示例中,我省略了AS关键字。它可以用作别名。

例子4

SELECT P.ProductName AS "Product",
       P.ProductRetailPrice AS "Retail Price",
       O.Quantity AS "Quantity Ordered"
FROM   Products P
LEFT OUTER JOIN Orders O ON O.ProductID = P.ProductID
WHERE  O.OrderID = 123456

示例4的输出

Product             Retail Price     Quantity Ordered
Blue Raspberry Gum  $10 pk/$50 Case  2 Cases
Twizzler            $5 pk/$25 Case   10 Cases

21

当您不确定要选择哪种语法时,尤其是当似乎没有太多选择需要分开时,请查阅启发式书。据我所知,关于SQL的唯一启发式书籍是“ Joe Celko的SQL编程风格”:

关联名称通常被称为别名,但是我将是正式的。在SQL-92中,它们可以有一个可选的 AS运算符,应该使用它来明确指出某些东西被赋予了新的名称。[p16]

这样,如果您的团队不喜欢会议,您可以责怪Celko-我知道我是;)


更新1:IIRC长期以来,Oracle不支持AS(先前的相关名称)关键字,这可以解释为什么某些旧计时器不习惯使用它。


更新2:尽管“ SQL标准”使用了术语“相关名称”,但这是不合适的。基本概念是“ 范围变量 ”的概念。


更新3:我只是重新阅读了Celko写的东西,但他错了:该表未重命名!我现在认为:

关联名称通常被称为别名,但是我将是正式的。在Standard SQL中,它们可以具有可选的AS关键字,但不应使用它,因为它可能给人以某种印象,即某些东西没有被重命名。实际上,应该强制省略它是范围变量这一点。


12

AS关键字是给一个ALIAS名到数据库表或表列。在您的示例中,两个语句都是正确的,但是在某些情况下需要使用AS子句(尽管AS运算符本身是可选的),例如

SELECT salary * 2 AS "Double salary" FROM employee;

在这种情况下,Employee表格中有一salary列,我们只想使用新名称来加薪Double Salary

抱歉,如果我的解释无效。


根据您的评论进行更新,您是对的,我的先前声明无效。我能想到的唯一原因是,该AS子句在SQL世界中已经存在很长时间了,为了实现向后兼容,该子句已被并入当今的RDMS中。


3
不,AS即使在这种情况下也不是必需的。尝试SELECT 1 + 1 "result"
viam0Zah 2010年

6

如果您不使用“ SELECT *”(这是您应该摆脱的坏习惯),则使用起来更明显:

SELECT t1.colA, t2.colB, t3.colC FROM alongtablename AS t1, anotherlongtablename AS t2, yetanotherlongtablename AS t3 WHERE t1.colD = t2.colE...

1
我知道表别名的目的是什么。我很好奇,在没有别名的情况下使用单独的关键字设置别名的原因是什么。
viam0Zah 2010年

4

这是为实体指定关联名的一种正式方法,以便您可以在查询的另一部分中轻松解决它。


3

AS这种情况下是在所定义的可选关键字ANSI SQL 92以限定<<correlation name>,通常称为别名为表。

<table reference> ::=
            <table name> [ [ AS ] <correlation name>
                [ <left paren> <derived column list> <right paren> ] ]
          | <derived table> [ AS ] <correlation name>
                [ <left paren> <derived column list> <right paren> ]
          | <joined table>

     <derived table> ::= <table subquery>

     <derived column list> ::= <column name list>

     <column name list> ::=
          <column name> [ { <comma> <column name> }... ]


     Syntax Rules

     1) A <correlation name> immediately contained in a <table refer-
        ence> TR is exposed by TR. A <table name> immediately contained
        in a <table reference> TR is exposed by TR if and only if TR
        does not specify a <correlation name>.

似乎最好的做法是不要将AS关键字用于表别名,因为许多常用数据库不支持该关键字。


您是否有不使用'as'关键字的数据库示例?
D-Jones

3
我相信Oracle是其中之一,它不支持as表别名的关键字。
Geert Bellekens

1
“ AS关键字是可选的。别名在查询期间有效地重命名选择列表项。别名可以在order_by_clause中使用,但不能在查询中的其他子句中使用。” docs.oracle.com/cd/B28359_01/server.111/b28286/…。也相关的stackoverflow.com/a/8451257/1359796
HEDMON'Sep

2

在SQL的早期,它被选为解决重复列名的方法(请参阅以下注释)。

要从另一个答案借用查询:

SELECT P.ProductName,
       P.ProductRetailPrice,
       O.Quantity
  FROM Products AS P
       INNER JOIN Orders AS O ON O.ProductID = P.ProductID
 WHERE O.OrderID = 123456

该列ProductID(可能还有其他列)对于两个表都是公用的,并且由于联接条件语法需要引用这两个表,因此“点限定”提供了歧义。

当然,更好的解决方案是首先不要允许重复的列名!令人高兴的是,如果你使用新NATURAL JOIN语法,需要对一系列变量PO消失:

SELECT ProductName, ProductRetailPrice, Quantity
  FROM Products NATURAL JOIN Orders
 WHERE OrderID = 123456

但是,为什么AS关键字是可选的?我与SQL标准委员会成员(Joe Celko或Hugh Darwen)的个人讨论中回忆是,他们的回忆是,在定义标准时,一个供应商的产品(微软的?)要求将其包括在内,而另一个供应商的产品产品(Oracle的?)需要省略,因此选择的折衷方案是使其成为可选项。我对此没有任何引用,您要么相信我,要么不相信!


在关系模型的早期,标题并非不相交的关系的叉积(或theta-join或等联接)似乎产生了一个具有两个同名属性的关系。Codd在其关系演算中针对此问题的解决方案是使用点限定符,该限定符后来在SQL中进行了模拟(后来意识到所谓的自然联接是原始的,没有损失;也就是说,自然联接可以替换所有theta-join和甚至是乘积。)

资料来源:业务系统12,注释是休·达尔文在2011年6月2-3日在诺桑比亚大学TTM实施者研讨会上演讲幻灯片的关键。


“当然,更好的解决方案是首先不要允许重复的列名!”-因此,不应允许使用company.name和country.name吗?如果我将一张桌子自己连接起来怎么办?“在SQL的早期,它就被选择了……”您是否对此有参考?是否在某处记录了该基本原理?
鲍勃

@Bob我用注释(带引文)更新了SQL中的点限定的历史记录,加上我对AS关键字为什么是可选的(显然没有引文,显然是含糊的)的含糊含糊的回忆。休几年前退休。我认为Celko可能仍然很活跃-他的回忆会增加体重吗?证据和
书面

“他的回忆会增加体重吗?”;无需打扰塞尔科先生;BS12博士对点限定的缺点有Darwen自己的话-70年代的内存限制和重复加入对我而言从未发生过。我将承认,出于相同的原因,似乎确实很有可能使别名成为SQL。
鲍勃

0

例如,如果在SQL Server 2012中使用查询编辑器设计查询,则会得到以下信息:

  SELECT        e.EmployeeID, s.CompanyName, o.ShipName
FROM            Employees AS e INNER JOIN
                         Orders AS o ON e.EmployeeID = o.EmployeeID INNER JOIN
                         Shippers AS s ON o.ShipVia = s.ShipperID
WHERE        (s.CompanyName = 'Federal Shipping')

但是,删除AS不会产生任何变化,如下所示:

 SELECT        e.EmployeeID, s.CompanyName, o.ShipName
FROM            Employees e INNER JOIN
                         Orders o ON e.EmployeeID = o.EmployeeID INNER JOIN
                         Shippers s ON o.ShipVia = s.ShipperID
WHERE        (s.CompanyName = 'Federal Shipping')

在这种情况下,AS的使用是多余的,但在许多其他地方则需要使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.