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.
- 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 tabela | No SQL | No cabeçalho do resultado |
|---|---|---|
nome | nome AS produto | produto |
preco | preco AS valor | valor |
| (não existe; é uma conta) | preco * estoque AS valor_parado | valor_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".
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.
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
produtospassa a se chamarp. - p.nome
- "A coluna
nomeda tabelap." O ponto liga a tabela à coluna. - p.categoria_id
- O apelido vale na consulta inteira: no
SELECT, noWHERE, noORDER 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 consulta | Apelido de coluna | Apelido de tabela |
|---|---|---|
SELECT | É onde ele é criado | Sim (p.nome) |
WHERE | No SQLite, sim; no padrão SQL e na maioria dos bancos, não | Sim |
ORDER BY | Sim, em todos os bancos | Sim |
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
| Escrita | Funciona no SQLite? | Observação |
|---|---|---|
nome AS produto | Sim | A forma recomendada. |
nome produto | Sim | Sem AS: fácil de confundir com uma vírgula esquecida. |
nome AS "Nome do produto" | Sim | Aspas duplas: o jeito padrão para nomes com espaço, acento ou maiúsculas. |
nome AS 'Nome do produto' | Sim, mas evite | Aspas 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ço | Sim, mas evite | O SQLite aceita acento sem aspas; muitos programas e bancos não. Prefira preco ou "Preço". |
| Situação | Qual usar |
|---|---|
| Nome para usar de novo na consulta | AS valor_parado (minúsculas, sem espaço) |
| Cabeçalho de relatório | AS "Valor parado (R$)" |
| Consulta com duas tabelas ou mais | Apelido curto de tabela: FROM clientes AS c |
| SQL que precisa rodar em outro banco | Apelido no ORDER BY pode; no WHERE, repita a conta |
Quando dá errado
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.
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").
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.
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").
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.
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.
- 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 BYe noGROUP BY, mas não noWHEREnem noHAVING. A do Oracle diz que o apelido pode ser usado só noORDER BY. - AS opcional: no PostgreSQL, o
ASsó pode ser omitido se o apelido não for nenhuma palavra-chave do banco, e a documentação recomenda escrever sempre oAS. - Aspas no apelido: o MySQL usa a crase (
`) para nomes, e aceita apelidos entre aspas simples noSELECT, 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
| Escrita | O que faz |
|---|---|
coluna AS apelido | Mostra a coluna com outro nome no resultado |
conta AS apelido | Dá nome a um valor calculado (preco * estoque AS valor_parado) |
coluna AS "Com espaço" | Apelido com espaço, acento ou maiúsculas |
coluna apelido | O mesmo, sem AS (evite) |
FROM tabela AS t | Apelido de tabela; as colunas viram t.coluna |
ORDER BY apelido | Ordena pelo apelido (vale em todos os bancos) |
WHERE apelido … | Só no SQLite; nos outros, repita a conta |
| Mensagem do SQLite | Quer dizer |
|---|---|
near "do": syntax error | Apelido com espaço sem aspas duplas |
near "order": syntax error | Apelido que é palavra reservada |
no such column: produtos.nome | Usou 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:
2. As aspas certas
Que tipo de aspas o apelido com espaço precisa? Escreva o símbolo:
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 noORDER 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 viramp.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ó noORDER BY.