Was ist der Zweck des SQL-Schlüsselworts "AS"?

137

Sie können Tabellenaliasnamen in SQL festlegen, indem Sie den Bezeichner direkt nach dem Tabellennamen eingeben.

SELECT * FROM table t1;

Sie können sogar das Schlüsselwort verwenden AS, um den Alias ​​anzugeben.

SELECT * FROM table AS t1;

Was ist der Unterschied zwischen ihnen, wenn überhaupt?

Ich sehe, dass alte DBA-Leute dazu neigen, Aussagen ohne zu schreiben AS, aber die meisten neuen Tutorials verwenden sie.

Update: Ich weiß, was der Zweck von Tabellen- und Spaltenaliasnamen ist. Ich bin gespannt, was der Grund dafür ist, ein separates Schlüsselwort zum Festlegen von Aliasen zu haben, während es auch ohne dieses funktioniert.

viam0Zah
quelle
12
Von msdn.microsoft.com/en-us/library/ms179300.aspx Die AS-Klausel ist die im ISO-Standard definierte Syntax zum Zuweisen eines Namens zu einer Ergebnismengenspalte. Dies ist die bevorzugte Syntax für SQL Server 2005.
Adriaan Stander
3
Es wird auch verwendet, um die Deklaration einer Prozedur mit ihrem Skript zu trennen. CREATE PROC Test @Param1 INT AS SELECT @Param1
Tom 'Blue' Piddock

Antworten:

134

Es gibt keinen Unterschied zwischen beiden obigen Aussagen. AS ist nur eine explizitere Art, den Alias ​​zu erwähnen

Sachin Shanbhag
quelle
10
Eigentlich gibt es keinen Unterschied in SQL, aber einige abhängige Tools / Bibliotheken können von diesem kleinen Schlüsselwort abhängen. Als Beispiel: JDBC 4.0. Abhängig von der Verwendung von Aliasen ohne 'AS-Ursache' und ohne Aliase erhalten Sie ein unterschiedliches Verhalten - siehe diese Antwort stackoverflow.com/a/4271250/814304 . Ich möchte empfehlen, IMMER die vollständige Form der Semantik zu verwenden, um solche Probleme zu vermeiden.
iMysak
Kann ich Aliase für mehr als eine Spalte haben? wie zwei Spalten mit einzelnen Aliasen?
Deepak Keynes
@ Keynes Ja. Verketten Sie einfach die Spalten (||) und geben Sie ihr einen Alias, z. B. SELECT foo || Bar AS Foobar.
Rupert Madden-Abbott
Yep @ RupertMadden-Abbott, danke! aber ich habe ein bisschen lange gewartet, ich war in Bezug auf den Kontext.
Deepak Keynes
38

Jeder, der vor mir geantwortet hat, hat Recht. Sie verwenden es als Alias-Verknüpfungsname für eine Tabelle, wenn Sie lange Abfragen oder Abfragen mit Verknüpfungen haben. Hier sind einige Beispiele.

Beispiel 1

SELECT P.ProductName,
       P.ProductGroup,
       P.ProductRetailPrice
FROM   Products AS P

Beispiel 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

Beispiel 3 Es wird empfohlen, das Schlüsselwort AS zu verwenden, und es wird sehr empfohlen, aber es ist möglich, dieselbe Abfrage ohne eines durchzuführen (und das tue ich oft).

SELECT P.ProductName,
       P.ProductRetailPrice,
       O.Quantity
FROM   Products P
LEFT OUTER JOIN Orders O ON O.ProductID = P.ProductID
WHERE  O.OrderID = 123456

Wie Sie sehen, habe ich im letzten Beispiel das Schlüsselwort AS weggelassen. Und es kann als Alias ​​verwendet werden.

Beispiel 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

Ausgabe von Beispiel 4

Product             Retail Price     Quantity Ordered
Blue Raspberry Gum  $10 pk/$50 Case  2 Cases
Twizzler            $5 pk/$25 Case   10 Cases
XstreamINsanity
quelle
21

Wenn Sie sich nicht sicher sind, welche Syntax Sie wählen sollen, insbesondere wenn es nicht viel zu trennen scheint, lesen Sie ein Buch über Heuristiken. Soweit ich weiß, ist das einzige Heuristikbuch für SQL "Joe Celkos SQL-Programmierstil":

Ein Korrelationsname wird häufiger als Alias ​​bezeichnet, aber ich werde formal sein. In SQL-92 können sie einen optionalen ASOperator haben, der verwendet werden sollte, um zu verdeutlichen, dass etwas einen neuen Namen erhält. [S. 16]

Auf diese Weise können Sie Celko die Schuld geben, wenn Ihr Team die Convention nicht mag - ich weiß, dass ich das tue;)


UPDATE 1: IIRC Oracle hat das ASSchlüsselwort (vorhergehender Korrelationsname) lange Zeit nicht unterstützt , was möglicherweise erklärt, warum einige Oldtimer es nicht gewöhnlich verwenden.


UPDATE 2: Der Begriff "Korrelationsname" ist zwar vom SQL-Standard verwendet, aber unangemessen. Das zugrunde liegende Konzept ist das einer ' Bereichsvariablen '.


UPDATE 3: Ich habe gerade noch einmal gelesen, was Celko geschrieben hat und er liegt falsch: Die Tabelle wird nicht umbenannt! Ich denke jetzt:

Ein Korrelationsname wird häufiger als Alias ​​bezeichnet, aber ich werde formal sein. In Standard SQL können sie ein optionales ASSchlüsselwort haben, das jedoch nicht verwendet werden sollte, da es den Eindruck erwecken kann, dass etwas umbenannt wird, wenn dies nicht der Fall ist. Tatsächlich sollte es weggelassen werden, um den Punkt zu erzwingen, dass es sich um eine Bereichsvariable handelt.

eines Tages, wenn
quelle
12

Das ASSchlüsselwort besteht darin, Ihrer Datenbanktabelle oder der Tabellenspalte einen ALIAS- Namen zu geben . In Ihrem Beispiel sind beide Anweisungen korrekt, aber es gibt Umstände, unter denen eine AS-Klausel erforderlich ist (obwohl der ASOperator selbst optional ist), z

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

In diesem Fall hat die EmployeeTabelle eine salarySpalte und wir wollen nur das Doppelte des Gehalts mit einem neuen NamenDouble Salary .

Entschuldigung, wenn meine Erklärung nicht wirksam ist.


Update basierend auf Ihrem Kommentar, Sie haben Recht, meine vorherige Aussage war ungültig. Der einzige Grund, an den ich denken kann, ist, dass die ASKlausel in der SQL-Welt schon lange existiert und aus Gründen der Abwärtskompatibilität in das heutige RDMS integriert wurde.

Buhake Sindi
quelle
3
Nein, ASist auch in diesem Fall nicht erforderlich oder erforderlich. Versuchen Sie es SELECT 1 + 1 "result".
viam0Zah
6

Die Verwendung ist offensichtlicher, wenn Sie nicht 'SELECT *' verwenden (was eine schlechte Angewohnheit ist, aus der Sie herauskommen sollten):

SELECT t1.colA, t2.colB, t3.colC FROM alongtablename AS t1, anotherlongtablename AS t2, yetanotherlongtablename AS t3 WHERE t1.colD = t2.colE...
Nicholas Knight
quelle
1
Ich weiß, was der Zweck von Tabellenaliasnamen ist. Ich bin gespannt, was der Grund dafür ist, ein separates Schlüsselwort zum Festlegen von Aliasen zu haben, während es auch ohne dieses funktioniert.
viam0Zah
4

Es ist eine formale Methode, einen Korrelationsnamen für eine Entität anzugeben, damit Sie ihn problemlos in einem anderen Teil der Abfrage adressieren können.

Preet Sangha
quelle
3

In ASdiesem Fall handelt es sich um ein optionales Schlüsselwort, das in ANSI SQL 92 definiert ist, um einen <<correlation name>allgemein als Alias für eine Tabelle bekannten Schlüsselwort zu definieren .

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

Es scheint eine bewährte Methode zu sein, das ASSchlüsselwort NICHT für Tabellenaliasnamen zu verwenden, da es von einer Reihe häufig verwendeter Datenbanken nicht unterstützt wird.

Geert Bellekens
quelle
Haben Sie Beispiele für dbs, die das Schlüsselwort 'as' nicht verwenden?
D-Jones
3
Ich glaube, Oracle ist einer von ihnen, der das asSchlüsselwort für Tabellenaliasnamen nicht unterstützt .
Geert Bellekens
1
"Das Schlüsselwort AS ist optional. Der Alias ​​benennt das Auswahllistenelement für die Dauer der Abfrage effektiv um. Der Alias ​​kann in der order_by_clause verwendet werden, jedoch nicht in anderen Klauseln in der Abfrage." docs.oracle.com/cd/B28359_01/server.111/b28286/… . Auch verwandte stackoverflow.com/a/8451257/1359796
HEDMON
2

In den frühen Tagen von SQL wurde es als Lösung für das Problem des Umgangs mit doppelten Spaltennamen ausgewählt (siehe Hinweis unten).

So leihen Sie eine Anfrage von einer anderen Antwort aus:

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

Die Spalte ProductID(und möglicherweise andere) ist beiden Tabellen gemeinsam, und da die Syntax der Verknüpfungsbedingung einen Verweis auf beide erfordert, bietet die 'Punktqualifizierung' eine Begriffsklärung.

Die bessere Lösung war natürlich, niemals doppelte Spaltennamen zuzulassen! Glücklicherweise, wenn Sie die neuere NATURAL JOINSyntax verwenden, wird die Notwendigkeit für die Bereichsvariablen Pund Overschwindet:

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

Aber warum ist das ASSchlüsselwort optional? Ich erinnere mich an eine persönliche Diskussion mit einem Mitglied des SQL-Standardausschusses (entweder Joe Celko oder Hugh Darwen), dass sie sich daran erinnerten, dass zum Zeitpunkt der Definition des Standards das Produkt eines Anbieters (Microsoft?) Die Aufnahme und eines anderen Anbieters die Aufnahme erforderte Das Produkt (Oracle?) musste weggelassen werden. Der gewählte Kompromiss bestand darin, es optional zu machen. Ich habe kein Zitat dafür, du glaubst mir entweder oder nicht!


In den frühen Tagen des relationalen Modells schien das Kreuzprodukt (oder Theta-Join oder Equi-Join) von Beziehungen, deren Überschriften nicht disjunkt sind, eine Beziehung mit zwei gleichnamigen Attributen zu erzeugen; Codds Lösung für dieses Problem in seinem relationalen Kalkül war die Verwendung der Punktqualifikation, die später in SQL emuliert wurde (später wurde erkannt, dass die sogenannte natürliche Verknüpfung ohne Verlust primitiv war, dh die natürliche Verknüpfung kann alle Theta-Verknüpfungen und ersetzen sogar Kreuzprodukt.)

Quelle: Business System 12, Notizen zu Folien der Präsentation, die Hugh Darwen auf dem TTM Implementers 'Workshop der University of Northumbria vom 2. bis 3. Juni 2011 gehalten hat

eines Tages, wenn
quelle
"Natürlich war die bessere Lösung, niemals doppelte Spaltennamen zuzulassen!" - also sollten Firmenname und Ländername nicht erlaubt sein? und was wäre, wenn ich mich an einen Tisch setzen würde? "In den frühen Tagen von SQL wurde es gewählt ..." Haben Sie eine Referenz dafür / ist diese Begründung irgendwo dokumentiert?
Bob
@Bob Ich habe meine Antwort mit einem Hinweis (mit Zitierweise) zum Verlauf der Punktqualifizierung in SQL sowie meiner zugegebenermaßen vagen Erinnerung daran, warum das ASSchlüsselwort optional ist (offensichtlich ohne Zitierweise!) Aktualisiert . Hugh ging vor einigen Jahren in den Ruhestand. Ich denke, Celko könnte noch aktiv sein - würden seine Erinnerungen Gewicht hinzufügen? Beweise und Papierspur existieren einfach nicht :(
am
"Würden seine Erinnerungen Gewicht hinzufügen?"; Keine Notwendigkeit, Herrn Celko zu stören; Das BS12-Dokument enthält Darwens eigene Worte zu den Mängeln der Punktqualifizierung - Speicherbeschränkungen der 70er Jahre und wiederholte Verknüpfungen waren mir nicht in den Sinn gekommen. Ich werde zugeben, dass es aus dem gleichen Grund sehr wahrscheinlich erscheint, dass Aliasing es in SQL geschafft hat.
Bob
0

Wenn Sie beispielsweise eine Abfrage mit dem Abfrageeditor in SQL Server 2012 entwerfen, erhalten Sie Folgendes:

  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')

Das Entfernen des AS macht jedoch keinen Unterschied wie im Folgenden:

 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')

In diesem Fall ist die Verwendung von AS überflüssig, wird jedoch an vielen anderen Stellen benötigt.

user2063329
quelle