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.
- 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
ANDcom colunas diferentes e com a mesma coluna (uma faixa de valores). - Que cada
ANDa mais deixa o resultado menor (ou igual), nunca maior. - Os erros mais comuns: a condição impossível, o
ANDpela 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 A | Condição B | A AND B | No 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
- Cliente 1, José Ribamar Silva: estado
'PI'(1) e vip1(1).1 AND 1= 1: entra. - Cliente 2, Maria Clara Mendes: estado
'PI'(1), mas vip0(0).1 AND 0= 0: fica de fora. - Cliente 3, Ana Beatriz Sousa: vip
1(1), mas estado'SP'(0).0 AND 1= 0: fica de fora. - Cliente 4, Carlos Eduardo Lima: estado
'CE'(0) e vip0(0).0 AND 0= 0: fica de fora. - …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.
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;
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.
| Forma | Quando usar |
|---|---|
a AND b numa linha | Duas condições curtas |
Um AND por linha | Três condições ou mais |
preco >= 20 AND preco <= 30 | Faixas, principalmente quando uma ponta é < e a outra é >= (como nas datas) |
preco BETWEEN 20 AND 30 | Faixas com as duas pontas incluídas |
Quando dá errado
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.
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.
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.
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.
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
| Escrita | O que faz |
|---|---|
WHERE a AND b | Só as linhas em que a e b são verdadeiras |
WHERE a AND b AND c | Só as linhas em que todas são verdadeiras |
WHERE preco >= 20 AND preco <= 30 | Uma faixa de valores na mesma coluna |
SELECT 1 AND 0; | Testa o AND sem tabela (dá 0) |
| Sintoma | Causa provável |
|---|---|
| Nenhuma linha, sem erro | Condiçã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 error | Um segundo WHERE: use só AND |
near "&": syntax error | && no lugar de AND |
near ";": syntax error | Um 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:
2. Estoque entre 50 e 100
Complete a coluna que falta:
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 noWHERE: a linha só entra se todas forem verdadeiras.- Na tabela-verdade, só
1 AND 1dá 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 umWHEREsó. - Cada
ANDa mais só tira linhas. A mesma coluna igual a dois valores dá sempre vazio: aí você queriaOR. - A ordem das condições não muda o resultado. Escreva
AND, nunca&&.