Você está na página 1de 7

Consultas SQL de Unio Internas

Consultas de Combinao entre tabelas


As vinculaes entre tabelas se realizam mediante a clusula INNER ue combina re!istros de
duas tabelas sem"re ue tiver concord#ncia de valores em um cam"o comum$ Sua sinta%e &'
SELEC( cam"os )R*+ tb, INNER -*IN tb. *N
tb,$cam"o, com" tb.$cam"o.
*nde'
tb1, tb2 So os nomes das tabelas desde as que se combinam os registros.
campo1,
campo2
So os nomes dos campos que se combinam. Se no so numricos, os campos devem
ser do mesmo tipo de dados e conter o mesmo tipo de dados, porm no tem que ter o
mesmo nome.
comp qualquer operador de comparao relacional: =, <,<, <=, =, ! .
"ode#se utili$ar uma operao %&&'( )*%& em qualquer cl+usula ,(*-. %sto cria uma
combinao por equival.ncia, con/ecida tambm como unio interna. 0s combina1es equivalentes
so as mais comuns2 estas combinam os registros de duas tabelas sempre que tiver concord3ncia de
valores em um campo comum a ambas tabelas. "ode#se utili$ar %&&'( )*%& com as tabelas
4epartamentos e 'mpregados para selecionar todos os empregados de cada departamento. 4o
contr+rio, para selecionar todos os departamentos 5inclusive se algum deles no tiver nen/um
empregado atribu6do7 se emprega 8',9 )*%& ou todos os empregados 5inclusive se algum no
estiver atribu6do a nen/um departamento7, neste caso (%:;9 )*%&.
Se se tenta combinar cam"os ue conten/am dados +emo ou *b0eto *LE1 se "roduz um erro$
2odem3se combinar dois cam"os num&ricos uaisuer1 inclusive se so de di4erentes ti"os de
dados$ 2or e%em"lo1 "ode combinar um cam"o Num&rico "ara o ue a "ro"riedade Size de seu
ob0eto )ield est estabelecida como Inteiro1 e um cam"o Contador$
* e<emplo seguinte mostra como poderia combinar as tabelas =ategorias e "rodutos baseando#se
no campo %4=ategoria:
SELEC(
NomeCate!oria1 Nome2roduto
)R*+
Cate!orias
INNER -*IN
2rodutos
*N
Cate!orias$I5Cate!oria 6 2rodutos$I5Cate!oria
&o e<emplo anterior, %4=ategoria o campo combinado, porm no est+ inclu6do na sa6da
da consulta >+ que no est+ inclu6do na instruo S'8'=9. "ara incluir o campo combinado, incluir
o nome do campo na instruo S'8'=9, neste caso, =ategorias.%4=ategoria.
Detalhamos estas consultas da linguagem SQL to importantes para o bom desenvolvimento de um
banco de dados.
9ambm se pode lin?ar v+rias cl+usulas *& em uma instruo )*%&, utili$ando a seguinte sinta<e:
SELEC( cam"os )R*+ tabela, INNER -*IN tabela.
*N 7tb,$cam"o, com" tb.$cam"o, AN5 *N tb,$cam"o. com" tb.$cam"o.8
*R *N 7tb,$cam"o9 com" tb.$cam"o98
(amb&m "ode anin/ar instrues -*IN utilizando a se!uinte sinta%e'
SELEC( cam"os )R*+ tb, INNER -*IN 7tb. INNER -*IN :7 ;tb9
:INNER -*IN :7 ;tabla% :INNER -*IN $$$8;
*N tb9$cam"o9 com" tb%$cam"o%8;
*N tb.$cam"o. com" tb9$cam"o98
*N tb,$cam"o, com" tb.$cam"o.
Um LE)( -*IN ou um RI<=( -*IN "ode se anin/ar dentro de um INNER -*IN1 "or&m um INNER
-*IN no "ode se anin/ar dentro de um LE)( -*IN ou um RI<=( -*IN$
E%em"lo'
SELEC( 5IS(INC(
Sum72recoUnitario > Quantidade8 AS Sales1
7Nome ? @ @ ? Sobrenome8 AS Name
)R*+
Em"re!ados
INNER -*IN7
2edidos
INNER -*IN
5etal/es2edidos
*N
2edidos$Id2edido 6 5etal/es2edidos$Id2edido8
*N
Em"re!ados$IdEm"re!ado 6 2edidos$IdEm"re!ado
<R*U2 AB
Nome ? @ @ ? Sobrenome
7Cria duas combinaes euivalentes' uma entre as tabelas 5etal/es de "edidos e 2edidos1 e a
outra entre as tabelas 2edidos e Em"re!ados$ Isto & necessrio 0 ue a tabela Em"re!ados no
contem dados de vendas e a tabela 5etal/es de "edidos no contem dados dos em"re!ados$ A
consulta "roduz uma lista de em"re!ados e suas vendas totais$8
Se em"re!armos a clusula INNER na consulta se selecionaro sC aueles re!istros da tabela da
ue tivermos escrito D esuerda de INNER -*IN ue conten/am ao menos um re!istro da tabela
ue tivermos escrito D direita$ 2ara solucionar isto temos duas clusulas ue substituem a
"alavra3c/ave INNER1 estas clusulas so LE)( e RI<=($ LE)( toma todos os re!istros da tabela
da esuerda embora no ten/a nen/um re!istro na tabela da esuerda$ RI<=( realiza a mesma
o"erao1 "or&m ao contrrio1 toma todos os re!istros da tabela da direita embora no ten/a
nen/um re!istro na tabela da esuerda$
A sinta%e e%"osta anteriormente "ertence a ACCESS1 onde todas as sentenas com a sinta%e
4uncionam corretamente$ *s manuais de SQL3SEREER dizem ue esta sinta%e & incorreta e ue
/ ue adicionar a "alavra reservada *U(ER' LE)( *U(ER -*IN e RI<=( *U(ER -*IN$ Na "rtica
4unciona corretamente de uma 4orma ou de outra$
No obstante1 os INNER -*IN *RACLE no & ca"az de inter"ret3los1 mas e%iste uma sinta%e em
4ormato ANSI "ara os INNER -*IN ue 4uncionam em todos os sistemas$ (omando como
re4erFncia a se!uinte sentena'
SELEC(
)aturas$>1
Alvaras$>
)R*+
)aturas
INNER -*IN
Alvaras
*N
)aturas$IdAlvara 6 Alvaras$IdAlvara
G=ERE
)aturas$IdCliente 6 9.H
A trans4ormao desta sentena a 4ormato ANSI seria a se!uinte'
SELEC(
)aturas$>1
Alvaras$>
)R*+
)aturas1 Alvaras
G=ERE
)aturas$IdAlvara 6 Alvaras$IdAlvara
AN5
)aturas$IdCliente 6 9.H
Como se "ode observar as mudanas realizadas 4oram as se!uintes'
,$(odas as tabelas ue intervFm na consulta se es"eci4icam na clusula )R*+$
.$As condies ue vinculam Ds tabelas se es"eci4icam na clusula G=ERE e se vinculam
mediante o o"erador lC!ico AN5$
Re4erente aos *U(ER -*IN1 no 4uncionam em *RACLE e ademais con/eo uma sinta%e ue
4unciona nos trFs sistemas$ A sinta%e em *RACLE & i!ual D sentena anterior1 "or&m adicionando
os caracteres 7?8 atrs do nome da tabela na ual dese0amos aceitar valores nulos1 isto euivale
a um LE)( -*IN'
SELEC(
)aturas$>1
Alvaras$>
)R*+
)aturas1 Alvaras
G=ERE
)aturas$IdAlvara 6 Alvaras$IdAlvara 7?8
AN5
)aturas$IdCliente 6 9.H
E isto a um RI<=( -*IN'
SELEC(
)aturas$>1
Alvaras$>
)R*+
)aturas1 Alvaras
G=ERE
)aturas$IdAlvara 7?8 6 Alvaras$IdAlvara
AN5
)aturas$IdCliente 6 9.H
Em SQL3SEREER se "ode utilizar uma sinta%e "arecida1 neste caso no se utiliza os caracteres
7?81 e sim os caracteres 6> "ara o LE)( -*IN e >6 "ara o RI<=( -*IN$
Consultas de Auto-combinao
A auto3combinao se utiliza "ara unir uma tabela consi!o mesma1 com"arando valores de duas
colunas com o mesmo ti"o de dados$ A sinta%e na se!uinte'
SELEC(
alias,$coluna1 alias.$coluna1 $$$
)R*+
tabla, as alias,1 tabela. as alias.
G=ERE
alias,$coluna 6 alias.$coluna
AN5
outras condicoes
2or e%em"lo1 "ara visualizar o nImero1 nome e "osto de cada em"re!ado1 0unto com o nImero1
nome e "osto do su"ervisor de cada um deles se utilizaria a se!uinte sentena'
SELEC(
t$numJem"1 t$nome1 t$"osto1 t$numJsu"1s$nome1 s$"osto
)R*+
em"re!ados AS t1 em"re!ados AS s
G=ERE
t$numJsu" 6 s$numJem"
Consultas de Combinaes no Comuns
A maioria das combinaes est baseada na i!ualdade de valores das colunas ue so o crit&rio
da combinao$ As no comuns se baseiam em outros o"eradores de combinao1 tais como
N*(1 AE(GEEN1 KL1 etc$
2or e%em"lo1 "ara listar o !rau salarial1 nome1 salrio e "osto de cada em"re!ado ordenando o
resultado "or !rau e salrio /averia ue e%ecutar a se!uinte sentena'
SELEC(
!raus$!rau1em"re!ados$nome1 em"re!ados$salario1 em"re!ados$"osto
)R*+
em"re!ados1 !raus
G=ERE
em"re!ados$salario AE(GEEN !rados$salarioin4erior And !rados$salariosu"erior
*R5ER AB
!rados$!rado1 em"re!ados$salario
2ara listar o salrio m&dio dentro de cada !rau salarial /averia ue lanar esta outra sentena'
SELEC(
!raus$!rau1 AE<7em"re!ados$salario8
)R*+
em"re!ados1 !raus
G=ERE
em"re!ados$salario AE(GEEN !raus$salarioin4erior And !raus$salariosu"erior
<R*U2 AB
!raus$!rau
CROSS JOIN (SQL-SERER!
Utiliza3se em SQL3SEREER "ara realizar consultas de unio$ Su"on/amos ue temos uma tabela
com todos os autores e outra com todos os livros$ Se dese0ssemos obter uma lista!em
combinando ambas tabelas de tal 4orma ue cada autor a"arecesse 0unto a cada tMtulo1
utilizarMamos a se!uinte sinta%e'
SELEC(
Autores$Nome1 Livros$(itulo
)R*+
Autores CR*SS -*IN Livros
SEL" JOIN
SEL) -*IN & uma t&cnica em"re!ada "ara conse!uir o "roduto cartesiano de uma tabela consi!o
mesma$ Sua utilizao no & muito 4reNente1 mas colocaremos al!um e%em"lo de sua
utilizao$
Su"on/amos a se!uinte tabela 7* cam"o autor & num&rico1 embora "ara ilustrar o e%em"lo
utilize o nome8'
Autores
=!digo 5=!digo do livro7 0utor 5&ome do 0utor7
@AA12 1. ,rancisco 8!pe$
@AA12 2. )avier 0lonso
@AA12 B. -arta (ebolledo
=AA1C 1. ,rancisco 8!pe$
=AA1C 2. )avier 0lonso
4A12A 2. )avier 0lonso
4A12A B. -arta (ebolledo
Queremos obter1 "ara cada livro1 "ares de autores'
SELEC(
A$Codi!o1 A$Autor1 A$Autor
)R*+
Autores A1 Autores A
G=ERE
A$Codi!o 6 A$Codi!o
* resultado & o se!uinte'
=!digo 0utor 0utor
@AA12 1. ,rancisco 8!pe$ 1. ,rancisco 8!pe$
@AA12 1. ,rancisco 8!pe$ 2. )avier 0lonso
@AA12 1. ,rancisco 8!pe$ B. -arta (ebolledo
@AA12 2. )avier 0lonso 2. )avier 0lonso
@AA12 2. )avier 0lonso 1. ,rancisco 8!pe$
@AA12 2. )avier 0lonso B. -arta (ebolledo
@AA12 B. -arta (ebolledo B. -arta (ebolledo
@AA12 B. -arta (ebolledo 2. )avier 0lonso
@AA12 B. -arta (ebolledo 1. ,rancisco 8!pe$
=AA1C 1. ,rancisco 8!pe$ 1. ,rancisco 8!pe$
=AA1C 1. ,rancisco 8!pe$ 2. )avier 0lonso
=AA1C 2. )avier 0lonso 2. )avier 0lonso
=AA1C 2. )avier 0lonso 1. ,rancisco 8!pe$
4A12A 2. )avier 0lonso 2. )avier 0lonso
4A12A 2. )avier 0lonso B. -arta (ebolledo
4A12A B. -arta (ebolledo B. -arta (ebolledo
4A12A B. -arta (ebolledo 2. )avier 0lonso
Como "odemos observar1 os "ares de autores se re"etem em cada um dos livros1 "odemos omitir
estas re"eties da se!uinte 4orma'
SELEC(
A$Codi!o1 A$Autor1 A$Autor
)R*+
Autores A1 Autores A
G=ERE
A$Codi!o 6 A$Codi!o AN5 A$Autor K A$Autor
* resultado a!ora & o se!uinte'
Cdigo Autor Autor
@AA12 1. ,rancisco 8!pe$ 2. )avier 0lonso
@AA12 1. ,rancisco 8!pe$ B. -arta (ebolledo
=AA1C 1. ,rancisco 8!pe$ 2. )avier 0lonso
4A12A 2. )avier 0lonso B. -arta (ebolledo
A!ora temos um con0unto de resultados em 4ormato Autor 3 CoAutor$
Se na tabela de em"re!ados uis&ssemos e%trair todos os "ossMveis "ares ue "odemos realizar1
utilizarMamos a se!uinte sentena'
SELEC(
=omens$Nome1 +ul/eres$Nome
)R*+
Em"re!ados =omem1 Em"re!ados +ul/eres
G=ERE
=omem$Se%o 6 @=omem@ AN5
+ul/eres$Se%o 6 @+ul/er@ AN5
=omens$Id KL+ul/eres$Id
2ara concluir su"on/amos a se!uinte tabela'
Empregados
%d &ome Seu=/eDe
1 -arcos E
2 8ucas 1
B 0na 2
C 'va 1
F )uan E
E 0ntonio
Queremos obter um con0unto de resultados com o nome do em"re!ado e o nome de seu c/e4e'
SELEC(
Em"re$Nome1 C/e4es$Nome
)R*+
Em"re!ados Em"re1 Em"re!ados C/e4e
G=ERE
Em"re$SeuC/e4e 6 C/e4es$Id