Selling Story Max Excellence DIS - Q2'24 DIS VJ (1).pdf
SQL - Operações Relacionais
1. Programação e Sistemas de Informação – Linguagem de Manipulação de Dados
Módulo 14
Linguagem SQL - Operações Relacionais no SQL
O SQL permite realizar operações relacionais com as tabelas. Estas resumem-se a oito operações.
Restrição ou Selecção
Produz uma tabela com todos os registos de uma outra tabela que satisfazem uma dada condição. É o resultado da aplicação de um SELECT.
select *
from computador
where lucro>50;
Projecção
Produz uma tabela com todos os registos de uma outra tabela, mas só com alguns atributos.
select designacao
from computador;
1 Alexandre Alcobia 2011
2. Programação e Sistemas de Informação – Linguagem de Manipulação de Dados
Produto cartesiano
Produz uma tabela contendo todas as combinações entre os registos de duas tabelas.
select *
from computadores as C, fornecedores as F;
O número de registos é o produto do número de registos da tabela computadores com o número de registos da tabela fornecedores.
2 Alexandre Alcobia 2011
3. Programação e Sistemas de Informação – Linguagem de Manipulação de Dados
União
Produz uma tabela que contém todos os registos que estão em cada uma das tabelas especificadas.
select idC as ID,designacao as Nome
from computadores
union
select idf,fornecedor
from fornecedores;
A união pode surgir, também, com a aplicação do operador OR.
select *
from computadores
where preco>750 or preco<600;
3 Alexandre Alcobia 2011
select *
from computadores
where preco>750;
select *
from computadores
where preco<600;
union
4. Programação e Sistemas de Informação – Linguagem de Manipulação de Dados
Interseção
Produz uma tabela que contém os registos comuns às duas tabelas especificadas.
Esta operação surge da aplicação do operador AND.
select *
from computadores
where preco>=600 and preco<=745;
Neste caso não seria devolvido qualquer registo, pois não há qualquer registo comum às duas condições.
Uma outra maneira de construir a intersecção é usando INTERSECT.
select *
from computadores
where preco>=600
intersect
select *
from computadores
where preco<=745;
4 Alexandre Alcobia 2011
select *
from computadores
where preco between 600 and 745;
5. Programação e Sistemas de Informação – Linguagem de Manipulação de Dados
Diferença
Produz uma tabela com todos os registos da primeira tabela especificada que não estão na segunda tabela especificada.
Usa-se o operador NOT. Em alternativa poderá ser usado o operador EXCEPT.
select *
from computadores
where not preco<600;
Junções
Equi-Join
Produz uma tabela cujos registos são a combinação de registos de duas tabelas especificadas. Os registos origem são combinados por um campo
comum que é chave primária numa tabela e chave estrangeira na outra tabela.
select *
from fornecedores F, computadores C
where F.idF=C.idF;
É originada uma equijunção (equi-join), pois ela é devida ao sinal de igual na condição where.
Não há necessidade de apresentar campos repetidos na tabela produzida, pelo que deveria ser:
select F.idF, F.fornecedor, C.idC, C.designacao, C.preco, C.lucro
from fornecedores F, computadores C where F.idF=C.idF;
5 Alexandre Alcobia 2011
select *
from computadores
except
select *
from computadores
where preco<600;
Chave primária Chave estrangeira
6. Programação e Sistemas de Informação – Linguagem de Manipulação de Dados
Deste modo o campo idF só aparece uma vez. A esta junção dá-se o nome de natural (junção natural).
Inner Join
Dá-se o nome de inner join às junções acima apresentadas. Neste caso só os registos que têm correspondência nas duas tabelas é que são apresentados.
No Access podemos construir esta operação usando:
select F.idF, F.fornecedor, C.idC, C.designacao, C.preco, C.lucro
from fornecedores F inner join computadores C
on F.idF=C.idF;
Outer Join
Esta junção estende o conceito do inner join, permitindo que a totalidade dos registos de uma das tabelas especificadas apareça na tabela final apesar
de haver registos sem correspondência com a outra tabela especificada.
select F.idF, F.fornecedor, C.idC, C.designacao, C.preco, C.lucro
from fornecedores F left join computadores C on F.idF=C.idF;
6 Alexandre Alcobia 2011
7. Programação e Sistemas de Informação – Linguagem de Manipulação de Dados
Neste caso, a tabela que apresenta todos os registos é a fornecedores pois está definido pelo left join – é a tabela especificada à esquerda –. Caso fosse
right join, seria a tabela computadores.
Podemos obter um resultado semelhante usando
select F.idF, F.fornecedor, C.idC as IDC, C.designacao as DESIG, C.preco as PR, C.lucro as LC
from fornecedores as F ,computadores as C
where F.idF=C.idF
union
select idF,fornecedor, null as IDC, null as DESIG, null as PR, null as LC
from fornecedores
where idF <> all (select idF from computadores);
Ou, então
7 Alexandre Alcobia 2011
8. Programação e Sistemas de Informação – Linguagem de Manipulação de Dados
select F.idF, F.fornecedor, C.idC as IDC, C.designacao as DESIG, C.preco as PR, C.lucro as LC
from fornecedores as F ,computadores as C
where F.idF=C.idF
union
select idF,fornecedor, null as IDC, null as DESIG, null as PR, null as LC
from fornecedores
where idF not in (select idF from computadores);
8 Alexandre Alcobia 2011