Trazendo linhas a mais?
Query bonita escrita, executada, resultado zoado.
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?