Consulta SQL, tabela verdade

Olá pessoal, tive um problema em um SQL, o qual não era para retornar registro algum, mas retornou um. A questão é a seguinte, os parametros da minha pesquisa resultaram no seguinte: a primeira condição deu TRUE a segunda FALSE a terçeira TRUE e a quarta FALSE, com os operadores OU, OU e AND, ficando tabela true OU false OU true AND false, a questão é como pode retornar registros este select se tenho um AND false no final? resolvi o problema com (true OU false OU true) AND false, mas confesso que não entendi como é calculada estas condições, alguém pode me explicar o por que retornou registro?

select xxx from yyy where true OU false OU true AND false

Olá dudu795,

Na boa, tenta explicar melhor sua dúvida, veja que nem você conseguiu entender o resultado, imagina nós entender a dúvida.

Abraços.

_ _
Fabiano Abreu
Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL

O problema de misturar OR e AND no mesmo select é que você não sabe onde "começa" um e "termina" o outro.

Você pode pensar que o OR está um nível acima.

Para ficar claro, um exemplo. Para a seguinte tabela (em Mysql):

drop table if exists Pessoas;

create table Pessoas
(
  nome varchar(100),
  idade int,
  sexo varchar(1)
);

insert into Pessoas
select 'Abel', 30, 'M' union
select 'Bruno', 18, 'M' union
select 'Carla', 25, 'F' union
select 'Daniela', 32, 'F';

Considere a seguinte situação:
Numa tabela de pessoas quero selecionar todas as mulheres abaixo de 30 anos e todos os homens acima de 30.

Podemos tentar o seguinte:

O OR vai separar as condições em 2 grupos, sendo o equivalente ao código abaixo:

Portanto, neste caso, conseguimos responder a query do jeito que queremos.

Agora, uma outra situação:
Selecionar todos os homens abaixo de 18 ou acima de 25. Podemos tentar o seguinte:

Mas isso será lido, na verdade, como o seguinte:

Trazendo todo mundo acima de 25 independente do sexo.

No seu exemplo, como a primeira expressão já retornou true, ele irá retornar o registro.

Para não precisar pensar nessa ordem de avaliação, use parenteses sempre que for misturar AND e OR no mesmo WHERE.
Sua intenção fica explicíta e evita esse tipo de engano.

A prioridade do AND é maior que a do OR (é como se o AND fosse multiplicação e o OR fosse adição).

Mas como lhe disseram, se você acha que vai dar confusão, ponha parênteses. Isso não vai deixar sua query mais lenta ou mais rápida, e vai lhe ajudar com a redução de confusão (lembre-se que código foi feito para ser lido por humanos também :slight_smile: )

Um exemplo para o dialeto usado pelo MS SQL Server: http://msdn.microsoft.com/en-us/library/ms190276.aspx

dúvida esclarecida.