Trazendo linhas a mais?

Query bonita escrita, executada, resultado zoado. Quem nunca teve uma query respondendo um monte de coisa que não foi pedido?

Gostaria de trazer os livros ativos cujos preços tem algo de estranho: são muito baratos (< 10) OU muito caros (> 1000)

select * from Livros
where ativo = true
AND preco < 10 OR preco > 1000;

> Java SE 8 Programmer I, true, 5
> Swift, true, 3000
> Introdução a Computação, false, 2000

Que caca! O espertinho trouxe um livro que está inativo. Mas eu pedi ativo, não pedi? Pedi ativo, sim:

where ativo = true

O que aconteceu? Opa! Como já dizia meu pai, “e ou” não é a mesma coisa que “ou e”. Vamos ver? Troco a ordem do nosso AND OR por OR AND:

select * from Livros where
preco < 10 OR preco > 1000
AND ativo = true;

> Java SE 8 Programmer I, true, 5
> Swift, true, 3000
> Algortimos, false, 37

Opa lá! Não é mesmo! Para com isso!

Acontece que como em qualquer linguagem, SQL também segue padrões de precedência de operadores. Se quer forçar sua própria ordem, diga aos SQL como diria a sua professora de matemática: use parênteses.

select * from Livros where
  (preco < 10 OR preco > 1000)
    AND ativo = true;

> Java SE 8 Programmer I, true, 5
> Swift, true, 3000

A sacada? Sempre que escrever uma regra que envolva um OR, utilize parentêses.

Gostou das boas práticas? recomende a lista para um amigo!

Desafio para a próxima: devo criar lógica de negócios complexa no banco? Quando usar a tal da stored procedure?

Fique por dentro

(Última atualização em: 21 de fevereiro de 2017)

Tech Education Leader no Alura

  • Quem nunca bateu cabeça com um OR no meio de uma query ou até mesmo numa lógica de programa que atire o primeiro byte.

Próximo ArtigoFerramentas de design: vale a pena piratear?