devgameschool

Como combinar condições com AND, OR e IN no SQL?

Um WHERE só aguenta uma exigência. Quando a pergunta tem duas ou mais, elas são ligadas: o AND cobra todas ao mesmo tempo, o OR se contenta com qualquer uma, e o IN é um OR encurtado para quando é sempre a mesma coluna contra uma lista de valores.

Como se escreve

WHERE <condição> AND <condição>;
WHERE <condição> OR <condição>;
WHERE <coluna> IN (<valor>, <valor>, <valor>);
WHERE NOT <condição>;      WHERE <coluna> NOT IN (<valor>, <valor>);

Exemplo para rodar

A mesma pergunta cabe encurtada: troque o WHERE por WHERE ano IN (1890, 1937, 1960) e execute de novo. O resultado é o mesmo.

Todos os exemplos usam duas tabelinhas: livro (titulo, autor, ano, paginas) e emprestimo (livro, retirado_em, leitor, dias).

SELECT titulo, ano FROM livro
WHERE ano = 1890 OR ano = 1937 OR ano = 1960;
titulo ano
O Cortiço 1890
Capitães da Areia 1937
Quarto de Despejo 1960
3 linhas no resultado

Dicas

  • O AND é resolvido antes do OR, sempre. O SQLite lê a = 1 AND b = 2 OR c = 3 como (a = 1 AND b = 2) OR c = 3.
  • Quando a frase tem e e ou juntos, ponha o OR entre parênteses para ele virar um bloco só: WHERE ano = 1937 AND (paginas < 200 OR autor LIKE 'Jorge%').
  • O IN só serve para uma coluna. Duas colunas diferentes continuam pedindo OR escrito por extenso.
  • O NOT vira a condição do avesso. Cuidado com coluna vazia: linha com NULL não sai em NOT IN, porque para o SQLite "não se sabe" nunca é verdadeiro.

Erros comuns

Você escreveu
SELECT titulo FROM livro WHERE ano = 1890 OR 1937;
O SQLite respondeu
Nenhum erro, e a tabela inteira.
Como consertar
O 1937 sozinho não é condição: o SQLite trata qualquer número diferente de zero como verdadeiro, e verdadeiro no OR libera tudo. Escreva a coluna nas duas pontas, ou use IN (1890, 1937).
Você escreveu
SELECT titulo FROM livro WHERE ano IN 1890, 1937;
O SQLite respondeu
near "1890": syntax error
Como consertar
A lista do IN vai entre parênteses: IN (1890, 1937).
Você escreveu
SELECT titulo FROM livro WHERE ano = 1937 AND paginas < 200 OR paginas > 300;
O SQLite respondeu
Nenhum erro, e uma linha que nem é de 1937: O Cortiço.
Como consertar
O AND fechou primeiro, então o OR deixou entrar qualquer livro grandão de qualquer ano — e O Cortiço, de 1890, tem 304 páginas. Ponha o OR num bloco: AND (paginas < 200 OR paginas > 300).

Veja também

Onde isso aparece no jogo

No jogo Delegacia SQL, AND, OR e IN é o que resolve o inquérito 004, "O homem que sabia o número do relógio". SISPOL, que aparece nas dicas, é o computador da delegacia do jogo.

Jogar Delegacia SQL