Operações de Diferença em Banco de Dados

Operações de Diferença em Banco de Dados

Um dos recursos mais poderosos na linguagem SQL é justamente a possibilidade de realizar operações de diferença entre conjuntos na manipulação das tabelas em um banco de dados. Tradicionalmente, na teoria dos conjuntos, arcabouço original da álgebra relacional, a qual evoluiu-se para a linguagem SQL, a operação de diferença é facilmente explicada pela figura abaixo.

Na figura, a área preenchida representa o resultado de uma operação de diferença entre os conjuntos A e B. Pois bem, na prática, a operação de diferença poderá encontrar as exceções dentro de universo de dados distintos. Tomemos por exemplo, a necessidade de encontrar os torcedores que fujam de uma determinada regra. Queremos encontrar os torcedores que não se enquadram na regra TORCEM PARA O VITORIA OU TENHAM OLHOS CASTANHOS.

Suponhamos então que o banco de dados modelado para criar o universo de dados registrou a possibilidade de um torcedor torcer por mais de um time. Além disto, as características físicas dos torcedores são registradas na entidade que os representam, conforme a figura abaixo.

Nestas condições, existem diferentes formas de atender à consulta solicitada.

Podemos resolvê-la através de um teste de existências (EXISTS):

SELECT cod_torcedor

FROM torcedor as t

WHERE NOT EXISTS (

SELECT *

FROM  torcedor_time as tt INNER JOIN time as tm

on

((tt.cod_time=tm.cod_time and tt.cod_torcedor=t.cod_torcedor and tm.nome_time='Vitoria')

or t.cor_olhos = 'castanhos')

)

Também podemos resolvê-la através de uma operação de não estar contido (NOT IN) em um determinado conjunto de resultados:

SELECT t.cod_torcedor

FROM torcedor as t

WHERE cod_torcedor not in (

SELECT t.cod_torcedor

FROM torcedor as t inner join torcedor_time as tt

on (tt.cod_torcedor = t.cod_torcedor)

INNER JOIN time as tm

on (tt.cod_time = tm.cod_time)

WHERE tm.nome_time = 'Vitoria' OR t.cor_olhos = 'castanhos')

Ou da forma que prefiro e acho mais elegante, utilizando uma operação LEFT JOIN (obs. O Vitória tem código '2' na tabela torcedor_time):

SELECT t.cod_torcedor

FROM torcedor as t LEFT JOIN torcedor_time as tt

on ((t.cod_torcedor = tt.cod_torcedor and tt.cod_time = 2) or t.cor_olhos = 'castanhos')

WHERE tt.cod_time is null

-----------------------------------------------------------------------------------------------------------

Para aprender mais sobre SQL, acesse nossos cursos da Aprenda Virtual.

Clique para conhecer o curso de PL/SQL na Aprenda Virtual

Clique para conhecer o curso de SQL na Aprenda Virtual

Nenhum Comentário

Escrever um Comentário