代码之家  ›  专栏  ›  技术社区  ›  viam0Zah

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

sql
  •  120
  • viam0Zah  · 技术社区  · 14 年前

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

    SELECT * FROM table t1;
    

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

    SELECT * FROM table AS t1;
    

    他们之间有什么区别吗?

    我看到老的DBA编写语句时 作为 ,但大多数新教程都使用它。

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

    9 回复  |  直到 14 年前
        1
  •  120
  •   Sachin Shanbhag    14 年前

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

        2
  •  37
  •   Alexander    9 年前

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

    例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 使用a s关键字是一个很好的实践,也是非常推荐的,但是可以在没有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
  •  21
  •   Community CDub    7 年前

    当你不确定该选择哪种语法时,尤其是当没有太多可供选择的语法时,可以参考一本关于启发式的书。据我所知,SQL的唯一启发性书籍是“Joe Celko的SQL编程风格”:

    关联名称更常见 叫了个化名,但我会正式的。 在SQL-92中,它们可以有一个可选的 AS 操作员,应该使用 要清楚地表明 被赋予一个新的名字。[第16页]

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


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


    更新2:术语“correlation name”虽然由SQL标准使用,但并不合适。基本概念是 range variable .


    更新3:我只是重新读了塞尔科写的东西,他错了:表没有被重命名!我现在想:

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

        4
  •  12
  •   Buhake Sindi Tesnep    14 年前

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

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

    在这种情况下 Employee 桌子有一个 salary 我们只想要双倍的薪水加上一个新名字 Double Salary .

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


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

        5
  •  6
  •   Nicholas Knight    14 年前

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

    SELECT t1.colA, t2.colB, t3.colC FROM alongtablename AS t1, anotherlongtablename AS t2, yetanotherlongtablename AS t3 WHERE t1.colD = t2.colE...
    
        6
  •  4
  •   Preet Sangha    14 年前

    这是一种为实体指定相关名称的形式化方法,以便您可以在查询的另一部分中轻松地对其进行寻址。

        7
  •  3
  •   Geert Bellekens    9 年前

    这个 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>.
    

    作为 表别名的关键字,因为许多常用数据库不支持它。

        8
  •  2
  •   onedaywhen    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 语法,需要范围变量 P O 走开:

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

    但是为什么 AS 关键字可选?我在与SQL标准委员会成员(Joe Celko或Hugh Darwen)的一次个人讨论中回忆到 他们的 回想一下,在定义标准时,一个供应商的产品(微软的?)要求包括它和其他供应商的产品(Oracle的?)要求省略,所以选择的折衷方案是使其成为可选方案。我没有这个引证,你信不信我!


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

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

        9
  •  0
  •   user2063329    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是多余的,但在许多其他地方它是必需的。