SQL AND

A Loja Aurora vai fazer um evento em Teresina só para clientes especiais, e a Ana precisa da lista de convidados: clientes do Piauí que também sejam VIP. São duas condições, e as duas têm de valer ao mesmo tempo. Com o WHERE que você já conhece, dá para testar uma coisa só. Para juntar duas (ou mais), existe o AND (em inglês, "e"): esta condição e aquela.

Você vai aprender
  • A juntar duas condições com AND, e como o banco decide cada linha.
  • A tabela-verdade do AND: só dá verdadeiro quando as duas partes são verdadeiras.
  • A usar o AND com colunas diferentes e com a mesma coluna (uma faixa de valores).
  • Que cada AND a mais deixa o resultado menor (ou igual), nunca maior.
  • Os erros mais comuns: a condição impossível, o AND pela metade e o && de outras linguagens.

A ideia: o porteiro com duas regras

Pense no porteiro do evento. Ele tem uma lista com duas regras: "só entra quem mora no Piauí e é VIP". Para cada pessoa da fila, ele confere as duas coisas:

  • Mora no Piauí e é VIP? Entra.
  • Mora no Piauí, mas não é VIP? Fica de fora.
  • É VIP, mas mora no Ceará? Fica de fora.
  • Nem uma coisa nem outra? Fica de fora.

Basta uma regra falhar para a pessoa ficar de fora. Esse é o AND: a linha só entra no resultado se todas as condições forem verdadeiras.

A tabela-verdade

Na aula Comparações você viu que o banco responde 1 para "verdadeiro" e 0 para "falso". A tabela abaixo mostra todas as combinações possíveis de duas condições com AND. Ela se chama tabela-verdade:

Condição ACondição BA AND BNo evento
verdadeira (1)verdadeira (1)verdadeira (1)Do Piauí e VIP: entra
verdadeira (1)falsa (0)falsa (0)Do Piauí, não VIP: fora
falsa (0)verdadeira (1)falsa (0)VIP de outro estado: fora
falsa (0)falsa (0)falsa (0)Nenhuma das duas: fora

Você pode conferir a tabela no próprio banco, com um SELECT sem tabela:

SELECT 1 AND 1, 1 AND 0, 0 AND 1, 0 AND 0;

Só a primeira combinação deu 1. As outras três deram 0.


1. O primeiro AND

A lista de convidados da Ana:

SELECT nome, cidade
FROM clientes
WHERE estado = 'PI' AND vip = 1;
WHERE
"Onde": a partir daqui vêm as condições.
estado = 'PI'
A primeira condição: o cliente mora no Piauí.
AND
"E": junta as duas condições. A linha só passa se as duas forem verdadeiras.
vip = 1
A segunda condição: o cliente é VIP.
;
Fim do comando.

Só 2 clientes: José Ribamar e Larissa. Compare com o que você já sabe: o Piauí tem 14 clientes (aula WHERE), e a loja tem 5 VIPs. O AND ficou com quem está nas duas listas ao mesmo tempo.

Como o banco decide, linha por linha

  1. Cliente 1, José Ribamar Silva: estado 'PI' (1) e vip 1 (1). 1 AND 1 = 1: entra.
  2. Cliente 2, Maria Clara Mendes: estado 'PI' (1), mas vip 0 (0). 1 AND 0 = 0: fica de fora.
  3. Cliente 3, Ana Beatriz Sousa: vip 1 (1), mas estado 'SP' (0). 0 AND 1 = 0: fica de fora.
  4. Cliente 4, Carlos Eduardo Lima: estado 'CE' (0) e vip 0 (0). 0 AND 0 = 0: fica de fora.
  5. …e assim até o cliente 30.

Os quatro primeiros clientes da tabela, por coincidência, passam pelas quatro linhas da tabela-verdade.


2. Condições em colunas diferentes

Cada condição do AND pode testar uma coluna diferente. A Ana quer saber quais produtos são baratos (menos de R$ 30) e têm muito estoque (mais de 100 unidades), para uma promoção de "leve 3":

SELECT nome, preco, estoque
FROM produtos
WHERE preco < 30 AND estoque > 100;

Cinco produtos, cada um com preço abaixo de 30 e estoque acima de 100. A Mochila Escolar não entrou (tem pouco estoque e é cara), nem o Carregador USB-C (tem 150 unidades, mas custa 45.5). Mais um, com os funcionários:

SELECT nome, cargo, salario
FROM funcionarios
WHERE cargo = 'Vendedor' AND salario > 3000;

Dos três vendedores, dois ganham mais de 3000. O Igor (2980.9) ficou de fora pela segunda condição. E as vendedoras, Renata e Sofia, ficaram de fora pela primeira: 'Vendedora' não é igual a 'Vendedor'.

Missão: a loja quer convidar para o programa VIP os clientes de Teresina que ainda não são VIP (vip = 0). Complete o WHERE com as duas condições.

SELECT nome, cidade
FROM clientes
WHERE cidade = 'Teresina';
SELECT nome, cidade
FROM clientes
WHERE cidade = 'Teresina' AND vip = 0;

3. A mesma coluna duas vezes: uma faixa

O AND também serve para testar a mesma coluna duas vezes, e isso cria uma faixa de valores. Quais produtos custam entre 20 e 30 reais?

SELECT nome, preco
FROM produtos
WHERE preco >= 20 AND preco <= 30;

Leia como uma frase: "preço maior ou igual a 20 e preço menor ou igual a 30". Um produto de 15 reais falha na primeira parte; um de 50 falha na segunda. Só os que estão no meio passam nas duas: 9 produtos.

Escreva a coluna nas duas condições

Em português dizemos "preço maior que 20 e menor que 30", sem repetir a palavra "preço". No SQL, cada lado do AND é uma condição completa, com a coluna, o sinal e o valor: preco >= 20 AND preco <= 30. Se você esquecer a coluna na segunda, vem o erro que está em Quando dá errado.

Faixas aparecem muito com datas. Os pedidos de 2025 são os que têm a data a partir de 1º de janeiro de 2025 e antes de 1º de janeiro de 2026:

SELECT id, data
FROM pedidos
WHERE data >= '2025-01-01' AND data < '2026-01-01';

São 32 pedidos, do 33 ao 64. Repare no < (e não <=) no fim da faixa: assim, o dia 1º de janeiro de 2026 fica de fora, e todo o dia 31 de dezembro de 2025 fica dentro. Para faixas, o SQL tem também um atalho, o BETWEEN ("entre"), da aula BETWEEN.


4. Três condições ou mais

Dá para encadear quantos AND você quiser. A linha só passa se todas as condições forem verdadeiras. Um cliente quer um eletrônico (categoria 2), de menos de R$ 50, que esteja disponível (estoque maior que zero):

SELECT nome, preco, estoque
FROM produtos
WHERE categoria_id = 2 AND preco < 50 AND estoque > 0;

Os eletrônicos baratos são três: o carregador, o cabo HDMI e o pen drive (29.9). Mas o pen drive tem estoque 0, e a terceira condição o tirou da lista. Sobraram 2.

Quando a lista de condições cresce, o costume é pôr cada AND no começo de uma linha. Fica fácil de ler e de apagar uma condição:

SELECT nome, preco, estoque
FROM produtos
WHERE categoria_id = 2
  AND preco < 50
  AND estoque > 0;
Cada AND só tira, nunca põe

Acrescentar um AND é como pôr mais uma peneira, mais fina, embaixo da outra. O resultado pode ficar menor ou continuar igual, mas nunca ganha linhas. Nos produtos: só eletrônicos são 7; eletrônicos de menos de 50 são 3; de menos de 50 e com estoque, 2. Se você precisa que o resultado cresça, ("os do Piauí e também os do Ceará"), o que você quer é o OR, da próxima aula: OR.

Missão: o frete grátis aparece como 0.0 na coluna frete. Quais pedidos tiveram frete grátis e foram feitos em 2026 (data a partir de '2026-01-01')? Mostre o id, a data e o frete.

SELECT id, data, frete
FROM pedidos
WHERE frete = 0;
SELECT id, data, frete
FROM pedidos
WHERE frete = 0 AND data >= '2026-01-01';

Formas diferentes de fazer a mesma coisa

A ordem das condições no AND não muda o resultado. Estas duas consultas trazem os mesmos 2 clientes:

SELECT nome, cidade FROM clientes WHERE estado = 'PI' AND vip = 1;
SELECT nome, cidade FROM clientes WHERE vip = 1 AND estado = 'PI';

É como na matemática: 2 × 3 é igual a 3 × 2. E para a faixa de preços, o BETWEEN faz o mesmo que os dois testes com AND:

SELECT nome, preco
FROM produtos
WHERE preco BETWEEN 20 AND 30;

Os mesmos 9 produtos. Repare que o BETWEEN também usa a palavra AND, mas ali ela só separa o começo e o fim da faixa. A aula BETWEEN explica.

FormaQuando usar
a AND b numa linhaDuas condições curtas
Um AND por linhaTrês condições ou mais
preco >= 20 AND preco <= 30Faixas, principalmente quando uma ponta é < e a outra é >= (como nas datas)
preco BETWEEN 20 AND 30Faixas com as duas pontas incluídas

Quando dá errado

A condição impossível

A Ana quer mandar um email para os clientes do Piauí e do Ceará. Em português, ela pensou "do Piauí e do Ceará", e escreveu:

SELECT nome, estado
FROM clientes
WHERE estado = 'PI' AND estado = 'CE';

Nenhuma linha, e nenhum erro. A consulta está correta para o banco, mas pede o impossível: um cliente cujo estado seja 'PI' e, ao mesmo tempo, 'CE'. Cada linha tem um estado só, então nenhuma passa nas duas condições. O "e" do português, nessa frase, quer dizer "junte as duas listas", e isso é o OR: WHERE estado = 'PI' OR estado = 'CE' (aula OR).

Como perceber: se o AND testa a mesma coluna com dois = diferentes, o resultado vai ser sempre vazio.

O AND pela metade
SELECT nome, preco
FROM produtos
WHERE preco > 20 AND < 50;

near "<": syntax error. Depois do AND, o banco espera uma condição completa, e encontrou um < solto: menor que o quê? Como consertar: repita a coluna: preco > 20 AND preco < 50.

Dois WHERE
SELECT nome, cidade
FROM clientes
WHERE estado = 'PI' AND WHERE vip = 1;

near "WHERE": syntax error. Uma consulta tem um WHERE só; as condições a mais entram com AND, sem repetir a palavra. Como consertar: WHERE estado = 'PI' AND vip = 1.

&& no lugar de AND

Em muitas linguagens de programação, o "e" se escreve &&. No SQLite, não:

SELECT nome, cidade
FROM clientes
WHERE estado = 'PI' && vip = 1;

near "&": syntax error. Como consertar: escreva a palavra AND.

Esqueceu a segunda condição
SELECT nome
FROM produtos
WHERE preco > 100 AND;

near ";": syntax error. O comando acabou logo depois do AND, e o banco ainda esperava uma condição. Acontece quando se apaga a última condição e o AND fica para trás. Como consertar: complete a condição ou apague o AND.

Nos outros bancos

O MySQL aceita && como sinônimo de AND, mas a documentação dele avisa que isso é uma extensão fora do padrão, está obsoleta e pode deixar de existir numa versão futura. Use sempre a palavra AND: ela funciona em todos os bancos.

Missão: a consulta deveria mostrar os produtos de 20 a 30 reais, mas dá erro. Conserte.

SELECT nome, preco
FROM produtos
WHERE preco >= 20 AND <= 30;
SELECT nome, preco
FROM produtos
WHERE preco >= 20 AND preco <= 30;

Referência rápida

EscritaO que faz
WHERE a AND bSó as linhas em que a e b são verdadeiras
WHERE a AND b AND cSó as linhas em que todas são verdadeiras
WHERE preco >= 20 AND preco <= 30Uma faixa de valores na mesma coluna
SELECT 1 AND 0;Testa o AND sem tabela (dá 0)
SintomaCausa provável
Nenhuma linha, sem erroCondição impossível: a mesma coluna igual a dois valores. Você queria OR
near "<": syntax error (ou ">", "<="…)Faltou a coluna depois do AND
near "WHERE": syntax errorUm segundo WHERE: use só AND
near "&": syntax error&& no lugar de AND
near ";": syntax errorUm AND sobrando no fim

Exercícios

1. VIP de São Paulo

Complete para mostrar os clientes de São Paulo que são VIP:

SELECT nome FROM clientes WHERE estado = 'SP' vip = 1;

2. Estoque entre 50 e 100

Complete a coluna que falta:

SELECT nome FROM produtos WHERE estoque >= 50 AND <= 100;

3. Qual é o resultado de SELECT 1 AND 0;?

4. Uma consulta com WHERE estado = 'PI' trouxe 14 linhas. Se você acrescentar AND vip = 1, quantas linhas podem vir?

5. WHERE cidade = 'Recife' AND cidade = 'Picos' trouxe nenhuma linha. Por quê?

6. Qual destas condições está escrita do jeito certo?

Missão final: a prateleira de esportes

Missão: um cliente quer um presente da categoria Esporte e Lazer (categoria_id = 6) que custe até R$ 30. Mostre o nome e o preço das opções.

SELECT nome, preco
FROM produtos
WHERE categoria_id = 6;
SELECT nome, preco
FROM produtos
WHERE categoria_id = 6 AND preco <= 30;

Das cinco opções da categoria, só duas cabem no orçamento: a garrafa squeeze e a corda de pular.


Resumo

  • AND ("e") junta condições no WHERE: a linha só entra se todas forem verdadeiras.
  • Na tabela-verdade, só 1 AND 1 dá 1; qualquer 0 deixa o resultado em 0.
  • As condições podem testar colunas diferentes (preco < 30 AND estoque > 100) ou a mesma coluna, formando uma faixa (preco >= 20 AND preco <= 30).
  • Cada lado do AND é uma condição completa: repita a coluna. Uma consulta tem um WHERE só.
  • Cada AND a mais só tira linhas. A mesma coluna igual a dois valores dá sempre vazio: aí você queria OR.
  • A ordem das condições não muda o resultado. Escreva AND, nunca &&.