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

时间:2010-11-12 12:34:28

标签: sql

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

SELECT * FROM table t1;

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

SELECT * FROM table AS t1;

如果有的话,它们之间有什么区别?

我看到老DBA的人倾向于在没有AS的情况下编写语句,但大多数新教程都使用它。

更新:我知道表和列别名的用途是什么。我很好奇,有什么原因可以设置一个单独的关键字来设置别名,而不管它也可以。

9 个答案:

答案 0 :(得分:113)

上述两个陈述之间没有区别。 AS只是提及别名

的一种更明确的方式

答案 1 :(得分:34)

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

示例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关键字是一个很好的做法,非常推荐,但是没有一个可以执行相同的查询(我经常这样做)。

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

答案 2 :(得分:20)

如果您不确定选择哪种语法,尤其是在选项分离似乎不多的情况下,请参阅有关启发式的书籍。据我所知,SQL的唯一启发式书是'Joe Celko的SQL编程风格':

  

相关名称更常见   称为别名,但我会正式的。   在SQL-92中,它们可以有一个可选项   AS运算符,应该使用它   明确表达某些事情   被赋予一个新名字。 [P16]

这样,如果你的团队不喜欢这个惯例,你可以责怪Celko--我知道我这样做;)


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


更新2:术语“相关名称”虽然由SQL标准使用,但却不合适。基本概念是“range variable”。


更新3:我刚刚重新阅读了Celko所写的内容并且他错了:该表未被重命名!我现在想:

  

相关名称通常被称为别名,但我将是正式的。在标准SQL中,他们可以使用可选的AS关键字,但不应该使用它,因为它可能会给人的印象是某些内容正在被重命名。实际上,应该省略它以强制它是一个范围变量。

答案 3 :(得分:13)

AS关键字是为数据库表或表列提供 ALIAS 名称。在您的示例中,两个语句都是正确的,但是存在需要AS子句的情况(尽管AS运算符本身是可选的),例如。

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

在这种情况下,Employee表格有一个salary列,我们只想要一个新名称为Double Salary的薪水的两倍。

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


根据您的评论

更新,您说得对,我之前的陈述无效。我能想到的唯一原因是AS子句已经在SQL世界中存在了很长时间,它已被合并到现在的RDMS中以实现向后兼容性。

答案 4 :(得分:6)

如果你不使用'SELECT *'(这是一个你应该摆脱的坏习惯),使用会更加明显:

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

答案 5 :(得分:4)

这是为实体指定相关名称的正式方式,以便您可以在查询的其他部分轻松解决该问题。

答案 6 :(得分:3)

在这种情况下,ASANSI 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关键字用于表别名,因为许多常用数据库不支持它。

答案 7 :(得分:1)

在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或equi-join)似乎与两个同名属性产生关系; Codd在他的关系演算中对这个问题的解决方案是使用点限定,后来在SQL中进行了模拟(后来发现所谓的自然连接是原始的而没有丢失;也就是说,自然连接可以取代所有的-ta连接和甚至跨产品。)

来源:Business System 12, Notes keyed to slides of the presentation given at TTM Implementers’ Workshop, University of Northumbria, 2-3 June 2011 by Hugh Darwen

答案 8 :(得分: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是多余的,但在许多其他地方需要它。