Qual è lo scopo della parola chiave SQL "AS"?


137

È possibile impostare alias di tabella in SQL digitando l'identificatore subito dopo il nome della tabella.

SELECT * FROM table t1;

Puoi anche usare la parola chiave ASper indicare l'alias.

SELECT * FROM table AS t1;

Qual è la differenza tra loro se ce ne sono?

Vedo che i vecchi DBA tendono a scrivere dichiarazioni senza AS, ma la maggior parte dei nuovi tutorial lo usano.

Aggiornamento: so qual è lo scopo degli alias di tabella e colonna. Sono curioso, qual è il motivo di avere una parola chiave separata per impostare gli alias mentre funziona anche senza di essa.


12
Da msdn.microsoft.com/en-us/library/ms179300.aspx La clausola AS è la sintassi definita nello standard ISO per l'assegnazione di un nome a una colonna del set di risultati. Questa è la sintassi preferita da utilizzare in SQL Server 2005.
Adriaan Stander,

3
Viene anche usato per separare la dichiarazione di una procedura con il suo script. CREATE PROC Test @Param1 INT AS SELECT @Param1
Tom 'Blue' Piddock,

Risposte:


134

Non c'è alcuna differenza tra entrambe le affermazioni sopra. AS è solo un modo più esplicito di menzionare l'alias


10
In realtà, non c'è alcuna differenza in SQL, ma alcuni strumenti / librerie dipendenti possono dipendere da questa piccola parola chiave. Ad esempio: JDBC 4.0. A seconda dell'utilizzo di alias senza "AS cause" e senza riceverai un comportamento diverso - vedi questa risposta stackoverflow.com/a/4271250/814304 . Vorrei raccomandare SEMPRE di utilizzare la forma completa di semantica per evitare tali problemi.
iMysak,

Posso avere alias per più di una colonna? come, due colonne con singoli alias?
Deepak Keynes il

@Keynes Sì. Basta concatenare (||) le colonne e quindi dargli un alias, ad esempio SELECT foo || bar AS foobar.
Rupert Madden-Abbott,

Sì @ RupertMadden-Abbott, grazie! ma ho aspettato un po ', ero in termini di contesto.
Deepak Keynes,

Alias ​​in select non può essere usato nella clausola where ma in from ... come X può essere usato nella clausola where
Muhammad Umer

38

Tutti quelli che hanno risposto prima di me hanno ragione. Lo usi come un nome di collegamento alias per una tabella quando hai lunghe query o query che hanno dei join. Ecco un paio di esempi.

Esempio 1

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

Esempio 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

Esempio 3 È buona norma utilizzare la parola chiave AS e molto consigliato, ma è possibile eseguire la stessa query senza una (e lo faccio spesso).

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

Come puoi dire, ho lasciato fuori la parola chiave AS nell'ultimo esempio. E può essere usato come alias.

Esempio 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

Output dell'esempio 4

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

21

Quando non sei sicuro di quale sintassi scegliere, specialmente quando non sembra esserci molto per separare le scelte, consulta un libro sull'euristica. Per quanto ne so, l'unico libro euristico per SQL è "Joe Celko's SQL Programming Style":

Un nome di correlazione è più spesso chiamato alias, ma sarò formale. In SQL-92, possono avere un ASoperatore opzionale e dovrebbe essere usato per chiarire che a qualcosa viene assegnato un nuovo nome. [P16]

In questo modo, se alla tua squadra non piace la convention, puoi dare la colpa a Celko - so che mi piace;)


AGGIORNAMENTO 1: IIRC per lungo tempo, Oracle non ha supportato la ASparola chiave (nome di correlazione precedente), il che potrebbe spiegare perché alcuni vecchi timer non lo usano abitualmente.


AGGIORNAMENTO 2: il termine "nome di correlazione", sebbene utilizzato dallo standard SQL, non è appropriato. Il concetto di base è quello di una " variabile di intervallo ".


AGGIORNAMENTO 3: Ho appena riletto quello che Celko ha scritto e ha torto: il tavolo non viene rinominato! Ora penso:

Un nome di correlazione è più spesso chiamato alias, ma sarò formale. In SQL standard possono avere una ASparola chiave facoltativa ma non devono essere utilizzate perché potrebbero dare l'impressione che qualcosa venga rinominato quando non lo è. In effetti, dovrebbe essere omesso per imporre il punto che si tratta di una variabile di intervallo.


12

La ASparola chiave è assegnare un nome ALIAS alla tabella del database o alla colonna della tabella. Nel tuo esempio, entrambe le istruzioni sono corrette ma ci sono circostanze in cui è necessaria la clausola AS (sebbene l' ASoperatore stesso sia facoltativo), ad es.

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

In questo caso, la Employeetabella ha una salarycolonna e vogliamo solo il doppio dello stipendio con un nuovo nomeDouble Salary .

Scusa se la mia spiegazione non è efficace.


Aggiornamento basato sul tuo commento, hai ragione, la mia precedente dichiarazione non era valida. L'unica ragione a cui riesco a pensare è che la ASclausola esiste da molto tempo nel mondo SQL e che è stata incorporata in RDMS al giorno d'oggi per compatibilità con le versioni precedenti.


3
No, ASnon è necessario o necessario anche in questo caso. Prova SELECT 1 + 1 "result".
viam0Zah,

6

L'uso è più ovvio se non usi 'SELECT *' (che è una cattiva abitudine da cui dovresti uscire):

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

1
So qual è lo scopo degli alias di tabella. Sono curioso, qual è il motivo di avere una parola chiave separata per impostare gli alias mentre funziona anche senza di essa.
viam0Zah,

4

È un modo formale di specificare un nome di correlazione per un'entità in modo da poterlo indirizzare facilmente in un'altra parte della query.


3

In ASquesto caso è una parola chiave opzionale definita in ANSI SQL 92 per definire un <<correlation name>, comunemente noto come alias per una tabella.

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

Sembra una buona pratica NON usare la ASparola chiave per gli alias di tabella poiché non è supportata da un numero di database comunemente usati.


Hai qualche esempio di dbs che non usa la parola chiave 'as'?
D-Jones,

3
Credo che Oracle sia uno di quelli che non supporta la asparola chiave per gli alias di tabella.
Geert Bellekens,

1
"La parola chiave AS è facoltativa. L'alias rinomina efficacemente la voce di elenco di selezione per la durata della query. L'alias può essere utilizzato in order_by_clause ma non in altre clausole nella query." docs.oracle.com/cd/B28359_01/server.111/b28286/… . Anche in relazione stackoverflow.com/a/8451257/1359796
HEDMON

2

All'inizio di SQL, è stato scelto come soluzione al problema di come gestire nomi di colonne duplicati (vedere la nota seguente).

Per prendere in prestito una query da un'altra risposta:

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

La colonna ProductID(e forse altre) è comune ad entrambe le tabelle e poiché la sintassi della condizione di join richiede riferimento ad entrambe, la "qualificazione punto" fornisce chiarimento.

Ovviamente, la soluzione migliore era di non aver mai permesso nomi di colonne duplicati in primo luogo! Fortunatamente, se si utilizza la NATURAL JOINsintassi più recente , la necessità delle variabili di intervallo Pe Oscompare:

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

Ma perché la ASparola chiave è facoltativa? Il mio ricordo da una discussione personale con un membro del comitato standard SQL (Joe Celko o Hugh Darwen) era che il loro ricordo era che, al momento della definizione dello standard, il prodotto di un fornitore (quello di Microsoft?) Richiedeva la sua inclusione e quello di un altro fornitore prodotto (Oracle?) ha richiesto la sua omissione, quindi il compromesso scelto è stato quello di renderlo facoltativo. Non ho alcuna citazione per questo, o mi credi o no!


All'inizio del modello relazionale, il prodotto incrociato (o theta-join o equi-join) delle relazioni le cui intestazioni non sono disgiunte sembrava produrre una relazione con due attributi con lo stesso nome; La soluzione di Codd a questo problema nel suo calcolo relazionale era l'uso della qualificazione dei punti, che fu successivamente emulata in SQL (fu poi realizzato che il cosiddetto join naturale era primitivo senza perdita; cioè, il join naturale può sostituire tutti i theta-join e anche prodotto incrociato.)

Fonte: Business System 12, Note codificate per le diapositive della presentazione tenuta al TTM Implementers 'Workshop, Università della Northumbria, 2-3 giugno 2011 da Hugh Darwen


"Certo, la soluzione migliore è stata quella di non aver mai permesso nomi di colonne duplicati in primo luogo!" - Quindi non si dovrebbero permettere company.name e country.name? e se mi unissi a un tavolo per se stesso? "All'inizio di SQL, è stato scelto ..." hai un riferimento per questo / questa logica è documentata da qualche parte?
Bob,

@Bob Ho aggiornato la mia risposta con una nota (con citazione) della storia della qualificazione del punto in SQL, oltre al mio vago ricordo del perché la ASparola chiave è facoltativa (nessuna citazione, ovviamente!). Hugh si è ritirato alcuni anni fa. Penso che Celko potrebbe essere ancora attivo - i suoi ricordi aggiungerebbero peso? Le prove e la traccia cartacea semplicemente non esistono :(
onedayquando il

"i suoi ricordi aggiungerebbero peso?"; Non c'è bisogno di disturbare Celko; il documento BS12 ha le stesse parole di Darwen sulle carenze della qualificazione dei punti: non mi erano venuti in mente i vincoli di memoria degli anni '70 e i ripetuti join. Ammetto che sembra molto possibile che l'aliasing sia diventato SQL per lo stesso motivo.
Bob

0

Se si progetta una query utilizzando l'editor di query in SQL Server 2012, ad esempio, si otterrebbe questo:

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

Tuttavia, la rimozione dell'AS non fa alcuna differenza come nel caso seguente:

 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 questo caso l'uso dell'AS è superfluo ma in molti altri luoghi è necessario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.