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.

Você vai aprender
  • 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ê escreveO 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ão 4,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:

  1. Rode um SELECT * e leia o cabeçalho. É o jeito mais rápido no editor.
  2. Consulte o mapa do banco: a aula O Banco da Loja Aurora lista todas as tabelas e colunas da loja.
  3. 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 *.

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

FormaQuando usar
SELECT nome, preco FROM produtos;O normal, com poucas colunas
Uma coluna por linhaListas compridas: fica fácil ler, comentar e apagar uma coluna
produtos.nome, produtos.precoQuando a consulta usa mais de uma tabela (JOIN)

Quando dá errado

A coluna não existe

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

A coluna existe, mas em outra tabela
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.

Vírgula sobrando no fim da lista

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.

Vírgula faltando: o erro que não dá erro

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.

Aspas simples no nome da coluna
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

EscritaO 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)
SintomaCausa provável
no such column: nmeNome da coluna errado, ou a coluna está em outra tabela
near "FROM": syntax errorVí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 linhasNome da coluna entre aspas simples: virou texto

Exercícios

1. Nome e cidade

Complete para mostrar o nome e a cidade dos fornecedores:

SELECT nome cidade FROM fornecedores;

2. Só o cargo

Complete para mostrar só o cargo de cada funcionário:

SELECT FROM funcionarios;

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