Professional Documents
Culture Documents
08/0,/2000
00300
5 8$; -i''i$#!
%-i''i$#!5(%.2c(
%
08/0,/2000
00300
6
Re#$"(
+eei$
+eei$5c$")u2c(
%26
08/0,/2000
00300
Tb_ator
inIdAto
r vcAtor mnSalario
,
R(%u'(
-e#de''
&500<00
2 8$; -i''i$#! 4500<00
&
/i'%$$
C$%4(!
2500<00
4 =u'i$#$ +$e! 8500<00
7)
Captulo ' - (nion e Sub)ue*+
5
/u>$#
/$$#d(#
2&500<00
77
Captulo ' - (nion e Sub)ue*+
Tb_Comprador
inIdCompra
dor vcComprador chSexo
, De#i!e Rei! F
2 8$"$ C(dei( F
& /i'%$$ /u''$# F
4 C$!!i( ?e6e!)i 8
5
/u>$#
/$$#d(# F
O cdigo a seguir cria as trs tabelas anteriores.
Create Table )-HCli,n),
(
inIdCli,n), int identity(*,*) Not Null
, v+Cli,n), varchar(*AB) Not Null
, v+E%ail varchar(*AB)
, d)Cadas)ro smalldatetime default getdate()
, Constraint P]H+li,n), Primary Key (inIdCli,n),)
)
/O
nsert into )-H+li,n),
values('Romulo Wendell', 'rWendell@hu.com.br','2000/08/01')
nsert into )-H+li,n),
values('Renata Ferreira', 'rFerreiral@sql.com.br','2000/08/01')
nsert into )-H+li,n),
values('Marcia Rita', 'rRita@mmc.com.br','2000/08/01')
nsert into )-H+li,n),
values('Erika Yuriko', 'eYuriko@two.com.br','2000/08/01')
nsert into )-H+li,n),
values('Max Willians', 'mWillians@omg.com','2000/08/01')
nsert into )-H+li,n),
values('Renato Pereira', 'rPereira@cathu.com.br','2000/08/01')
Create Table )-HA)or
(
inIdA)or int identity(*,*) Not Null
, v+A)or varchar(*AB) Not Null
, 7nSalario money
, Constraint P]HA)or Primary Key (inIdA)or)
)
/O
nsert into )-HA)or values('Romulo Wendell', 4ABB;BB)
nsert into )-HA)or values('Max Willians', LABB;BB)
nsert into )-HA)or values('Silmara Campos', 3ABB;BB)
nsert into )-HA)or values('Juliana Paes', ^ABB;BB)
nsert into )-HA)or values('Suzan Sarandon', 34ABB;BB)
7/
Captulo ' - (nion e Sub)ue*+
Create Table )-HCo7'rador
(
inIdCo7'rador int identity(*,*) Not Null
, v+Co7'rador varchar(*AB) Not Null
, +hS,Co char(*) Not Null
, Constraint P]HCo7'rador Primary Key (inIdCo7'rador)
)
/O
nsert into )-HCo7'rador values('Denise Reis', 'F')
nsert into )-HCo7'rador values('Marta Cordeiro', 'F')
nsert into )-HCo7'rador values('Silmara Sullan', 'F')
nsert into )-HCo7'rador values('Cassio Hebeshi', 'M')
nsert into )-HCo7'rador values('Suzan Sarandon', 'F')
Union
Selecione apenas o cdigo e nomes dos clientes e compradores
Select inIdCli,n),8 v+Cli,n),
From )-H+li,n),
Union
Select inIdA)or, v+A)or
From )-Ha)or
inIdCliente vcCliente
,
R(%u'(
-e#de''
2 8$; -i''i$#!
2 Re#$"$ Feei$
& 8$ci$ Ri"$
&
/i'%$$
C$%4(!
4 9i0$ :ui0(
4 =u'i$#$ +$e!
5 8$; -i''i$#!
5
/u>$#
/$$#d(#
6 Re#$"( +eei$
)epare que para este e*emplo no houve ocorr+ncia de dados duplicados(
Union All
Selecione apenas o cdigo e nomes dos clientes e compradores
Select inIdCli,n),8 v+Cli,n),
From )-H+li,n),
Union All
Select inIdA)or, v+A)or
From )-Ha)or
inIdCliente vcCliente
, R(%u'( -e#de''
2 Re#$"$ Feei$
& 8$ci$ Ri"$
4 9i0$ :ui0(
5 8$; -i''i$#!
6 Re#$"( +eei$
, R(%u'( -e#de''
2 8$; -i''i$#!
& /i'%$$ C$%4(!
4 =u'i$#$ +$e!
5 /u>$# /$$#d(#
79
Captulo ' - (nion e Sub)ue*+
)epare que para este e*emplo houve ocorr+ncia de dados duplicados(
As r,6ras -.si+as 'ara ,s), )i'o d, +onsul)a d,v,7 s,r:
O nome da coluna ou alias deve ser definido no primeiro SELECT.
A incluso da clausula WHERE pode ser realizada em qualquer comando
SELECT.
necessrio que todos os comandos SELECT utilizados apresentem o
mesmo numero de colunas.
necessrio que todas as colunas implementem o mesmo tipo de dado para
cada coluna.
Para que os dados sejam ordenados o ultimo SELECT dever aprestar a
instruo ORDER BY
Podemos tambm realizar a unio de mais de duas tabelas implementando a
clusula UNON ou UNON ALL mais uma vez aps o ultimo SELECT.
Veja o exemplo:
Select inIdCli,n),, v+Cli,n),
From )-H+li,n),
Union
Select inIdA)or, v+A)or
From )-Ha)or
Union
Select inIdCo7'rador, v+Co7'rador
From )-H+o7'rador
Order by inIdCli,n),, v+Cli,n),
inIdCliente vcCliente
, De#i!e Rei!
,
R(%u'(
-e#de''
2 8$"$ C(dei(
2 8$; -i''i$#!
2 Re#$"$ Feei$
& 8$ci$ Ri"$
&
/i'%$$
C$%4(!
& /i'%$$ /u''$#
4 C$!!i( ?e6e!)i
4 9i0$ :ui0(
4 =u'i$#$ +$e!
5 8$; -i''i$#!
5
/u>$#
/$$#d(#
6 Re#$"( +eei$
EC+,')
Selecione apenas nomes que apaream na primeira tabela de clientes, mas no
apaream na tabela de atores.
Select v+Cli,n), As $o7,s
From )-H+li,n),3
Except
Select v+A)or
From )-Ha)or
Nomes
9i0$ :ui0(
8$ci$ Ri"$
Re#$"$ Feei$
Re#$"( +eei$
/1
Captulo ' - (nion e Sub)ue*+
/1
Captulo ' - (nion e Sub)ue*+
Su-Pu,ry
Su-Pu,ry uma instruo SELECT que foi "embutida" em outra instruo
SELECT, UPDATE, DELETE ou dentro de outra subquery.
A finalidade da subquery retornar um conjunto de linhas para o SELECT
principal, tambm podemos ouvir o nome de consulta aninhada e o limite Maximo
para este tipo de consulta de 32 nveis, limite que pode variar de acordo com a
complexidade das outras instrues que compem a consulta e da quantidade de
memria disponvel no servidor.
Tipicamente utilizamos subqueries na filtragem de pesquisas (=clusula WHERE)
nas clusulas N(), NOT N(), EXSTS() e NOT EXSTS(), por oferecer diversas
formas de se obter os resultados, as subqueries eliminam a necessidade de
utilizarmos clusulas JON e UNON de maior complexidade.
Para explicar a utilizao das subqueries, consideremos as tabelas
Tb_Cargo
inCodCar
go vcCargo
4
A#$'i!"$ de
/i!"e%$!
5 A7ui"e"(
2 Die"(
, +e!ide#"e
& /u4evi!(
Tb_Funcionario
incodfunc
inCodCar
go vcNome
dcSalari
o
chDocument
o
, 5 8$i( A#"(#i( 8500200 2,225&2587
2 5 R(%eu F$#0'i# 8500200 ,22542457
& & T)(%$! 9di!(# 4500200 2582&28
4 & B$"('(%eu =u#i( 6500200 50265&2458
5 2
Ci!"(v@(
C('(%6( 7000200 0022582,47
6 , A%$d( B$"i!"$ &0000200 ,&25652,58
Tb_Dependente
inCodDep inCodFunc vcNomeDep
, , 8$ce''e Be'$"i
2 , T)$i! 9ve'$!"
& , RuA A%$#A
4 2 /$6i#$ de /B
5 2 V$#de'ei
/2
Captulo ' - (nion e Sub)ue*+
Lu;$%$#$u!
6 5 R(c0!iv$# de +$iv(
7 5 Re#$"( de C'ivei(
/$
Captulo ' - (nion e Sub)ue*+
Create Table )-H+ar6o
(
inCodCar6o int not null
, v+Car6o varchar(AB) not null
, Constraint ']H+ar6o primary key(inCodCar6o)
, Constraint uPH+ar6o unique(v+Car6o)
)
6o
insert )-H+ar6o values(*,'Presidente')
insert )-H+ar6o values(3,'Diretor')
insert )-H+ar6o values(4,'Supervisor')
insert )-H+ar6o values(L,'Analista de Sistemas')
insert )-H+ar6o values(A,'Arquiteto')
6o
Create Table )-H<un+ionario
(
in+od<un+ int not null
, inCodCar6o int not null
, v+$o7, varchar(AB) not null
, d+Salario decimal(*B,3) not null
, +ho+u7,n)o char(*A) not null
, Constraint PKH<un+ Primary Key(in+od<un+)
, Constraint GKH<un+ Foreign Key(inCodCar6o) References )-H+ar6o(inCodCar6o)
, Constraint CRH<un+ Check(d+Salario > B)
, Constraint UQH<un+ Unique(+ho+u7,n)o)
)
6o
insert )-H<un+ionario values(*,A,'Mario Antonio',^ABB;BB,'21.253.587')
insert )-H<un+ionario values(3,A,'Romeu Franklin',^ABB;BB,'01.254.457')
insert )-H<un+ionario values(4,4,'Thomas Edison', LABB;BB,'258.328')
insert )-H<un+ionario values(L,4,'Bartolomeu Junior',MABB;BB,'50.653.458')
insert )-H<un+ionario values(A,3,'Cristovo Colombo',VBBB;BB,'00.258.147')
insert )-H<un+ionario values(M,*,'Amado Batista', 4BBBB;BB,'13.565.158')
6o
Create Table )-Hd,',nd,n),
( inCod,' int not null
, inCodGun+ int not null
, v+$o7,,' varchar(AB) not null
8 Constraint PKHd,' Primary Key (inCod,')
8 Constraint GKHd,' Foreign Key(inCodGun+) References )-H<un+ionario(inCodGun+)
)
6o
insert )-Hd,',nd,n), values(*,*,'Marcelle Belati')
insert )-Hd,',nd,n), values(3,*,'Thais Everlast')
insert )-Hd,',nd,n), values(4,*,'Ruy Armany')
insert )-Hd,',nd,n), values(L,3,'Sabrina de S')
insert )-Hd,',nd,n), values(A,3,'Vanderlei Luxamanaus')
insert )-Hd,',nd,n), values(M,A,'Rocksivan de Paivo')
insert )-Hd,',nd,n), values(V,A,'Renato de Oliveiro')
6o
/%
Captulo ' - (nion e Sub)ue*+
Su-Pu,ry in)roduzida +o7 I$_$OT
Observando as tabelas cargo e funcionrio, queremos descobrir quais os cargos
que esto atualmente ocupados na nossa empresa.
Para este tipo de consulta, devemos selecionar os cargos que esto na tabela de
funcionrios, para isso podemos utilizar uma subquery com o operador N:
Select * From )-H+ar6o
Where in+odCar6o N (Select in+od+ar6o From )-H<un+ionario)
inCodCargo vcCargo
, +e!ide#"e
2 Die"(
& /u4evi!(
5 A7ui"e"(
E para descobrirmos os cargos que no possuem funcionrios podemos realizar
a mesma consulta, mas alterando a clusula N para NOT N, assim podemos
saber quais os cargos que no existem na tabela de funcionrios.
Select * From )-H+ar6o
Where in+odCar6o NOT N (Select in+od+ar6o From )-H<un+ionario)
inCodCargo vcCargo
4
A#$'i!"$ de
/i!"e%$!
Podemos tambm consultar os cargos onde os funcionrios no possuem
nenhum dependente.
Select * From )-H+ar6o
Where in+odCar6o N (Select in+od+ar6o From )-H<un+ionario
Where inCodGun+ NOT N (Select inCodGun+
From )-Hd,',nd,n),))
inCodCargo vcCargo
, +e!ide#"e
& /u4evi!(
/&
Captulo ' - (nion e Sub)ue*+
Su-Pu,ry in)roduzida +o7 o sinal d, i6ual =U>
Vamos observar a tabela de funcionrio:
incodfunc
inCodCar
go vcNome
dcSalari
o
chDocument
o
, 5 8$i( A#"(#i( 8500200 2,225&2587
2 5 R(%eu F$#0'i# 8500200 ,22542457
& & T)(%$! 9di!(# 4500200 2582&28
4 & B$"('(%eu =u#i( 6500200 50265&2458
5 2
Ci!"(v@(
C('(%6( 7000200 0022582,47
6 , A%$d( B$"i!"$ &0000200 ,&25652,58
possvel notar que o funcionrio de cdigo 3 possui o menor salrio, e o
funcionrio de cdigo 6 possui o maior salrio. Podemos obter estes dados com
a ajuda de duas funes de totalizao, que indicam qual o menor valor e qual o
maior valor em um campo, os nomes destas funes so %in=> e %aC=>.
%in=>: Est funo retorna o menor valor de um conjunto.
%aC=>: Est funo retorna o maior valor de um conjunto.
Utilizando estas funes, podemos descobrir de forma rpida qual o funcionrio
da nossa empresa que possui o maior salrio, e qual o funcionrio da nossa
empresa que possui o menor salrio.
O 7aior sal.rio:
Select * From )-H<un+ionario
Where d+Salario N (Select max(d+Salario) From )-H<un+ionario)
incodfunc
inCodCar
go vcNome
dcSalari
o
chDocumen
to
6 ,
A%$d(
B$"i!"$
&000020
0 ,&25652,58
O 7,nor sal.rio:
Select * From )-H<un+ionario
Where d+Salario N (Select min(d+Salario) From )-H<un+ionario)
incodfunc
inCodCar
go vcNome
dcSala
rio
chDocumen
to
& &
T)(%$!
9di!(#
450020
0 2582&28
/)
Captulo ' - (nion e Sub)ue*+
U'da), +o7 Su-Pu,ri,s
As subqueries tambm podem ser teis para a atualizao de registros. Vamos
supor que precisamos reajustar em 10% o valor do salrio de todos os
funcionrios que no possuem dependentes. sso obtido atravs do seguinte
cdigo:
Update )-H<un+ionario
set d+Salario = d+Salario* *;*
Where inCod<un+ NOT N (Select InCodGun+ From )-Hd,',nd,n),)
,l,), +o7 Su-Pu,ri,s
Tambm podemos utilizar subqueries para remover dados das tabelas. Vamos
supor que precisamos remover todos os funcionrios que no possuem
dependentes. Para isso utilizaremos o seguinte conjunto de instrues:
Delete From )-H<un+ionario
Where inCod<un+ NOT N (Select InCodGun+ From )-Hd,',nd,n),)
/7
Captulo , - &otali-an%o Da%os
Ca'()ulo \ - To)alizando ados
Neste capitulo aprenderemos tcnicas para gerar dados de resumo com
funes agregadas e GROUP BY.
A +l.usula /ROUP B@
A clusula GROUP BY agrupa diversos registros baseado em uma ou mais
colunas de uma ou mais tabelas. Uma linha retornada para cada grupo de
valores retornados em uma consulta.
A clusula Group By freqentemente utilizada em conjunto com as
seguintes funes:
COU$T=>: Funo para contar os registros.
SU%=>: Funo que realiza a soma dos registros.
%A?=>: Funo que retorna o maior valor de um grupo de valores.
%I$=>: Funo que retorna o menor valor de um grupo de valores.
AV/=>: Funo que realiza o clculo da mdia dos valores.
Observemos, a seguir, a sintaxe apresentada pela documentao do books
online:
N /ROUP B@ N ALL O 6rou'H-yH,C'r,ssion N 8;;;n O
N QITR ` CUBE a ROLLUP b O
ALL: Esse recurso ser removido em uma verso futura de Microsoft
SQL Server. Evite usar esse recurso em desenvolvimentos novos e
planeje modificar os aplicativos que atualmente o utilizam. nclui todos
os grupos e conjuntos de resultados, mesmo aqueles que no tm
linhas que atendem s critrio de pesquisa especificadas na clusula
WHERE. Quando ALL especificado, valores nulos so retornados
para as colunas de resumo de grupos que no satisfazem aos critrios
de pesquisa. No possvel especificar ALL com os operadores CUBE
ou ROLLUP.
GROUP BY ALL no tem suporte em consultas que acessam tabelas
remotas se houver tambm uma clusula WHERE na consulta.
6rou'H-yH,C'r,ssion: uma expresso na qual o agrupamento
executado group,b-,e*pression tambm conhecido como coluna de
agrupamento. group,b-,e*pression pode ser uma coluna ou uma
expresso de no agregao que referencia uma coluna retornada
pela clusula FROM. Um alias de coluna que est definido na lista
SELECT no pode ser usado para especificar uma coluna de
agrupamento.
//
Captulo , - &otali-an%o Da%os