Qual é o objetivo da palavra-chave SQL "AS"?

137

Você pode definir aliases de tabela no SQL digitando o identificador logo após o nome da tabela.

SELECT * FROM table t1;

Você pode até usar a palavra AS- chave para indicar o alias.

SELECT * FROM table AS t1;

Qual a diferença entre eles, se houver?

Vejo que os antigos DBA tendem a escrever declarações sem AS, mas a maioria dos novos tutoriais a usa.

Atualização: Eu sei qual é o objetivo dos aliases de tabela e coluna. Estou curioso, qual é o motivo de ter uma palavra-chave separada para definir aliases enquanto ela funciona sem ela também.

viam0Zah
fonte
12
De msdn.microsoft.com/en-us/library/ms179300.aspx A cláusula AS é a sintaxe definida no padrão ISO para atribuir um nome a uma coluna do conjunto de resultados. Esta é a sintaxe preferencial para usar em SQL Server 2005.
Adriaan Stander
3
Também é usado para separar a declaração de um procedimento com seu script. CREATE PROC Test @Param1 INT AS SELECT @Param1
Tom 'Blue' Piddock

Respostas:

134

Não há diferença entre as duas afirmações acima. AS é apenas uma maneira mais explícita de mencionar o alias

Sachin Shanbhag
fonte
10
Na verdade, não há diferença no SQL, mas algumas ferramentas / bibliotecas dependentes podem depender dessa pequena palavra-chave. Como exemplo: JDBC 4.0. Dependendo do uso de aliases com 'causa AS' e / ou você receberá um comportamento diferente - consulte esta resposta stackoverflow.com/a/4271250/814304 . Eu gostaria de recomendar SEMPRE usar a forma completa da semântica para evitar esses problemas.
IMysak
Posso ter aliases para mais de uma coluna? tipo, duas colunas com aliases únicos?
Deepak Keynes
@Keynes Sim. Apenas concatene (||) as colunas e dê um apelido, por exemplo, SELECT foo || bar AS foobar.
Rupert Madden-Abbott
Sim @ RupertMadden-Abbott, obrigado! mas esperei um pouco, fiquei em termos de contexto.
Deepak Keynes
38

Todos que responderam antes de mim estão corretos. Você o usa como um nome de atalho de alias para uma tabela quando você tem consultas longas ou consultas que têm associações. Aqui estão alguns exemplos.

Exemplo 1

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

Exemplo 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

Exemplo 3 É uma boa prática usar a palavra-chave AS e muito recomendada, mas é possível executar a mesma consulta sem uma (e eu sempre faço).

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

Como você pode ver, deixei de fora a palavra-chave AS no último exemplo. E pode ser usado como um alias.

Exemplo 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

Saída do Exemplo 4

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

Quando você não tiver certeza de qual sintaxe escolher, especialmente quando não parece haver muito para separar as opções, consulte um livro sobre heurísticas. Até onde eu sei, o único livro de heurísticas para SQL é 'Estilo de Programação SQL de Joe Celko':

Um nome de correlação é mais frequentemente chamado de alias, mas serei formal. No SQL-92, eles podem ter um ASoperador opcional e devem ser usados ​​para deixar claro que algo está recebendo um novo nome. [p16]

Dessa forma, se sua equipe não gostar da convenção, você pode culpar Celko - eu sei que sim;)


ATUALIZAÇÃO 1: IIRC por um longo tempo, o Oracle não suportava a ASpalavra-chave (nome da correlação anterior), o que pode explicar por que alguns veteranos não a usam habitualmente.


ATUALIZAÇÃO 2: o termo 'nome da correlação', embora usado pelo SQL Standard, é inadequado. O conceito subjacente é o de uma ' variável de intervalo '.


ATUALIZAÇÃO 3: Acabei de reler o que Celko escreveu e ele está errado: a tabela não está sendo renomeada! Eu agora penso:

Um nome de correlação é mais frequentemente chamado de alias, mas serei formal. No SQL padrão, eles podem ter uma ASpalavra-chave opcional, mas não deve ser usada, pois pode dar a impressão de que algo está sendo renomeado quando não está. De fato, ele deve ser omitido para reforçar o ponto de que é uma variável de intervalo.

um dia quando
fonte
12

A ASpalavra-chave é atribuir um nome ALIAS à tabela do banco de dados ou à coluna da tabela. No seu exemplo, ambas as instruções estão corretas, mas há circunstâncias em que a cláusula AS é necessária (embora o ASpróprio operador seja opcional), por exemplo

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

Nesse caso, a Employeetabela possui uma salarycoluna e queremos apenas o dobro do salário com um novo nome Double Salary.

Desculpe se minha explicação não é eficaz.


Atualização com base no seu comentário, você está certo, minha declaração anterior era inválida. A única razão pela qual consigo pensar é que a AScláusula existe há muito tempo no mundo SQL e foi incorporada hoje em dia no RDMS para compatibilidade com versões anteriores.

Buhake Sindi
fonte
3
Não, ASnão é obrigatório ou necessário, mesmo neste caso. Tente SELECT 1 + 1 "result".
viam0Zah
6

O uso é mais óbvio se você não usar 'SELECT *' (que é um mau hábito do qual você deve se livrar):

SELECT t1.colA, t2.colB, t3.colC FROM alongtablename AS t1, anotherlongtablename AS t2, yetanotherlongtablename AS t3 WHERE t1.colD = t2.colE...
Nicholas Knight
fonte
1
Eu sei qual é o propósito dos aliases da tabela. Estou curioso, qual é o motivo de ter uma palavra-chave separada para definir aliases enquanto ela funciona sem ela também.
viam0Zah
4

É uma maneira formal de especificar um nome de correlação para uma entidade, para que você possa resolvê-lo facilmente em outra parte da consulta.

Preet Sangha
fonte
3

A ASneste caso é uma palavra-chave opcional definido na ANSI SQL 92 para definir um <<correlation name>, vulgarmente conhecido como aliás para uma mesa.

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

Parece uma prática recomendada NÃO usar a ASpalavra - chave para aliases de tabela, pois ela não é suportada por vários bancos de dados comumente usados.

Geert Bellekens
fonte
Você tem exemplos de dbs que não usam a palavra-chave 'as'?
D-Jones
3
Acredito que o Oracle é um deles que não suporta a aspalavra - chave para aliases de tabela.
Geert Bellekens
1
"A palavra-chave AS é opcional. O alias renomeia efetivamente o item da lista de seleção pela duração da consulta. O alias pode ser usado na order_by_clause, mas não em outras cláusulas da consulta." docs.oracle.com/cd/B28359_01/server.111/b28286/… . Também relacionado stackoverflow.com/a/8451257/1359796
HEDMON 8/16
2

Nos primeiros dias do SQL, ele foi escolhido como a solução para o problema de como lidar com nomes de colunas duplicados (veja a nota abaixo).

Para pedir emprestada uma consulta de outra resposta:

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

A coluna ProductID(e possivelmente outras) é comum a ambas as tabelas e, como a sintaxe da condição de junção requer referência a ambas, a 'qualificação de pontos' fornece desambiguação.

Obviamente, a melhor solução era nunca ter permitido nomes de colunas duplicados! Felizmente, se você usar a NATURAL JOINsintaxe mais recente , a necessidade das variáveis ​​range Pe Odesaparecerá:

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

Mas por que a ASpalavra - chave é opcional? Minha lembrança de uma discussão pessoal com um membro do comitê padrão do SQL (Joe Celko ou Hugh Darwen) foi que a lembrança deles era que, no momento da definição do padrão, o produto de um fornecedor (da Microsoft?) Exigia sua inclusão e o de outro fornecedor. produto (da Oracle?) exigia sua omissão; portanto, o compromisso escolhido foi torná-lo opcional. Não tenho citação para isso, você acredita em mim ou não!


Nos primeiros dias do modelo relacional, o produto cruzado (ou junção teta ou junção equi) de relações cujos títulos não são disjuntos parecia produzir uma relação com dois atributos com o mesmo nome; A solução de Codd para esse problema em seu cálculo relacional foi o uso da qualificação de pontos, que mais tarde foi emulada no SQL (percebeu-se mais tarde que a chamada junção natural era primitiva sem perda; isto é, a junção natural pode substituir todas as junções teta e mesmo produto cruzado.)

Fonte: Business System 12, Notes com os slides da apresentação do TTM Implementers 'Workshop, University of Northumbria, 2-3 de junho de 2011 por Hugh Darwen

um dia quando
fonte
"É claro que a melhor solução era nunca ter permitido nomes de colunas duplicados!" - então company.name e country.name não devem ser permitidos? e se eu estivesse juntando uma mesa sozinha? "Nos primeiros dias do SQL, foi escolhido ..." você tem uma referência para isso / essa lógica está documentada em algum lugar?
22418 Bob
@Bob Atualizei minha resposta com uma nota (com citação) do histórico de qualificação de pontos no SQL, além de minha lembrança confusa de por que a ASpalavra-chave é opcional (sem citação, obviamente!). Hugh se aposentou há alguns anos atrás. Acho que Celko ainda pode estar ativo - suas lembranças acrescentariam peso? Evidência e trilha de papel simplesmente não existem :(
onedaywhen
"suas lembranças acrescentariam peso?"; Não há necessidade de incomodar o Sr. Celko; o documento BS12 tem as próprias palavras de Darwen sobre as deficiências da qualificação de pontos - restrições de memória dos anos 70 e junções repetidas não me ocorreram. Admito que parece muito possível que o aliasing tenha sido convertido para SQL pelo mesmo motivo.
Bob
0

Se você criar uma consulta usando o editor de consultas no SQL Server 2012, por exemplo, obteria o seguinte:

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

No entanto, remover o AS não faz diferença, como a seguir:

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

Nesse caso, o uso do AS é supérfluo, mas em muitos outros lugares é necessário.

user2063329
fonte