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

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

SELECT * FROM table t1;

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

SELECT * FROM table AS t1;

他们之间有什么区别吗?

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

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

201526 次浏览

它是为实体指定相关名称的一种正式方法,这样您就可以轻松地在查询的另一部分中处理它。

上述两种说法之间没有区别。 AS 只是提到别名的一种更明确的方式

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

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

AS关键字是为数据库表或表列赋予一个 化名名称。在您的示例中,这两个语句都是正确的,但是在某些情况下需要 AS 子句(尽管 AS操作符本身是可选的) ,例如。

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

在这种情况下,Employee表有一个 salary列,我们只需要一个新名称 Double Salary的工资的两倍。

对不起,如果我的解释不起作用。


根据你的评论更新 ,你是对的,我之前的声明是无效的。我能想到的唯一原因是,AS子句在 SQL 世界已经存在了很长时间,现在它已经被用于 RDMS 的向下兼容。.

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

例子一

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

当你不确定要选择哪种语法时,尤其是看起来没有多少可以分开选择的时候,请参考一本关于启发法的书。据我所知,SQL 唯一的启发式教程是“ Joe Celko 的 SQL 编程风格”:

相关名称更为常见 叫化名,但我会很正式的。 在 SQL-92中,它们可以有一个可选的 AS操作符,并且应该使用 来表明某些事情 被给予一个新的名字。[ p16]

这样,如果你的团队不喜欢这个大会,你可以责怪 Celko ——我知道我喜欢;)


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


UPDATE2: 术语“关联名称”虽然由 SQL 标准使用,但是并不合适。基本概念是“ 范围变量范围变量范围变量”。


更新3: 我刚刚重新读了 Celko 写的内容,他错了: 表没有被重命名!我现在想:

相关名称通常称为别名,但我将使用正式的名称。在标准 SQL 中,它们可以有一个可选的 AS关键字,但是不应该使用它,因为它可能给人的印象是,有些东西正在被重命名,而实际上并非如此。事实上,为了强制执行它是一个范围变量这一点,应该省略它。

本例中的 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关键字似乎是一种最佳做法,因为许多常用的数据库都不支持它。

例如,如果使用 SQLServer2012中的查询编辑器设计查询,您将得到以下结果:

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

在 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)进行了一次私人讨论,我的回忆是,在定义标准的时候,他们的是一个厂商的产品(微软的?)需要包括其他供应商的产品(甲骨文?)所以选择的折衷方案是让它成为可选的。我没有这个传票,你要么相信我,要么不!


在关系模型的早期,标题没有不相交的关系的 cross product (或 theta-join 或 equi-join)似乎产生了具有相同名称的两个属性的关系,Codd 在他的关系演算中解决这个问题的方法是使用 dot 限定,后来在 SQL 中得到了仿效(后来人们意识到,所谓的自然 join 是原始的,没有损失,也就是说,自然 join 可以取代所有 theta-join,甚至 cross product。)

资料来源: 《商业系统12》 ,2011年6月2日至3日在诺森比亚大学 TTM 实施者研讨会上由休 · 达尔文(Hugh Darwen)制作的演讲幻灯片