SELECT no SQLite: lendo linhas de uma tabela
Toda pergunta que você faz a um banco SQLite começa com SELECT. A ideia é direta: me devolva essas colunas, dessa tabela, das linhas que batem com essas condições. Por enquanto, o foco é nas duas primeiras partes — quais colunas e qual tabela. O filtro fica para o próximo documento.
A consulta mais simples possível:
SELECT * significa "todas as colunas". O FROM products indica de qual tabela vêm os dados. O resultado é uma linha por registro, com as quatro colunas. O ponto e vírgula encerra o comando.
No fim das contas, a estrutura é essa: SELECT <colunas> FROM <tabela>;.
Selecionando colunas específicas no SQLite
O * quebra um galho quando você está só explorando os dados. Mas, em código de verdade, na maioria das vezes você vai querer listar exatamente as colunas que importam:
Você recebe duas colunas, na ordem em que pediu. A ordem da lista do SELECT define a ordem do resultado — ela não precisa bater com a ordem das colunas na tabela.
Por que isso é melhor do que SELECT *? Dois motivos. Primeiro, trafega menos dado (ou menos coisa é lida do arquivo), o que faz diferença quando a tabela tem muitas colunas. Segundo, sua consulta continua estável quando alguém adicionar uma coluna nova mês que vem. O SELECT * passa a devolver mais campos sem avisar, e isso pode quebrar código de aplicação que desempacota as linhas por posição.
SELECT também calcula, não só busca
As colunas da lista do SELECT não precisam ser apenas nomes de colunas. Podem ser qualquer expressão — operações aritméticas, chamadas de função, concatenação de strings, constantes. O SQLite avalia a expressão para cada linha.
A quarta coluna nem existe na tabela — o SQLite calculou ela linha por linha. Dá pra fazer o mesmo com funções de string, datas, expressões condicionais, o que você quiser. A lista do SELECT é o lugar onde você molda os dados, não só onde você os busca.
Inclusive, você pode usar SELECT sem cláusula FROM, tratando o SQLite como uma calculadora:
Uma linha, três colunas. Bom para testar o que uma expressão faz antes de jogar ela numa consulta de verdade.
Apelidos de coluna com AS
Quando você calcula uma coluna, o SQLite escolhe um nome padrão para ela — geralmente a própria expressão, tipo price * stock. Isso fica feio e instável. Dê um nome decente para a coluna usando AS:
O apelido é o nome que a coluna recebe no resultado da consulta. Isso faz diferença na hora de ler a saída e faz muita diferença no código da aplicação, que costuma acessar valores pelo nome da coluna (row["inventory_value"] em vez de row[1]).
A palavra-chave AS é opcional — price * stock inventory_value funciona do mesmo jeito —, mas vale a pena escrevê-la. A intenção fica mais clara e você evita que alguém confunda uma vírgula esquecida com um alias.
Criando alias para a tabela
Você também pode dar um apelido curto para a própria tabela. Com uma tabela só, isso parece pouco útil, mas o hábito compensa demais quando você começa a fazer joins:
p agora funciona como apelido de products. A forma com ponto, p.name, deixa explícito de qual tabela vem cada coluna. Com uma única tabela isso é só ruído; com três tabelas em um JOIN, é o que mantém a consulta legível.
Literais e constantes no resultado
Dá pra misturar colunas reais com valores constantes. Isso é útil quando você quer rotular linhas ou preencher um valor fixo:
Toda linha recebe o mesmo 'USD' e 1. Esse padrão aparece bastante quando você está juntando resultados de várias consultas com UNION e precisa de uma coluna marcadora para identificar de onde veio cada registro.
Uma palavrinha sobre NULL
Algumas colunas vêm vazias — ou porque nenhum valor foi inserido, ou porque a coluna não tem valor padrão. No SQLite, essa "ausência de valor" é representada por NULL, que aparece nos resultados do SELECT como um espaço em branco ou como a palavra NULL, dependendo da ferramenta que você estiver usando.
Olhe a segunda linha. price é NULL, e price * 2 também é NULL — qualquer operação aritmética envolvendo NULL resulta em NULL. Essa é uma das maiores fontes de confusão em resultados de SQL, e tem uma página inteira dedicada a isso mais adiante. Por enquanto, basta notar que NULL é contagioso quando aparece em expressões.
O que fica de aprendizado
SELECT <colunas> FROM <tabela>;é o formato de toda consulta SQL no SQLite.- Em código de verdade, liste as colunas explicitamente; deixe
SELECT *para quando estiver explorando os dados. - A lista do
SELECTaceita qualquer expressão, não só nomes de coluna. - Use
ASpara dar nomes decentes a colunas calculadas e a tabelas com alias. NULLse propaga pela aritmética — lembre disso quando o resultado parecer estranho.
A seguir: filtrando com WHERE
Até aqui, toda consulta devolve todas as linhas da tabela. A cláusula WHERE é o que serve para afunilar esse resultado — escolher linhas por preço, por nome, por data ou por qualquer expressão que retorne verdadeiro ou falso. É o assunto do próximo documento.
Perguntas frequentes
Qual é a sintaxe básica do SELECT no SQLite?
É SELECT <colunas> FROM <tabela>;. As colunas podem ser uma lista separada por vírgula (SELECT name, email FROM users), um * para trazer tudo, ou qualquer expressão como price * quantity. A cláusula FROM indica de qual tabela ler, e o ponto e vírgula encerra o comando.
Devo usar SELECT * no SQLite?
Para dar uma olhada nos dados pelo CLI, tudo bem. Já no código da aplicação, liste só as colunas que você realmente precisa. O SELECT * acopla seu código ao schema atual — basta adicionar uma coluna amanhã para que toda consulta passe a retornar mais dados em silêncio, o que pode quebrar trechos que leem as linhas por posição.
Como renomear uma coluna no resultado do SELECT?
Use o AS para dar um alias à coluna ou expressão: SELECT price * quantity AS total FROM orders. O alias vira o nome da coluna no resultado, o que faz diferença na legibilidade e em códigos que acessam o retorno pelo nome da coluna. O AS é opcional, mas vale manter por clareza.