Вы находитесь на странице: 1из 32

SQL

Join relacionamento entre tabelas.

Eliminao de repeties
Para eliminar as repeties existentes nas linhas resultantes de um SELECT podemos utilizar a clusula DISTINCT, imediatamente depois da palavra inicial do comando SELECT. Ex.: Select localidade from postal; Select distinct localidade from postal;

Agrupando resultados de uma query.


Atravs do comando group by podemos agrupar dados. Exemplo : Apresente a quantidade de alunos por cidade. Select cidade, count(*) from alunos group by (cidade);

O comando HAVING.
O comando having tem finalidade semelhante ao comando where, que ser o elemento de declarao da juno entre resultados agrupados, portanto uma condio aplicada sobre grupo.

O comando HAVING
Exemplo : Vamos selecionar apenas os dados que apresentem salrios superiores a 2000 agrupados por cidade.
select cidade, sum(salario) soma from funcionarios group by (cidade) having sum(salario) > 2000

Juntando tabelas.
O join entre tabelas permite extrair, atravs de um nico
select, informaes contidas em vrias tabelas. O modelo relacional estabelece claramente as regras para a diviso da informao entre vrias tabelas, de forma a evitar a duplicao de informao. A ligao entre as tabelas realizada atravs da ligao entre as chaves estrangeiras e as respectivas chaves primrias de onde so originrias.

Dado as duas tabelas abaixo:

Produto cartesiano
Para juntar os dados das duas tabelas temos: Select * from funcionrios, cargos; O produto cartesiano entre as tabelas funcionrios e cargos associa a cada

linha da tabela funcionrio o conjunto


de linhas da tabela cargos;

O nmero total de registros da tabela cargos so 15 e o nmero de registros da tabela funcionrios so 30. Logo cada registro de cargos ligado a tabela funcionrios resultar em 450 registros.

CROSS JOIN.
O produto cartesiano entre tabelas tambm conhecido como CROSS JOIN.

Select * from cargos, funcionrios


Where cargos.codigo_cargo=funcionrios.codigo_cargo;

Todas as colunas pertencentes a ambas as tabelas, sero apresentadas no resultado do comando. Como a ligao entre tabelas realizada atravs da igualdade entre duas colunas, este tipo particular de join chama-se Equi-join.

Equi-Join
Quando todas as colunas das tabelas so apresentadas e a ligao entre as tabelas feita atravs de uma igualdade, dando origem assim a duas colunas de contedo exatamente iguais.

INNER Join
O inner join corresponde a uma outra designao para o tipo de Join habitual em que se junta duas ou mais tabelas, ligando-se atravs da chave primria de uma e da chave estrangeira da outra. Em um inner join, apenas so representados os registros que exista ligao entre as tabelas.

Campos iguais !!!!


Se os campos de seleo ou juno de duas tabelas tiverem o mesmo nome, ento para eliminar quaisquer ambigidades cada um dos campos deve ser precedido do nome da tabela, seguido de um ponto.

Dado duas tabelas comisso e pessoa apresente o cdigo do cliente, o se u nome e o valor da comisso.
Select p.codcli, p.nome, c.valor From pessoa p, comisso c Where c.codigocomissao=p.codigocomissao;

Select p.codcli, p.nome, c.valor From pessoa p INNER JOIN comisso c ON c.codigocomissao=p.codigocomissao;

Selecione o nome e o valor das comisses,


ordenando o resultado por nome, colocando os maiores valores da comisso no topo do

resultado de cada indivduo.


Select p.codcli, p.nome, c.valor From pessoa p, comisso c Where c.codigocomissao=p.codigocomissao; Order by nome, valor desc;

OUTER JOIN
Este tipo particular de Juno permite

estender o conjunto de registros que obtido


atravs do inner join. O papel do Outer Join estender este conceito, permitindo que a

totalidade das linhas de uma tabela seja


obtida, ainda que no exista o valor correspondente na outra tabela que esta est

ligada pela juno.

OUTER JOIN
O OUTER JOIN pode ser realizado esquerda ou direita, isto , quando se faz a ligao entre duas tabelas ser mostrado respectivamente, todo o comando da tabela da esquerda e a respectiva ligao tabela da direita, ou ser mostrado todo o contedo da tabela direita e a respectiva ligao tabela da esquerda.

Left Join
Quando o Outer Join realizado a esquerda, so considerados todos os registros da tabela da esquerda e apenas os registros correspondentes da tabela a direita.

Right join
Quando o Outer Join realizado a direita, so considerados todos os

registros da tabela da direita e apenas


os registros correspondentes da tabela a esquerda.

Left Join

Uma unio permite juntar o contedo de dois ou mais comandos SELECT.

Union

Exemplo: Juntar o cdigo e a descrio associados


mensagens aos cdigos postais

UNION
Em uma UNION o nmero de campos a serem

selecionados

em

cada um

dos

comandos

SELECT tem de ser igual. O nome dos campos no relevante, mas o tipo de dados que

pode ser agrupado varia de sistema para


sistema. Em uma UNION o nome das colunas apresentado o nome das colunas

selecionadas na primeira instruo SELECT.

Self Join
O Self Join uma variante do INNER JOIN, no qual se comparam duas colunas da mesma tabela. Quando se coloca duas ou mais vezes a mesma tabela em um select, deve-se obrigatoriamente utilizar um alis para evitar a inevitvel ambigidade que vai existir em todas as referncias aos campos dessa tabela. Este tipo de join utilizado quando uma tabela est relacionada com ela prpria.

Self Join

Ex: Se cada empregado tiver um chefe associado, existe uma relao recursiva, pois id do seu chefe ir aparecer na

tabela

associado

a cada

registro.

Mas no podemos

esquecer que cada chefe tambm empregado na mesma empresa.


SELECT p1.codfuncionario, p1.nomefuncionario, p2.codgerente, p2.nomefuncionario FROM funcionario p1, funcionario p2 WHERE p1.codfuncionario = p2.codfuncionario

SELECT p1.codfuncionario, p1.nomefuncionario AS gerente, p2.codfuncionario, p2.nomefuncionario FROM funcionario p1, funcionario p2 WHERE p1.codfuncionario = p2.codgerente;

INTERSECT
O operador INTERSECT permite juntar o resultado de

dois comandos SELECT, apresentando apenas as linhas


que resultam de ambos os comandos. Ex1.: Selecione todas as linhas da tabela postal cujo cdigo seja menor ou igual a 5; SELECT codpostal, localidade FROM postal WHERE codpostal <=5

Ex2.: Selecione todas as linhas da tabela postal cujo cdigo seja maior ou igual a 5; SELECT codpostal, localidade FROM postal WHERE codpostal >=5

Exerccio: Selecione todas as linhas da tabela postal que resultem da interseo entre as duas consultas.

SELECT codpostal, localidade FROM postal WHERE codpostal <=5 INTERSECT SELECT codpostal, localidade FROM postal WHERE codpostal >=5

MINUS
O operador MINUS devolve os registros que resultam do primeiro SELECT e que no aparecem no segundo. Ex.: Selecionar todas as linhas da tabela POSTAL cujo cdigo seja menor ou igual a 8, ignorando todos os elementos cujo cdigo esteja entre 2 e 6. Select * from postal where codpostal <=8 Minus Select * from postal where codpostal between 2 and 6;

Вам также может понравиться