SQLキーワード「AS」の目的は何ですか?


137

SQLでテーブルのエイリアスを設定するには、テーブル名の直後に識別子を入力します。

SELECT * FROM table t1;

キーワードASを使用してエイリアスを示すこともできます。

SELECT * FROM table AS t1;

もしあれば、それらの違いは何ですか?

古いDBAはをAS使用せずにステートメントを書く傾向がありますが、新しいチュートリアルのほとんどはそれを使用しています。

更新:テーブルと列のエイリアスの目的は何ですか。それがなくてもエイリアスを設定するために別のキーワードを設定する理由は何ですか?


12
msdn.microsoft.com/en-us/library/ms179300.aspx からAS句は、結果セット列に名前を割り当てるためにISO標準で定義されている構文です。これは、SQL Server 2005のでの使用に好適な構文である
アドリアンスタンダー

3
プロシージャの宣言とそのスクリプトを分離するためにも使用されます。CREATE PROC Test @Param1 INT AS SELECT @Param1
トム「ブルー」ピドック

回答:


134

上記の両方のステートメントに違いはありません。ASは、エイリアスを言及するより明示的な方法です


10
実際には、SQLに違いはありませんが、一部の依存ツール/ライブラリは、この小さなキーワードに依存しています。例:JDBC 4.0。'AS原因'とw / oのないエイリアスの使用に応じて、異なる動作を受け取ります-この回答を参照してくださいstackoverflow.com/a/4271250/814304。このような問題を回避するために、常に完全形式のセマンティックを使用することをお勧めします。
iMysak

複数の列にエイリアスを設定できますか?のように、単一のエイリアスを持つ2つの列?
Deepakケインズ2017

@ケインズはい。列を連結(||)して、エイリアスを指定するだけです。例:SELECT foo || AS foobar。
Rupert Madden-Abbott

はい、@ RupertMadden-Abbott、ありがとう!でも、少し長く待っていました。
Deepakケインズ

38

私の前に答えた誰もが正しいです。これは、長いクエリや結合を含むクエリがある場合に、テーブルのエイリアスショートカット名として使用します。ここにいくつかの例があります。

例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

21

どの構文を選択すればよいかわからない場合、特に、選択を分離するのにそれほど多くないと思われる場合は、ヒューリスティックスに関する本を参照してください。私の知る限り、SQLの唯一のヒューリスティックな本は「ジョーセルコのSQLプログラミングスタイル」です。

相関名はエイリアスと呼ばれることがよくありますが、正式な名前になります。SQL-92では、オプションの AS演算子を使用できます。これは、何かに新しい名前が付けられていることを明確にするために使用する必要があります。[p16]

このようにして、もしあなたのチームがこの大会が気に入らなければ、あなたはセルコを非難することができます-私は知っていますよ;)


更新1:IIRCは長い間、OracleはAS(前の相関名)キーワードをサポートしていませんでした。これは、一部の古いタイマーが常用していない理由を説明している可能性があります。


更新2:「相関名」という用語は、SQL標準では使用されていますが、不適切です。基本的な概念は、「範囲変数」の概念です。


更新3:セルコが書いたものをもう一度読んだところ、彼は間違っています。テーブルの名前が変更されていません!私は今考えます:

相関名はエイリアスと呼ばれることがよくありますが、正式な名前になります。標準SQLではオプションのASキーワードを使用できますが、名前が変更されていないときに名前が変更されているような印象を与える可能性があるため、使用しないでください。実際には、それが範囲変数であるという点を強制するために省略されるべきです。


12

ASキーワードは与えることですALIASのデータベーステーブルまたはテーブルのカラムに名前を。あなたの例では、両方のステートメントは正しいですが、AS句が必要な状況があります(AS演算子自体はオプションですが)。たとえば、

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

この場合、Employeeテーブルにはsalary列があり、給与の2倍に新しい名前を付けDouble Salaryます。

私の説明が効果的でない場合は申し訳ありません。


コメントに基づいて更新してください、そうです、私の以前の声明は無効でした。私が考えることができる唯一の理由は、このAS句がSQLの世界で長く存在していて、下位互換性のために現在RDMSに組み込まれていることです。


3
いいえ、ASこの場合でも必要ありません。お試しくださいSELECT 1 + 1 "result"
viam0Zah 2010年

6

「SELECT *」を使用しない場合は、使用がより明白になります(これは、回避すべき悪い習慣です)。

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

1
テーブルエイリアスの目的は何ですか。それがなくてもエイリアスを設定するために別のキーワードを設定する理由は何ですか?
viam0Zah 2010年

4

これは、エンティティの相関名を指定する正式な方法であるため、クエリの別の部分で簡単にアドレス指定できます。


3

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」キーワードを使用しないdbの例はありますか?
D-Jones

3
Oracleはas、テーブルエイリアスのキーワードをサポートしないものの1つだと思います。
Geert Bellekens、2016年

1
「ASキーワードはオプションです。エイリアスは、クエリの期間中、選択リスト項目の名前を効果的に変更します。エイリアスは、order_by_clauseで使用できますが、クエリの他の句では使用できません。」docs.oracle.com/cd/B28359_01/server.111/b28286/…。関連するstackoverflow.com/a/8451257/1359796
HEDMON

2

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標準委員会(ジョー・セルコやヒュー・ダーウィンのいずれか)のメンバーとの個人的な議論から私の記憶ではということでした彼らの、標準を定義する時に、回想はということでした1つのベンダーの製品(Microsoftの?)その含めると他のベンダーのを必要と製品(Oracleの?)は省略を必要としたため、選択された妥協案はそれをオプションにすることでした。これについての引用はありません。あなたは私を信じるか信じないかです!


リレーショナルモデルの初期の頃は、見出しが互いに素ではない関係の外積(またはシータ結合または等結合)は、同じ名前の2つの属性を持つ関係を生成するように見えました。彼のリレーショナル計算におけるこの問題に対するCoddの解決策は、ドット修飾を使用することでしたが、これは後でSQLでエミュレートされました(いわゆる自然結合は損失のない原始的なものであることが後に判明しました。つまり、自然結合はすべてのシータ結合とクロス積です。)

出典:Business System 12、ノーサンブリア大学TTM Implementers 'Workshop、2011年6月2〜3日、Hugh Darwenによるプレゼンテーションのスライドに合わせたメモ


「もちろん、より良い解決策は、最初から重複する列名を決して許可しないことでした!」-したがって、company.nameとcountry.nameは許可されるべきではありませんか?テーブルを自分自身に結合している場合はどうなりますか?「SQLの初期の頃には、SQLが選択されました...」これについてのリファレンスはありますか/この理論的根拠はどこかに文書化されていますか?
ボブは

@ボブSQLのドット修飾の履歴のメモ(引用付き)と、ASキーワードがオプションである理由の明確な漠然とした記憶(引用なし、明らかに!)で回答を更新しました。ヒューは数年前に引退しました。セルコはまだアクティブかもしれないと思う-彼の回想は重みを増すだろうか?証拠と紙の証跡は存在しません:(
1

「彼の記憶は重みを増すでしょうか?」; セルコ氏を悩ます必要はありません。BS12のドキュメントには、ドット修飾の欠点に関するDarwen自身の言葉があります。70年代のメモリの制約と繰り返しの結合は私には起こりませんでした。同じ理由で、エイリアスがSQLになった可能性が非常に高いようです。
Bob

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の使用は不必要ですが、他の多くの場所では必要になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.