SQL Apelidos (AS)

Quando a Ana calcula o dinheiro parado no estoque com preco * estoque, o cabeçalho da coluna sai assim mesmo: "preco * estoque". Feio para um relatório, e difícil de usar no resto da consulta. A solução é dar um apelido à coluna com AS (em inglês, "como": "mostre preco * estoque como valor_parado"). O apelido muda só o nome que aparece no resultado; a tabela continua igualzinha.

Você vai aprender
  • Dar apelido a uma coluna do resultado com AS.
  • Dar nome a uma conta e usar esse nome no ORDER BY.
  • Apelidos com espaço e acento, entre aspas duplas, e por que não usar aspas simples.
  • O AS é opcional, e a armadilha da vírgula esquecida.
  • Apelidos de tabela (FROM produtos AS p), que você vai usar muito nos JOINs.
  • Onde o apelido pode ser usado (e onde o SQLite deixa, mas os outros bancos não).

Os exemplos usam o banco da Loja Aurora, e cada quadro "Resultado" vem do SQLite de verdade, rodando no seu navegador.


A ideia: o crachá

A funcionária se chama Luana Castelo, mas no crachá da loja está escrito "Supervisora". O crachá não muda o nome dela no RH; ele só diz como ela aparece para os clientes. O apelido de uma coluna é um crachá: no resultado, a coluna aparece com o nome que você escolheu; na tabela, ela continua com o nome de sempre.

Na tabelaNo SQLNo cabeçalho do resultado
nomenome AS produtoproduto
precopreco AS valorvalor
(não existe; é uma conta)preco * estoque AS valor_paradovalor_parado

1. O primeiro apelido

Os livros da loja (categoria 4), com cabeçalhos que dizem o que cada coluna é:

SELECT nome AS produto, preco AS valor
FROM produtos
WHERE categoria_id = 4;
nome
A coluna de verdade, da tabela produtos.
AS
"Como": anuncia o apelido.
produto
O apelido. É o nome que aparece no cabeçalho do resultado.
preco AS valor
Cada coluna ganha o seu próprio apelido. As que não ganham ficam com o nome original.

Repare no cabeçalho do quadro: "produto" e "valor". Os dados são exatamente os mesmos que viriam com SELECT nome, preco; só os nomes do cabeçalho mudaram. Nada foi alterado na tabela: na próxima consulta, a coluna continua se chamando nome.

Experimente: faça a primeira coluna aparecer com o nome produto. A segunda fica como está (preco).

SELECT nome, preco
FROM produtos
WHERE categoria_id = 4;
SELECT nome AS produto, preco
FROM produtos
WHERE categoria_id = 4;

2. Dando nome a uma conta

Sem apelido, uma conta ganha como nome o próprio texto da conta:

SELECT nome, preco * estoque
FROM produtos
WHERE categoria_id = 4;

O cabeçalho saiu "preco * estoque". Com um apelido, a coluna ganha um nome de verdade, e esse nome pode ser usado no ORDER BY:

SELECT nome, preco * estoque AS valor_parado
FROM produtos
WHERE categoria_id = 4
ORDER BY valor_parado DESC;

Compare com a aula de ORDER BY, em que a Ana precisou repetir a conta inteira (ORDER BY preco * estoque DESC). Com o apelido, escreve-se a conta uma vez só. Se um dia a conta mudar, você muda num lugar.

O mesmo vale para qualquer valor calculado, até um texto fixo. Aqui, o || "cola" pedaços de texto (você vai vê-lo em Funções de Texto):

SELECT nome || ' (' || cidade || ')' AS cliente
FROM clientes
WHERE estado = 'PE';

Sem o AS cliente, o cabeçalho seria nome || ' (' || cidade || ')'.

Missão: mostre o nome e o dinheiro parado de cada produto, com a conta apelidada de valor_parado, do maior valor para o menor. Use o apelido no ORDER BY.

SELECT nome, preco * estoque
FROM produtos;
SELECT nome, preco * estoque AS valor_parado
FROM produtos
ORDER BY valor_parado DESC;

3. Apelidos com espaço e acento: aspas duplas

Para um relatório que vai para a dona da loja, a Ana quer cabeçalhos em português de verdade, com espaço e acento. Um nome assim precisa ir entre aspas duplas:

SELECT nome AS "Nome do produto", preco AS "Preço (R$)"
FROM produtos
WHERE categoria_id = 4;

Lembra da regra das aspas? No SQL, as aspas simples são para texto (valores, como 'PI'), e as aspas duplas são para nomes (de coluna, de tabela, de apelido). O motor do guia segue essa regra à risca. Por isso o apelido com espaço vai entre aspas duplas.

Sem aspas, o espaço separa as palavras, e o SQLite não entende o resto:

SELECT nome AS Nome do produto
FROM produtos;

near "do": syntax error: ele aceitou Nome como apelido e tropeçou no "do".

Para apelidos que você vai usar no SQL, prefira o simples

Um apelido com espaço precisa de aspas duplas toda vez que for usado (ORDER BY "Nome do produto"). Para apelidos que você vai reutilizar na consulta, use o mesmo estilo dos nomes de coluna: minúsculas, sem acento, com _ no lugar do espaço (valor_parado). Deixe os cabeçalhos "bonitos" para o resultado final de um relatório.


4. O AS é opcional (e a vírgula esquecida)

A palavra AS pode ser omitida: um nome logo depois da coluna já é entendido como apelido.

SELECT nome produto, preco valor
FROM produtos
WHERE categoria_id = 4;

O resultado é igual ao da seção 1. Parece prático, mas é justamente isso que cria uma das armadilhas mais traiçoeiras do SQL. Veja o que acontece quando a Ana esquece uma vírgula:

SELECT nome preco
FROM produtos
WHERE categoria_id = 4;

Nenhum erro! Mas veio uma coluna só, chamada "preco", com os nomes dos livros dentro. Sem a vírgula entre nome e preco, o SQLite entendeu "a coluna nome, com o apelido preco". O preço de verdade nem foi buscado.

Escreva sempre o AS

Com o AS escrito, quem lê vê na hora que é um apelido. E, quando falta uma vírgula, o resultado com uma coluna a menos e um cabeçalho estranho fica mais fácil de notar. A documentação do PostgreSQL recomenda o mesmo: sempre escrever o AS (ou pôr o apelido entre aspas duplas).


5. Apelidos de tabela

Tabelas também podem ganhar apelido, no FROM. Normalmente é uma letra só:

SELECT p.nome, p.preco
FROM produtos AS p
WHERE p.categoria_id = 4;
FROM produtos AS p
Nesta consulta, a tabela produtos passa a se chamar p.
p.nome
"A coluna nome da tabela p." O ponto liga a tabela à coluna.
p.categoria_id
O apelido vale na consulta inteira: no SELECT, no WHERE, no ORDER BY.

Com uma tabela só, o apelido não ajuda muito: SELECT nome, preco FROM produtos dá no mesmo. Ele brilha quando a consulta usa duas ou mais tabelas ao mesmo tempo, como nos JOINs (aula INNER JOIN): lá, clientes e fornecedores têm, as duas, uma coluna nome, e é o c.nome ou o f.nome que diz de qual tabela você está falando. No Self Join, a mesma tabela aparece duas vezes, e o apelido é obrigatório.

Aqui o AS também é opcional: FROM produtos p funciona igual.


6. Onde o apelido pode ser usado

O apelido nasce no SELECT. Onde mais ele vale?

Parte da consultaApelido de colunaApelido de tabela
SELECTÉ onde ele é criadoSim (p.nome)
WHERENo SQLite, sim; no padrão SQL e na maioria dos bancos, nãoSim
ORDER BYSim, em todos os bancosSim

O SQLite é generoso e deixa usar o apelido no WHERE:

SELECT nome, preco * estoque AS valor_parado
FROM produtos
WHERE valor_parado > 3000;

Funciona aqui, mas não é SQL padrão e não funciona no PostgreSQL nem no MySQL. O motivo, que a documentação do MySQL explica: quando o banco avalia o WHERE, o valor da coluna do SELECT ainda pode não ter sido calculado. A ordem "de verdade" em que o banco trabalha é: FROM (pega a tabela) → WHERE (filtra) → SELECT (calcula as colunas e dá os apelidos) → ORDER BY (ordena). O apelido só "existe" a partir do SELECT. Para um SQL que roda em qualquer lugar, repita a conta no WHERE: WHERE preco * estoque > 3000.


7. Formas diferentes de dar um apelido

EscritaFunciona no SQLite?Observação
nome AS produtoSimA forma recomendada.
nome produtoSimSem AS: fácil de confundir com uma vírgula esquecida.
nome AS "Nome do produto"SimAspas duplas: o jeito padrão para nomes com espaço, acento ou maiúsculas.
nome AS 'Nome do produto'Sim, mas eviteAspas simples são para texto. O SQLite aceita aqui por compatibilidade, mas o mesmo apelido em outro lugar vira texto (veja Quando dá errado).
preco AS preçoSim, mas eviteO SQLite aceita acento sem aspas; muitos programas e bancos não. Prefira preco ou "Preço".
SituaçãoQual usar
Nome para usar de novo na consultaAS valor_parado (minúsculas, sem espaço)
Cabeçalho de relatórioAS "Valor parado (R$)"
Consulta com duas tabelas ou maisApelido curto de tabela: FROM clientes AS c
SQL que precisa rodar em outro bancoApelido no ORDER BY pode; no WHERE, repita a conta

Quando dá errado

Usou o nome da tabela depois de dar apelido a ela
SELECT produtos.nome
FROM produtos AS p
WHERE p.categoria_id = 4;

A mensagem: no such column: produtos.nome, "não existe a coluna produtos.nome". Depois de FROM produtos AS p, a tabela se chama p na consulta inteira; o nome antigo deixa de valer.

Como consertar: use o apelido em todo lugar: SELECT p.nome.

Apelido que é uma palavra do SQL
SELECT nome AS order
FROM produtos;

A mensagem: near "order": syntax error. ORDER é uma palavra reservada do SQL (a do ORDER BY), e o SQLite acha que você começou um ORDER BY no lugar errado. O mesmo acontece com select, from, where, group…

Como consertar: escolha outro nome (AS ordem) ou ponha entre aspas duplas (AS "order").

Apelido com espaço, sem aspas

Você viu na seção 3: SELECT nome AS Nome do produto dá near "do": syntax error. Apelido com espaço vai entre aspas duplas.

Apelido entre aspas simples: não ordena
SELECT nome AS 'produto'
FROM produtos
WHERE categoria_id = 4
ORDER BY 'produto';

O que aconteceu: nenhuma mensagem, mas os livros vieram fora de ordem alfabética (Dicionário antes de Atlas). No SELECT, o SQLite aceitou 'produto' como apelido. Mas no ORDER BY, 'produto' entre aspas simples é só o texto "produto", igual em todas as linhas, e ordenar por ele não muda nada.

Como consertar: apelido sem aspas (AS produto … ORDER BY produto) ou entre aspas duplas nos dois lugares (AS "produto" … ORDER BY "produto").

A vírgula esquecida

Também sem mensagem: SELECT nome preco FROM produtos traz uma coluna só, chamada "preco", com os nomes dos produtos (seção 4). Se o resultado tem menos colunas do que você pediu, procure uma vírgula faltando.

Apelido igual ao nome de outra coluna
SELECT preco AS nome, nome
FROM produtos
WHERE nome = 'Atlas Geográfico';

O que aconteceu: funcionou, mas o resultado tem duas colunas chamadas "nome", uma com o preço e outra com o nome. E qual nome o WHERE usou? A coluna de verdade da tabela, não o apelido; por isso o Atlas foi achado. Ninguém consegue ler isso sem se confundir.

Como evitar: nunca dê a uma coluna o apelido que já é o nome de outra coluna da tabela.

Nos outros bancos
  • Apelido no WHERE: o SQLite deixa; o padrão SQL, o PostgreSQL e o MySQL, não. A documentação do PostgreSQL diz que o nome de uma coluna do resultado pode ser usado no ORDER BY e no GROUP BY, mas não no WHERE nem no HAVING. A do Oracle diz que o apelido pode ser usado só no ORDER BY.
  • AS opcional: no PostgreSQL, o AS só pode ser omitido se o apelido não for nenhuma palavra-chave do banco, e a documentação recomenda escrever sempre o AS.
  • Aspas no apelido: o MySQL usa a crase (`) para nomes, e aceita apelidos entre aspas simples no SELECT, com a mesma armadilha desta aula: em outro lugar da consulta, o mesmo nome entre aspas simples vira texto. O SQL Server também aceita colchetes: [Nome do produto]. Ilustrativo (não roda no SQLite):
-- MySQL: crase para nomes com espaço
SELECT nome AS `Nome do produto` FROM produtos;

-- SQL Server: colchetes
SELECT nome AS [Nome do produto] FROM produtos;

-- Em todos (o padrão SQL): aspas duplas
SELECT nome AS "Nome do produto" FROM produtos;

No MySQL, as aspas duplas para nomes só valem com o modo ANSI_QUOTES ligado; sem ele, o MySQL trata "…" como texto.


Referência rápida

EscritaO que faz
coluna AS apelidoMostra a coluna com outro nome no resultado
conta AS apelidoDá nome a um valor calculado (preco * estoque AS valor_parado)
coluna AS "Com espaço"Apelido com espaço, acento ou maiúsculas
coluna apelidoO mesmo, sem AS (evite)
FROM tabela AS tApelido de tabela; as colunas viram t.coluna
ORDER BY apelidoOrdena pelo apelido (vale em todos os bancos)
WHERE apelido …Só no SQLite; nos outros, repita a conta
Mensagem do SQLiteQuer dizer
near "do": syntax errorApelido com espaço sem aspas duplas
near "order": syntax errorApelido que é palavra reservada
no such column: produtos.nomeUsou o nome da tabela depois de dar apelido a ela

Exercícios

1. A palavra do apelido

Complete para a coluna salario aparecer como pagamento:

SELECT nome, salario pagamento FROM funcionarios;

2. As aspas certas

Que tipo de aspas o apelido com espaço precisa? Escreva o símbolo:

SELECT nome AS Nome do cliente" FROM clientes;

3. Quantas colunas tem o resultado de SELECT nome preco FROM produtos;?

4. Depois de FROM clientes AS c, como se escreve a coluna cidade?

5. Em qual parte da consulta o apelido de uma coluna pode ser usado em todos os bancos?

6. A Ana deu um apelido à coluna nome com AS produto. O que acontece com a tabela produtos?

Missão final: a lista dos VIPs

Missão: a Ana vai imprimir a lista dos 5 clientes VIP. Ela quer o cabeçalho cliente no lugar de nome e uf no lugar de estado, nessa ordem: cliente, cidade, uf.

SELECT nome, cidade, estado
FROM clientes
WHERE vip = 1;
SELECT nome AS cliente, cidade, estado AS uf
FROM clientes
WHERE vip = 1;

Quer ir além? Acrescente ORDER BY cliente para a lista sair em ordem alfabética, usando o apelido.


Resumo

  • AS ("como") dá um apelido a uma coluna ou tabela. Ele muda só o nome no resultado; a tabela não é alterada.
  • Use apelidos para dar nome a contas (preco * estoque AS valor_parado) e use o apelido no ORDER BY.
  • Apelido com espaço, acento ou maiúsculas vai entre aspas duplas. Aspas simples são para texto.
  • O AS é opcional, mas escreva sempre: sem ele, uma vírgula esquecida (SELECT nome preco) vira um apelido sem nenhum aviso.
  • Apelido de tabela: FROM produtos AS p, e as colunas viram p.nome. Depois do apelido, o nome antigo da tabela deixa de valer na consulta.
  • O SQLite aceita apelido de coluna no WHERE; os outros bancos, não. Para um SQL que roda em qualquer lugar, use o apelido só no ORDER BY.