Jaki jest cel słowa kluczowego SQL „AS”?


137

Możesz ustawić aliasy tabel w języku SQL, wpisując identyfikator bezpośrednio po nazwie tabeli.

SELECT * FROM table t1;

Możesz nawet użyć słowa kluczowego, ASaby wskazać alias.

SELECT * FROM table AS t1;

Jaka jest różnica między nimi, jeśli w ogóle?

Widzę, że starzy ludzie DBA mają tendencję do pisania oświadczeń bez AS, ale większość nowych tutoriali używa go.

Aktualizacja: wiem, jaki jest cel aliasów tabel i kolumn. Jestem ciekawy, jaki jest powód posiadania oddzielnego słowa kluczowego do ustawiania aliasów, podczas gdy działa również bez niego.


12
Od msdn.microsoft.com/en-us/library/ms179300.aspx Klauzula AS to składnia zdefiniowana w standardzie ISO do przypisywania nazwy do kolumny zestawu wyników. Jest to składnia preferowana do użycia w SQL Server 2005.
Adriaan Stander

3
Służy również do oddzielania deklaracji procedury od jej skryptu. CREATE PROC Test @Param1 INT AS SELECT @Param1
Tom 'Blue' Piddock

Odpowiedzi:


134

Nie ma różnicy między tymi dwoma stwierdzeniami powyżej. AS to po prostu bardziej wyraźny sposób podania aliasu


10
W rzeczywistości nie ma różnicy w SQL, ale niektóre zależne narzędzia / biblioteki mogą być zależne od tego małego słowa kluczowego. Na przykład: JDBC 4.0. W zależności od korzystania z aliasów z opcją „AS przyczyna” i bez niej otrzymasz inne zachowanie - zobacz tę odpowiedź stackoverflow.com/a/4271250/814304 . Polecam ZAWSZE korzystać z pełnej formy semantycznej, aby uniknąć takich problemów.
iMysak

Czy mogę mieć aliasy dla więcej niż jednej kolumny? na przykład dwie kolumny z pojedynczymi aliasami?
Deepak Keynes

@Keynes Yes. Po prostu połącz (||) kolumny i nadaj im alias, np. SELECT foo || bar AS foobar.
Rupert Madden-Abbott

Tak @ RupertMadden-Abbott, dzięki! ale czekałem trochę długo, byłem w kontekście.
Deepak Keynes,

38

Każdy, kto odpowiedział przede mną, ma rację. Używasz go jako nazwy skrótu aliasu dla tabeli, gdy masz długie zapytania lub zapytania, które mają łączenia. Oto kilka przykładów.

Przykład 1

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

Przykład 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

Przykład 3 Dobrą praktyką jest użycie słowa kluczowego AS i jest to bardzo zalecane, ale możliwe jest wykonanie tego samego zapytania bez niego (i często to robię).

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

Jak widać, w ostatnim przykładzie pominąłem słowo kluczowe AS. I może być używany jako alias.

Przykład 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

Wynik przykładu 4

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

21

Jeśli nie masz pewności, którą składnię wybrać, zwłaszcza gdy wydaje się, że nie ma zbyt wiele do rozdzielenia wyborów, zajrzyj do książki o heurystyce. O ile wiem, jedyną książką heurystyczną dotyczącą SQL jest „Styl programowania SQL Joe Celko”:

Nazwa korelacji jest częściej nazywana aliasem, ale będę formalny. W SQL-92 mogą mieć opcjonalny ASoperator i należy go użyć, aby było jasne, że coś otrzymuje nową nazwę. [p16]

W ten sposób, jeśli Twojemu zespołowi nie podoba się konwencja, możesz winić Celko - wiem, że tak


UPDATE 1: IIRC przez długi czas, Oracle nie obsługiwał ASsłowa kluczowego (poprzedzająca nazwę korelacji), co może wyjaśniać, dlaczego niektóre stare zegary nie używają go zwykle.


AKTUALIZACJA 2: termin „nazwa korelacji”, mimo że jest używany w standardzie SQL, jest niewłaściwy. Podstawową koncepcją jest „ zmienna zakresu ”.


AKTUALIZACJA 3: Właśnie ponownie przeczytałem to, co napisał Celko, a on się myli: nazwa stołu nie jest zmieniana! Myślę teraz:

Nazwa korelacji jest częściej nazywana aliasem, ale będę formalny. W standardowym SQL mogą mieć opcjonalne ASsłowo kluczowe, ale nie należy go używać, ponieważ może to sprawiać wrażenie, że coś jest zmieniane, gdy tak nie jest. W rzeczywistości należy go pominąć, aby narzucić punkt, że jest to zmienna zakresu.


12

ASKluczowe jest, aby dać ALIAS nazwę tabeli bazy danych lub kolumny tabeli. W Twoim przykładzie obie instrukcje są poprawne, ale są okoliczności, w których wymagana jest klauzula AS (chociaż ASsam operator jest opcjonalny), np.

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

W tym przypadku Employeetabela ma salarykolumnę i chcemy po prostu podwoić wynagrodzenie z nową nazwą Double Salary.

Przepraszam, jeśli moje wyjaśnienie nie jest skuteczne.


Zaktualizuj na podstawie twojego komentarza, masz rację, moje poprzednie oświadczenie było nieważne. Jedynym powodem, ASdla którego przychodzi mi do głowy, jest to, że klauzula istnieje od dawna w świecie SQL i została włączona do dzisiejszych RDMS w celu zapewnienia kompatybilności wstecznej.


3
Nie, ASnie jest wymagane ani potrzebne nawet w tym przypadku. Spróbuj SELECT 1 + 1 "result".
viam0Zah

6

Użycie jest bardziej oczywiste, jeśli nie używasz 'SELECT *' (co jest złym nawykiem, z którego powinieneś się zerwać):

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

1
Wiem, do czego służą aliasy tabel. Jestem ciekawy, jaki jest powód posiadania oddzielnego słowa kluczowego do ustawiania aliasów, podczas gdy działa również bez niego.
viam0Zah

4

Jest to formalny sposób określenia nazwy korelacji dla jednostki, dzięki czemu można ją łatwo zaadresować w innej części zapytania.


3

W AStym przypadku jest to opcjonalne słowo kluczowe zdefiniowane w ANSI SQL 92 w celu zdefiniowania <<correlation name>, powszechnie znanego jako alias tabeli.

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

Wydaje się, że najlepszą praktyką NIE jest używanie ASsłowa kluczowego dla aliasów tabel, ponieważ nie jest ono obsługiwane przez wiele powszechnie używanych baz danych.


Czy masz jakieś przykłady DB, które nie używają słowa kluczowego „as”?
D-Jones

3
Uważam, że Oracle jest jednym z nich, który nie obsługuje assłowa kluczowego dla aliasów tabel.
Geert Bellekens

1
„Słowo kluczowe AS jest opcjonalne. Alias ​​skutecznie zmienia nazwę elementu listy wyboru na czas trwania zapytania. Alias ​​może być używany w klauzuli order_by_clause, ale nie w innych klauzulach w zapytaniu”. docs.oracle.com/cd/B28359_01/server.111/b28286/… . Powiązane również stackoverflow.com/a/8451257/1359796
HEDMON

2

We wczesnych latach SQL został wybrany jako rozwiązanie problemu radzenia sobie ze zduplikowanymi nazwami kolumn (patrz uwaga poniżej).

Aby wypożyczyć zapytanie z innej odpowiedzi:

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

Kolumna ProductID(i być może inne) jest wspólna dla obu tabel, a ponieważ składnia warunku łączenia wymaga odniesienia do obu, „kwalifikacja kropkowa” zapewnia ujednoznacznienie.

Oczywiście lepszym rozwiązaniem było to, aby nigdy nie dopuścić do powielania nazw kolumn! Na szczęście, jeśli używasz nowszej NATURAL JOINskładni, potrzeba zmiennych zakresu Pi Oznika:

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

Ale dlaczego ASsłowo kluczowe jest opcjonalne? Moje wspomnienie z osobistej dyskusji z członkiem komitetu ds. Standardu SQL (Joe Celko lub Hugh Darwen) było takie, że ich wspomnienie było takie, że w czasie definiowania standardu, produkt jednego dostawcy (Microsoft?) Wymagał jego włączenia, a innego produkt (Oracle?) wymagał jego pominięcia, więc wybrany kompromis był opcjonalny. Nie mam na to żadnego cytatu, albo mi wierzysz, albo nie!


We wczesnych dniach modelu relacyjnego iloczyn krzyżowy (lub łączenie theta lub łączenie równe) relacji, których nagłówki nie są rozłączne, wydawał się tworzyć relację z dwoma atrybutami o tej samej nazwie; Rozwiązaniem tego problemu Codda w jego rachunku relacyjnym było zastosowanie kwalifikacji kropkowej, która została później emulowana w języku SQL (później zdano sobie sprawę, że tak zwane sprzężenie naturalne jest prymitywne bez utraty; to znaczy, sprzężenie naturalne może zastąpić wszystkie łączenia theta i nawet iloczynu krzyżowego).

Źródło: Business System 12, przypisy do slajdów z prezentacji przedstawionej na warsztatach TTM Implementers 'Workshop, University of Northumbria, 2-3 czerwca 2011, autorstwa Hugh Darwena


„Oczywiście lepszym rozwiązaniem było to, aby nigdy nie dopuścić do zduplikowania nazw kolumn w pierwszej kolejności!” - więc nie powinno się zezwalać na używanie nazwy company.name i country.name? a co gdybym dołączył do stołu dla siebie? „Na początku SQL został wybrany ...” czy masz odniesienie do tego / czy to uzasadnienie jest gdzieś udokumentowane?
Bob

@Bob Zaktualizowałem moją odpowiedź o notatkę (z cytatem) dotyczącą historii kwalifikacji kropek w SQL, a także moje, co prawda, niejasne przypomnienie, dlaczego ASsłowo kluczowe jest opcjonalne (oczywiście bez cytowania!). Hugh przeszedł na emeryturę kilka lat temu. Myślę, że Celko może nadal być aktywny - czy jego wspomnienia dodałyby wagi? Dowody i ślad papieru po prostu nie istnieją :(
dzieńgdy

„czy jego wspomnienia dodałyby wagi?”; Nie trzeba zawracać sobie głowy panem Celko; Doktor BS12 ma własne słowa Darwena na temat niedociągnięć w kwalifikowaniu kropek - ograniczenia pamięci z lat 70. i powtarzające się łączenia nie przyszły mi do głowy. Przyznam, że wydaje się, że aliasing został przekształcony w SQL z tego samego powodu.
Bob

0

Jeśli na przykład projektujesz zapytanie za pomocą edytora zapytań w SQL Server 2012, otrzymasz to:

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

Jednak usunięcie AS nie powoduje żadnej różnicy, jak w następujących przypadkach:

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

W tym przypadku użycie AS jest zbędne, ale w wielu innych miejscach jest potrzebne.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.