2010-11-12 54 views
89

您可以在SQL中设置表别名,在表名后面输入标识符。SQL关键字“AS”的用途是什么?

SELECT * FROM table t1; 

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

SELECT * FROM table AS t1; 

它们之间有什么区别?

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

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

+10

从http://msdn.microsoft.com/en-us/library/ms179300.aspx *的AS子句是ISO标准中为结果集列指定名称所定义的语法。这是在SQL Server 2005中使用的首选语法。* – 2010-11-12 12:47:57

+3

它也用于将过程的声明与其脚本分开。 'CREATE PROC Test @Param1 INT AS SELECT @Param1' – 2010-11-12 14:20:50

回答

81

上述两个陈述之间没有区别。 AS只是提别名更明确的方式

+33

显式总是很好:P – annakata 2010-11-12 13:51:17

+4

实际上,SQL没有区别,但是一些依赖工具/库可以依赖这个小关键字。例如:JDBC 4.0。根据使用别名W /'AS原因'和W/O你会收到不同的行为 - 看到这个答案http://stackoverflow.com/a/4271250/814304。我想推荐总是使用完整的语义形式来避免这些问题。 – iMysak 2016-08-22 22:24:42

+0

我可以拥有多个列的别名吗?像两列单个别名? – Keynes 2017-12-30 06:03:53

3

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

4

使用更加明显,如果你不使用“SELECT *”(这是一个坏习惯,你应该得到的):

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

我知道表别名的用途是什么。我很好奇,是什么原因有一个单独的关键字设置别名,而它没有它的工作。 – 2010-11-12 12:42:34

10

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

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

在这种情况下,Employee表中有一栏salary,我们只是希望工资用新名称Double Salary的两倍。

对不起,如果我的解释没有效果。


更新根据您的意见,你说得对,我以前的声明是无效的。我能想到的唯一原因是,AS子句在SQL世界中已经存在了很长时间,它现在已经被纳入RDMS以实现向后兼容。

+2

不,在这种情况下,不需要或不需要“AS”。尝试'SELECT 1 + 1“结果”'。 – 2010-11-12 12:53:01

27

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

例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 
19

的输出当你不知道选择哪个语法,尤其是当有似乎并没有被太多分开选择,参考启发式方面的书。据我所知,唯一的启发书,SQL是“乔·塞科的SQL编程风格”:

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

这样一来,如果你的球队不喜欢的习惯,你可以责怪Celko - 我知道我这样做;)


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


更新2:尽管SQL标准使用了术语“相关名称”,但这并不合适。基本概念是'range variable'。


更新3:我只是重新读了Celko写的,他错了:表格没有被重命名!我现在认为:

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

1

在这种情况下的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关键字,因为它不是由一些常用的数据库的支持。

+0

你有没有使用'as'关键字的dbs的例子? – 2016-06-07 18:48:37

+0

我相信Oracle是其中一个不支持表的别名的“as”关键字。 – 2016-06-07 18:58:49

+0

“AS关键字是可选的,别名在查询期间有效地重命名选择列表项。别名可以在order_by_clause中使用,但不在查询中使用其他子句。” http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm。还相关http://stackoverflow.com/a/8451257/1359796 – HEDMON 2016-09-08 07:48:49

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是多余的,但在许多其他地方它是需要的。

0

在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