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

Posted

技术标签:

【中文标题】SQL关键字“AS”的用途是啥?【英文标题】:What's the purpose of SQL keyword "AS"?SQL关键字“AS”的用途是什么? 【发布时间】:2010-11-12 12:34:28 【问题描述】:

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

SELECT * FROM table t1;

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

SELECT * FROM table AS t1;

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

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

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

【问题讨论】:

来自msdn.microsoft.com/en-us/library/ms179300.aspx AS 子句是ISO 标准中定义的用于为结果集列分配名称的语法。这是在 SQL Server 2005 中使用的首选语法。 它还用于将过程的声明与其脚本分开。 CREATE PROC Test @Param1 INT AS SELECT @Param1 【参考方案1】:

以上两种说法没有区别。 AS 只是一种更明确的提及别名的方式

【讨论】:

其实SQL没有什么区别,但是一些依赖的工具/库可以依赖这个小关键字。例如:JDBC 4.0。根据使用带“AS 原因”的别名和不带的别名,您将收到不同的行为 - 请参阅此答案 ***.com/a/4271250/814304。我想建议始终使用完整形式的语义来避免此类问题。 我可以为多个列设置别名吗?比如,两列有一个别名? @Keynes 是的。只需连接 (||) 列,然后给它一个别名,例如选择富 || bar AS foobar. 是的@RupertMadden-Abbott,谢谢!但我等了有点久,我是在上下文方面。 select 中的别名不能在 where 子句中使用,但在 from ... as X 中可以在 where 子句中使用【参考方案2】:

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

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

【讨论】:

【参考方案3】:

当您不确定选择哪个语法,尤其是在似乎没有太多的选择时,请在启发式中咨询一本书。据我所知,关于 SQL 的唯一启发式书籍是“Joe Celko 的 SQL 编程风格”:

关联名称更常见 称为别名,但我会正式。 在 SQL-92 中,它们可以有一个可选的 AS 运算符,应该使用 清楚地表明某事是 被赋予了新的名字。 [p16]

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


UPDATE 1:IIRC长期以来,Oracle不支持AS(前置相关名)关键字,这也许可以解释为什么一些老前辈不习惯使用它。


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


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

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

【讨论】:

【参考方案4】:

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

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

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

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


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

【讨论】:

不,AS 不是必需的,即使在这种情况下也不需要。试试SELECT 1 + 1 "result"【参考方案5】:

如果你不使用'SELECT *'(这是你应该改掉的坏习惯),使用会更明显:

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

【讨论】:

我知道表别名的目的是什么。我很好奇,为什么有一个单独的关键字来设置别名,而没有它也可以工作。【参考方案6】:

在 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)的个人讨论中,我的回忆是,他们的回忆是,在定义标准时,一个供应商的产品(Microsoft 的? ) 要求包含它,而另一个供应商的产品(Oracle 的?)要求省略它,因此选择的折衷方案是使其可选。我对此没有任何引用,你要么相信我,要么不相信!


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

来源: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

【讨论】:

“当然,更好的解决方案是从一开始就不允许重复的列名!” - 所以不应该允许 company.name 和 country.name 吗?如果我将一张桌子加入到自己身上怎么办? “在 SQL 的早期,它被选择了......”你对此有参考吗/这个理由是否记录在某处? @Bob 我已经用 SQL 中点限定的历史的注释(带引用)更新了我的答案,加上我公认的模糊回忆为什么 AS 关键字是可选的(没有引用,明显地!)。休几年前退休了。我认为 Celko 可能仍然很活跃——他的回忆会增加重量吗?证据和书面记录根本不存在:( "他的回忆会增加分量吗?";无需打扰塞尔科先生; BS12 文档对点限定的缺点有 Darwen 自己的话 - 我没有想到 70 年代的内存限制和重复连接。我承认,出于同样的原因,别名似乎很有可能进入 SQL。【参考方案7】:

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

【讨论】:

【参考方案8】:

本例中的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'关键字的dbs例子? 我相信 Oracle 是不支持表别名的 askeyword 的其中之一。 "AS 关键字是可选的。别名在查询期间有效地重命名选择列表项。别名可以在 order_by_clause 中使用,但不能在查询中的其他子句中使用。" docs.oracle.com/cd/B28359_01/server.111/b28286/… 。也相关***.com/a/8451257/1359796 我想说最好的做法是始终包含 AS 关键字。【参考方案9】:

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

【讨论】:

以上是关于SQL关键字“AS”的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 路由中的“as”关键字是啥意思?

Java 中 main() 方法中 public static 关键字的用途是啥?

更新数据表的关键字是啥

as关键词还有另外一个用途,那就是修改 方法 的访问控制

Sid 属性在关键策略中的用途是啥?

oracle中as是啥意思