2010-11-12 49 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