SQL Escolhendo Colunas
Na aula SELECT, a Ana viu a tabela de produtos inteira: 7 colunas e 45 linhas. Mas, quando um cliente liga perguntando o preço de alguma coisa, ela não precisa do código do fornecedor nem do número da categoria. Precisa do nome e do preço, e só. Nesta aula você aprende a pedir ao banco exatamente as colunas que quer, na ordem que quer, e conhece o erro mais traiçoeiro de quem está começando: a vírgula esquecida, que não dá mensagem de erro.
- A pedir uma coluna, ou várias, separadas por vírgula.
- Que o resultado sai na ordem em que você escreveu as colunas.
- Como descobrir o nome das colunas de uma tabela.
- Que dá para mostrar a mesma coluna duas vezes e até uma conta, como
preco * estoque. - Os erros mais comuns: coluna que não existe, vírgula sobrando, vírgula faltando e aspas simples no nome da coluna.
A ideia: esconder as colunas da planilha
Pense numa planilha com os produtos da loja. Para imprimir uma lista de preços, você esconderia as colunas que não interessam e ficaria só com "nome" e "preço". A planilha continua com todas as colunas; a folha impressa é que mostra só duas.
No SQL é igual. No lugar do *, você escreve a lista de colunas que quer ver. A tabela no banco não muda nada; só o resultado que volta para você é que vem "enxuto".
| Você escreve | O resultado mostra |
|---|---|
SELECT * FROM produtos; | as 7 colunas: id, nome, categoria_id, fornecedor_id, preco, estoque, descontinuado |
SELECT nome, preco FROM produtos; | só nome e preco |
Nos dois casos vêm as 45 linhas: escolher colunas não escolhe linhas. Para ficar só com algumas linhas, existe o WHERE, assunto da aula WHERE.
1. Uma coluna só
A forma mais simples: o nome de uma coluna no lugar do *.
SELECT nome FROM categorias;
- SELECT
- "Selecione": vou pedir dados.
- nome
- A única coluna que você quer ver. O nome tem de ser exatamente o da tabela:
nome, sem acento e sem espaço. - FROM categorias
- De qual tabela.
- ;
- Fim do comando.
O resultado tem uma coluna e 8 linhas: o nome de cada categoria. O cabeçalho é o nome da coluna, nome.
2. Várias colunas: separe com vírgula
Para mais de uma coluna, escreva os nomes um depois do outro, com uma vírgula entre eles. A lista de preços da Ana fica assim:
SELECT nome, preco FROM produtos;
- nome
- A primeira coluna do resultado.
- ,
- A vírgula separa uma coluna da outra. Ela vai entre as colunas: nem antes da primeira, nem depois da última.
- preco
- A segunda coluna. O preço aparece do jeito que o banco guarda: com ponto decimal e sem os zeros do fim (
4.9, e não4,90). - FROM produtos;
- De qual tabela, e o fim do comando.
O espaço depois da vírgula é opcional (nome,preco também funciona), mas deixa a consulta mais fácil de ler. Com três colunas, a regra é a mesma, uma vírgula entre cada par:
SELECT nome, cargo, salario FROM funcionarios;
Missão: esta consulta mostra a tabela de produtos inteira. Mude-a para mostrar só o nome e o preço de cada produto, nessa ordem.
SELECT * FROM produtos;
SELECT nome, preco FROM produtos;
3. A ordem das colunas é você quem escolhe
Com *, as colunas vêm na ordem em que a tabela foi criada. Com a lista, elas vêm na ordem em que você escreveu. Compare:
SELECT cargo, nome FROM funcionarios;
Agora o cargo vem antes do nome, embora na tabela funcionarios o nome venha primeiro. Repare que só mudou a ordem das colunas; as linhas continuam na mesma ordem (Marta, Caio, Renata…). Para mudar a ordem das linhas, existe o ORDER BY (aula ORDER BY).
Isso é útil para montar o resultado do jeito que quem vai ler espera. Uma lista de contatos dos clientes, por exemplo, fica melhor com o nome primeiro e o email depois:
SELECT nome, email, cidade FROM clientes;
Três clientes aparecem com NULL no email (Luís Otávio, Roberto e Henrique): eles não deixaram email na loja. É o "sem valor" que você já viu; a aula O Valor NULL conta tudo sobre ele.
4. Como descobrir o nome das colunas
Para escrever a lista, você precisa saber como as colunas se chamam. Três jeitos:
- Rode um
SELECT *e leia o cabeçalho. É o jeito mais rápido no editor. - Consulte o mapa do banco: a aula O Banco da Loja Aurora lista todas as tabelas e colunas da loja.
- No terminal, use o comando de ponto
.schema, que mostra como a tabela foi criada:
$ sqlite3 loja.db ".schema produtos"
CREATE TABLE produtos (
id INTEGER PRIMARY KEY,
nome TEXT NOT NULL,
categoria_id INTEGER NOT NULL REFERENCES categorias(id),
fornecedor_id INTEGER NOT NULL REFERENCES fornecedores(id),
preco REAL NOT NULL,
estoque INTEGER NOT NULL DEFAULT 0,
descontinuado INTEGER NOT NULL DEFAULT 0
);
Cada linha do meio é uma coluna: primeiro o nome (id, nome, categoria_id…), depois o tipo e as regras dela, que você vai aprender em CREATE TABLE. Por enquanto, olhe só a primeira palavra de cada linha. O .schema só existe no terminal (veja Comandos de Ponto); no editor, use o SELECT *.
preco, sem cedilha?
Quem criou a tabela escolheu nomes sem acento, sem cedilha e sem espaço: preco, descricao, itens_pedido (com sublinhado no lugar do espaço). É uma boa prática no mundo inteiro: nomes assim funcionam em qualquer banco, em qualquer teclado e em qualquer linguagem de programação. Quando for a sua vez de criar tabelas, faça igual.
5. Repetir colunas e fazer contas
A lista de colunas aceita algumas coisas que surpreendem quem está começando.
A mesma coluna duas vezes
SELECT nome, nome FROM categorias;
Funciona: o banco mostra o que você pediu, quantas vezes pediu. Não é muito útil assim, mas mostra que cada item da lista é independente dos outros.
Uma conta como coluna
Um item da lista não precisa ser só o nome de uma coluna: pode ser uma conta com ela. Quanto a loja gasta por ano com o salário de cada funcionário? O salário vezes 12:
SELECT nome, salario, salario * 12 FROM funcionarios;
- nome, salario
- Duas colunas comuns.
- salario * 12
- Uma coluna calculada: para cada linha, o banco pega o salário e multiplica por 12 (o
*aqui é "vezes", não "todas as colunas"). A Marta ganha 9800.0 por mês, então a conta dá 117600.0.
Repare no cabeçalho da coluna nova: é a própria conta, salario * 12. Para dar a ela um nome melhor, como salario_anual, existe o AS, assunto da aula Apelidos (AS). E a conta não muda a tabela: o salário guardado continua sendo o mensal.
O * só quer dizer "todas as colunas" quando aparece sozinho no lugar da lista. Entre dois valores, como em salario * 12, ele é a multiplicação.
Experimente: quanto vale, em dinheiro, o estoque de cada produto? Rode a consulta e veja a coluna preco * estoque. Depois troque o * da conta por + ou - e veja o que muda.
SELECT nome, preco, estoque, preco * estoque FROM produtos;
Formas diferentes de escrever a mesma lista
As três consultas abaixo dão o mesmo resultado: nome e preço dos 45 produtos.
SELECT nome, preco FROM produtos;
SELECT nome,
preco
FROM produtos;
SELECT produtos.nome, produtos.preco FROM produtos;
A terceira escreve o nome da tabela antes de cada coluna, com um ponto no meio: produtos.nome quer dizer "a coluna nome da tabela produtos". Com uma tabela só, isso é desnecessário. Mas, quando você juntar duas tabelas que têm colunas com o mesmo nome (produtos e categorias têm, as duas, uma coluna nome), vai ser obrigatório. Isso fica para a aula INNER JOIN.
| Forma | Quando usar |
|---|---|
SELECT nome, preco FROM produtos; | O normal, com poucas colunas |
| Uma coluna por linha | Listas compridas: fica fácil ler, comentar e apagar uma coluna |
produtos.nome, produtos.preco | Quando a consulta usa mais de uma tabela (JOIN) |
Quando dá errado
A Ana digitou rápido demais:
SELECT nme, preco FROM produtos;
no such column: nme quer dizer "não existe a coluna nme". O mesmo acontece com o nome escrito com acento, como se fala:
SELECT nome, preço FROM produtos;
no such column: preço. Para o banco, preço e preco são nomes diferentes. Como consertar: copie o nome exato do cabeçalho de um SELECT *.
SELECT nome, cidade FROM produtos;
De novo no such column: cidade. A coluna cidade existe no banco (nas tabelas clientes e fornecedores), mas não em produtos. O banco só procura as colunas na tabela do FROM. Como consertar: use a tabela certa (SELECT nome, cidade FROM clientes;) ou, se precisar de dados de duas tabelas, espere a aula de JOIN.
Acontece muito quando se apaga a última coluna da lista e a vírgula fica para trás:
SELECT nome, preco, FROM produtos;
near "FROM": syntax error. Depois de uma vírgula, o banco espera mais uma coluna, e encontrou o FROM. O mesmo vale para duas vírgulas seguidas (nome,, preco dá near ",": syntax error). Como consertar: apague a vírgula que sobrou. A regra: vírgula só entre duas colunas.
Este é o mais perigoso. A Ana esqueceu a vírgula entre nome e preco:
SELECT nome preco FROM produtos;
Nenhuma mensagem de erro. Mas olhe o resultado: veio uma coluna só, chamada preco, com os nomes dos produtos dentro! Sem a vírgula, o banco entendeu "mostre a coluna nome e dê a ela o apelido preco". Apelidos são um recurso de verdade do SQL (aula Apelidos (AS)), e por isso o banco não reclama.
Como perceber: confira sempre o cabeçalho. Se vieram menos colunas do que você pediu, ou se os valores não combinam com o nome da coluna, procure uma vírgula faltando. Com três nomes seguidos sem vírgula (SELECT nome preco estoque FROM produtos;) aí sim aparece erro: near "estoque": syntax error.
SELECT 'nome' FROM categorias;
De novo, sem mensagem de erro, e de novo um resultado estranho: 8 linhas com a palavra nome. Entre aspas simples, 'nome' não é mais o nome de uma coluna: é um texto, igual ao 'Olá, Ana' da aula SELECT. O banco mostra esse texto uma vez para cada linha da tabela. Como consertar: nomes de colunas vão sem aspas. Aspas simples são para textos, como você vai usar no WHERE.
Missão: a Ana quer a lista de contatos com nome, email e cidade dos clientes, mas o resultado saiu com uma coluna só. Encontre o problema e conserte.
SELECT nome, email cidade FROM clientes;
SELECT nome, email, cidade FROM clientes;
Dica: aqui vieram duas colunas, nome e cidade, mas a coluna cidade está cheia de emails. É a vírgula faltando de novo.
Referência rápida
| Escrita | O que faz |
|---|---|
SELECT coluna FROM tabela; | Uma coluna |
SELECT col1, col2, col3 FROM tabela; | Várias colunas, nessa ordem |
SELECT col2, col1 FROM tabela; | Mesmas colunas, ordem trocada |
SELECT salario * 12 FROM funcionarios; | Uma coluna calculada (o cabeçalho é a conta) |
SELECT tabela.coluna FROM tabela; | A coluna com o nome da tabela na frente (útil nos JOINs) |
| Sintoma | Causa provável |
|---|---|
no such column: nme | Nome da coluna errado, ou a coluna está em outra tabela |
near "FROM": syntax error | Vírgula sobrando antes do FROM |
| Menos colunas do que você pediu, com valores "trocados" | Vírgula faltando: uma coluna virou apelido da outra |
| A mesma palavra repetida em todas as linhas | Nome da coluna entre aspas simples: virou texto |
Exercícios
1. Nome e cidade
Complete para mostrar o nome e a cidade dos fornecedores:
2. Só o cargo
Complete para mostrar só o cargo de cada funcionário:
3. Em que ordem vêm as colunas de SELECT preco, nome FROM produtos;?
4. A Ana rodou SELECT nome estoque FROM produtos;. O que aparece?
5. Quantas linhas vêm em SELECT nome, preco FROM produtos;?
6. SELECT nome, cidade FROM produtos; dá no such column: cidade. Por quê?
Missão final: a ficha do fornecedor
Missão: a Ana vai ligar para os fornecedores. Monte a lista com o nome, o telefone e o país de cada um, nessa ordem. Comece com SELECT * para descobrir os nomes das colunas, se precisar.
SELECT * FROM fornecedores;
SELECT nome, telefone, pais FROM fornecedores;
Resumo
- No lugar do
*, escreva a lista de colunas que quer ver, separadas por vírgula:SELECT nome, preco FROM produtos;. - As colunas saem na ordem em que você escreveu. Escolher colunas não muda quantas linhas vêm.
- Para saber o nome das colunas: o cabeçalho de um
SELECT *, o mapa em O Banco da Loja Aurora ou o.schemano terminal. - A lista aceita a mesma coluna duas vezes e contas como
salario * 12. Entre dois valores, o*é multiplicação. - Vírgula só entre colunas. Sobrando, dá
syntax error; faltando, não dá erro nenhum, e uma coluna vira o apelido da outra. Confira sempre o cabeçalho. - Nomes de colunas vão sem aspas.
'nome', com aspas simples, é um texto.