Precedência Envolvendo Operadores Lógicos
Este post visa complementar um assunto apresentado no terceiro capítulo do livro Oracle DBA Essencial – Vol. I – SQL, com vistas à prova de certificação IZO-051. Portanto, pressupõe-se que o leitor já leu o referido capítulo. Também assume-se que exista um esquema possuindo tabelas e dados populados pelo arquivo de apoio 00_Monta_Ambiente_Locadora.sql (presente nos arquivos de apoio do Vol. I).
Quando utilizamos predicados conectados por operadores lógicos AND e OR precisamos observar que OR funciona como adição e AND como multiplicação. Portanto AND tem mais “força” que OR.
O Exemplo 3.1 apresenta uma consulta possuindo três predicados e dois operadores lógicos .
SQL> SELECT nome ,
to_char(dt_nascimento,’dd/mm/yyyy’) Nascimento,
pais_origem
FROM profissional_cinema
WHERE pais_origem = ‘Inglaterra’ — primeiro predicado
OR nome LIKE ‘J%’ — segundo
AND extract(YEAR FROM dt_nascimento) < 1950 — terceiro
ORDER by 3,1
NOME NASCIMENTO PAIS_ORIGEM
—————————— ———- ——————-
Jeannot Szwarc 21/11/1939 França
Julie Christie 14/04/1941 India
Emma Thompson 15/04/1959 Inglaterra
James Mason 15/05/1909 Inglaterra
Jane Seymour 15/02/1951 Inglaterra
Jeremy Irons 19/09/1948 Inglaterra
Kenneth Branagh 10/12/1960 Inglaterra
Kiefer Sutherland 21/12/1966 Inglaterra
8 rows selected
Exemplo 3.1: Consulta possuindo um predicado
Perceba que há ingleses cujo nome NÃO começa por J (ex: Emma Thompson), assim como há ingleses que nasceram DEPOIS de 1950. Desta forma, podemos interpretar a relação de predicados da seguinte maneira:
- Inicialmente separe os ingleses e guarde-os no Conjunto 1;
- A seguir, monte o Conjunto 2 e acrescente-lhe os profissionais de cinema cujo nome comece pela letra J e tenham nascido antes de 1950;
- Como resultado final, faça a união entre os Conjuntos 1 e 2.
Concluindo, o fato de existir um AND após um OR fez com que este fosse processado depois.
Analogamente, a expressão:
5 + 3 x 4
Primeiro resolve-se a multiplicação (equivalente ao AND) e só depois a soma (OR).
Assim como na matemática, para mudar tal comportamento, usamos parênteses. Veja o que muda no Exemplo 3.2
SQL> SELECT nome ,
to_char(dt_nascimento,’dd/mm/yyyy’) Nascimento, pais_origem
FROM profissional_cinema
WHERE (pais_origem = ‘Inglaterra’
OR nome LIKE ‘J%’)
AND extract(YEAR FROM dt_nascimento) < 1950
ORDER BY 3,1;
NOME NASCIMENTO PAIS_ORIGEM
—————————— ———- ——————
Jeannot Szwarc 21/11/1939 França
Julie Christie 14/04/1941 India
James Mason 15/05/1909 Inglaterra
Jeremy Irons 19/09/1948 Inglaterra
4 rows selected
Exemplo 3.2: Consulta onde mudamos a regra de precedência
No Exemplo 3.2, inicialmente foi criado um conjunto possuindo profissionais de cinema nascidos na Inglaterra ou que tenham seu nome começando por J. Neste conjunto, retiramos aqueles que não tenham nascido antes de 1/1/1950.
No comments Digg thisSeja Bem-vindo!
A ideia deste blog é criar um canal com meus leitores. Inicialmente, vou postar pequenos textos que complementem algum tema abordado na Trilogia (por enquanto, só temos o Volume I). Então, mais uma vez, seja bem-vindo e tomara que você goste!
No comments Digg this