You are on page 1of 108

SQL SERVER

Rudson Kiyoshi Souza Carvalho


rudson.carvalho@gmail.com
PUBLICO ALVO
Estudantes da rea de T que desejam aprender a manipular informaes em banco
de dados SQL Server.
PR-REQUISITOS
Conhecimento em Lgica de Programao e noes bsicas de banco de dados.
URA!"O
Durao total de 40 horas divididas em 4,5 horas em 9 sbados.
Expectativa de incio em ......... e trmino em .........
OB#ETIVO
nserir participantes do treinamento no aprendizado da linguagem SQL SERVER,
atravs da apresentao dos assuntos fundamentais para compreender os conceitos
bsicos acerca do SQL, alm da prtica de exerccios simples para reforar a teoria
e conhecer os principais comandos e ferramentas da linguagem.
I$TROU!"O
Este o primeiro mdulo de uma srie de trs, neste mdulo iremos aprender os
conceitos bsicos de banco de dados relacional, sua utilizao e boa parte dos
recursos que o SQL Server nos disponibiliza para manipular as informaes
armazenadas na base de dados.
SU%&RIO
PUBLICO ALVO .............................................................................. 2
PR-REQUISITOS .......................................................................... 2
DURAO ....................................................................................... 2
OBJETIVO ....................................................................................... 2
INTRODUO ................................................................................. 2
Captulo - Co!"#$to% &'%$"o% ........................................................ (
Banco de dados ....................................................................................................................... 7
Modelos de Banco de Dados ................................................................................................... 7
Banco de dados relacional ...................................................................................................... 9
Origem da linguagem SQL .................................................................................................... 9
1.1.A linguagem Transact-SQL ............................................................................................ 11
SQL Server Management Studio .......................................................................................... 12
Captulo 2 - Al)u!% o&*#to% +o SQL S#,-#, .................................. .
rinci!ais o"#etos do SQL Server ......................................................................................... 1$
Data"ases 1%
Ta"elas 1&
'riando a !rimeira Ta"ela .................................................................................................... 1&
O comando (nsert .................................................................................................................. 1)
A instru*+o Select ................................................................................................................. 17
D,O TABL- T".'liente ................................................................................................... 17
A segunda Ta"ela .................................................................................................................. 1/
A terceira Ta"ela ................................................................................................................... 19
Captulo . - D/L S$0pl#% .............................................................. 21
(0S-,T 21
(0S-,T !osicional ............................................................................................................... 21
(0S-,T declarativo .............................................................................................................. 22
S-L-'T 2$
-2i"indo todas as colunas ..................................................................................................... 2$
-2i"indo algumas colunas .................................................................................................... 2$
-2i"indo colunas utili3ando alias ......................................................................................... 2$
-2i"indo colunas utili3ando alias com es!a*o no nome ....................................................... 2%
'riando uma coluna virtual com o comando S-L-'T ........................................................ 2&
-2i"indo uma o!era*+o com comando S-L-'T ................................................................. 2)
-2i"indo a!enas uma ve3 os dados re!etidos 4 D(ST(0'T ................................................. 27
'o!iando dados de uma ta"ela !ara outra ta"ela utili3ando os comandos (0S-,T com
S-L-'T ............................................................................................................... 2/
(0S-,T com S-L-'T 5uando as ta"elas s+o iguais ........................................................... 2/
(0S-,T com S-L-'T 5uando as ta"elas s+o di6erentes ..................................................... 29
29
$.$. 7DAT- ........................................................................................................................ $1
Alterando dados de uma coluna ............................................................................................ $1
Alterando dados de varias colunas ........................................................................................ $1
D-L-T- $1
Captulo 2 - A "l'u%ula 34ERE ..................................................... .2
A cl8usula 9:-,- com os o!eradores l;gicos A0D e O, ................................................ $%
A cl8usula 9:-,- com o o!erador (0 ............................................................................... $&
A cl8usula 9:-,- com os o!eradores 0OT (0 ................................................................. $)
%.1.A cl8usula 9:-,- com o o!erador B-T9--0 ......................................................... $7
A cl8usula 9:-,- com os o!eradores 0OT B-T9--0 .................................................. $7
O O!erador L(<- ................................................................................................................. $/
A cl8usula 9:-,- com os o!eradores 0OT L(<- ............................................................ %1
Captulo 5 - A Cl'u%ula ORDER B6 ................................................ 2
O,D-, B= .......................................................................................................................... %1
Ordenando !or colunas ......................................................................................................... %1
Ordenando !or uma coluna ................................................................................................... %1
Ordenando !or varias colunas ............................................................................................... %1
&.1.O,D-, B= AS' e D-S' .............................................................................................. %1
A cl8usula TO ..................................................................................................................... %$
A cl8usula TO com Order B> ............................................................................................. %%
A cl8usula TO 9(T: T(-S com O,D-, B= ................................................................... %%
Captulo 7 - I!t#),$+a+# # Co!%$%t8!"$a +o% Da+o% ....................... 27
,egras de (ntegridade e consist?ncia .................................................................................... %)
'onstraints ............................................................................................................................ %/
'@aves !rim8rias ................................................................................................................... %/
IDENTIT6 ..................................................................................... 29
%9
'@aves !rim8riasA secund8rias ou c@aves Bnicas .................................................................. &1
'@aves estrangeiras ............................................................................................................... &1
,egras de valida*+o .............................................................................................................. &2
Calor adr+o ......................................................................................................................... &2
Calores nulos e n+o nulos ..................................................................................................... &2
Data t>!es .............................................................................................................................. &$
,egras de 'onstraints ........................................................................................................... &%
Co!%t,a$!t DE:AULT ..................................................................... 52
Co!%t,a$!t UNIQUE ....................................................................... 52
Co!%t,a$!t C4EC; ......................................................................... 52
Co!%t,a$!t PRI/AR6 ;E6 .............................................................. 52
Co!%t,a$!t :OREI<N ;E6 .............................................................. 52
Modelo entidade e relacionamento DM-,E ........................................................................... &&
,elacionamento ..................................................................................................................... &)
,elacionamento 1F1 .............................................................................................................. &)
,elacionamento 1F0 .............................................................................................................. &)
,egras de relacionamento 1F0 .............................................................................................. &7
,elacionamento 0F0 ............................................................................................................. &7
,egras de relacionamento 0F0 ............................................................................................. &/
Captulo ( - A%%o"$a!+o Ta&#la% ................................................... 7
GO(0 )1
(00-, GO(0 ......................................................................................................................... )$
L-HT GO(0 ........................................................................................................................... ))
,(I:T GO(0 ......................................................................................................................... )7
H7LL GO(0 ........................................................................................................................... )/
',OSS GO(0 ........................................................................................................................ )9
7.1.Os comandos 7DAT- e D-L-T- ............................................................................... 71
7DAT- 7$
D-L-T- 7&
Captulo = - U!$o! # Su&>u#,? ...................................................... (7
70(O0A 70(O0 ALL e -J'-T ....................................................................................... 7)
Su"5uer> /2
Su"5uer> introdu3ida com (0K0OT ...................................................................................... /&
Su"5uer> introdu3ida com o sinal de igual DLE ..................................................................... /)
7!date com Su"5ueries ........................................................................................................ /7
Delete com Su"5ueries ......................................................................................................... /7
Captulo 9 - Total$@a!+o Da+o% ..................................................... ==
A cl8usula I,O7 B= ........................................................................................................ //
A cl8usula :AC(0I com I,O7 B= ................................................................................ 9%
A cl8usula 9(T: ,OLL7 com I,O7 B= ..................................................................... 9)
A cl8usula '7B- com I,O7 B= ..................................................................................... 97
A cl8usula GO(0 com I,O7 B= ....................................................................................... 99
Captulo 1 - Co0put# B6 ........................................................... 1
11.1.'OM7T- B= com GO(0 ......................................................................................... 112
,esumindo dados usando 'OM7T- e 'OM7T- B= .................................................. 11%
As di6eren*as entre 'OM7T- e I,O7 B= ................................................................. 11&
Captulo A Ta&#la% ................................................................. 17
Ta"ela !ermanente ............................................................................................................. 11)
Ta"ela tem!or8ria Ilo"al ................................................................................................... 11)
Captulo 2 A Ca%# ...................................................................... 1(
A cl8usula 'AS- ................................................................................................................ 117
BIBLIO<RA:ICA BBSICA ............................................................ 19
Captulo 1 - Conceitos bsicos
Ca'()ulo * - Con+,i)os -.si+os
Ban+o d, dados
Um banco de dados um conjunto de dados estruturados, normalmente
organizados em tabelas e armazenados de forma persistente, ou seja, no se perde
a informao ao desligar o computador.
Num banco de dados pode-se adicionar, atualizar e consultar informaes, mas para
que tudo isso ocorra de maneira organizada necessrio um software que gerencie
todo este processo e garanta a integridade dos dados. Este software e denominado
SGBD - Sistema Gerenciador de Banco de Dados.
Atualmente existem diversos SGBDs no mercado, como por exemplo, DB2, Sybase,
Oracle, SQL Server, MySql, Firebird, PostGreSQL. A grande maioria destes SGBDs
possuem uma verso free que podem ser baixados do site de seus fabricantes.
A funo do SGBD estabelecer a interface entre o usurio e o banco de dados.
sso quer dizer que usurio no tem acesso direto aos dados armazenados, mas
pode fazer uma solicitao ao SGBD que ser responsvel por acessar o banco de
dados e disponibilizar o resultado.
Fica evidente ento que existe uma diferena entre banco de dados e SGBD, apesar
de ser comum o banco de dados ser chamado pelo mesmo nome do seu
gerenciador. Exemplificando, SQL Server o nome do SGBD e no do banco de
dados, como comum se pensar.
%od,los d, Ban+o d, ados
Quando se fala de modelo de banco de dados preciso entender que isso se refere
ao modelo conceitual de banco de dados. Um modelo conceitual a representao
de estrutura do banco de dados. Pode comparar com a planta de uma casa ou um
mapa de estradas, pois estes apenas representam objetos do mundo real.
No caso de banco de dados, o modelo uma representao da maneira com dados
sero armazenados.

Existem diversos tipos de modelos de banco de dados, entretanto a maior parte dos
SGBDs do mercado atual segue o modelo relacional. Tomando este modelo como
base ns podemos identificar trs geraes de modelos:
7
Captulo 1 - Conceitos bsicos
*- /,ra01o Pr2-R,la+ional
Sistemas Baseados em Arquivos dados armazenados em arquivos autnomos e
sem nenhum relacionamento entre eles. Este modelo no existe SGBD e o usurio
manipula os dados diretamente.
Modelo Hierrquico os dados so igualmente armazenados em arquivos,
porm existe uma relao de hierarquia de pai-filho entre eles. O modelo tem
o formato de uma rvore que contem ns pai e filhos. Este um dos primeiros
modelos com SGBD.
Modelo em Rede a extenso do modelo hierrquico, pois mantm o
relacionamento eliminando o conceito de hierarquia para possibilitar que um
registro possua vrias associaes e eliminar problemas de redundncia e
duplicao de dados.
3- /,ra01o R,la+ional
Modelo Relacional no segue a evoluo dos modelos anteriores, pois foi
criado baseado na teoria dos conjuntos, ramo da matemtica que
simultaneamente simples e poderoso. A estrutura de dados utilizada a
relao, ou seja, tabela. Uma tabela constituda de colunas(atributo ou
campo) e linhas(registro, instncia ou tupla).
4- /,ra01o P5s-R,la+ional
Modelo Orientado a Objetos segue a mesma estrutura da orientao a
objetos em linguagens de programao. O objetivo aproximar o
desenvolvimento das aplicaes ao banco de dados. Permite a
implementao de herana, encapsulamento e polimorfismo.
Modelo Objeto-Relacional tem uma estrutura hbrida, pois consiste de um
SGBD relacional que tambm utiliza orientao a objetos. O objetivo unir o
melhor do modelo relacional com o modelo orientado a objetos, um exemplo
de banco de dados orientado a objetos o Jasmine da CA e tambm o
Prevayler.
/
Captulo 1 - Conceitos bsicos
Ban+o d, dados r,la+ional
A maioria dos bancos de dados baseia-se no modelo relacional de Edgar Frank
Codd no inicio dos anos 70. Embora esta teoria seja a base para o software de
banco de dados relacionais, muito poucos sistemas de gesto de bases de dados
seguem o modelo de forma restrita.
A disposio das informaes em tabelas uma das principais caracteristicas do
banco de dados relacional.
Uma tabela de banco de dados relacional possui os seguintes elementos:
A)ri-u)os (campos): Respresentam as colunas
R,6is)ros (dados): Representam as linhas (tuplas)
Em um banco de dados relacional, podemos utilizar diversas tabelas para manter as
informaes. Essas tabelas que representam entidades podem ter suas informaes
combinadas por meio de relacionamentos. Na verdade, as tabelas possuem chaves
primrias e secundrias ou estrangeiras, por meio das quais os relacionamentos so
estabelecidos.
Um dos pontos fortes do modelo relacional de banco de dados a possibilidade de
definio de um conjunto de restries de integridade. Estas definem os conjuntos
de estados e mudanas de estado consistentes do banco de dados, determinando
os valores que podem e os que no podem ser armazenados.
Ori6,7 da lin6ua6,7 SQL
S)ru+)ur,d Qu,ry Lan6ua6,8 ou Linguagem de Consulta Estruturada ou SQL,
uma linguagem de pesquisa declarativa para banco de dados relacional (base de
dados relacional). Muitas das caractersticas originais do SQL foram inspiradas na
lgebra relacional.
A linguagem SQL foi desenvolvida originalmente no incio dos anos 70 nos
laboratrios da BM em San Jose, dentro do projeto System R, que tinha por objetivo
demonstrar a viabilidade da implementao do modelo relacional proposto por E. F.
Codd. O nome original da linguagem era SEQUEL, acrnimo para "Structured
English Query Language" (Linguagem de Consulta Estruturada em ngls) [1], vindo
da o fato de, at hoje, a sigla, em ingls, ser comumente pronunciada "squel" ao
invs de "s-ki-l", letra a letra. No entanto, em portugus, a pronncia mais
corrente a letra a letra: "se-qu-le".
9
Captulo 1 - Conceitos bsicos
A linguagem SQL um grande padro de banco de dados. sto decorre da sua
simplicidade e facilidade de uso. Ela se diferencia de outras linguagens de consulta
a banco de dados no sentido em que uma consulta SQL especifica a forma do
resultado e no o caminho para chegar a ele. Ela uma linguagem declarativa em
oposio a outras linguagens procedurais. sto reduz o ciclo de aprendizado
daqueles que se iniciam na linguagem.
Embora o SQL tenha sido originalmente criado pela BM, rapidamente surgiram
vrios "dialetos" desenvolvidos por outros produtores. Essa expanso levou
necessidade de ser criado e adaptado um padro para a linguagem. Esta tarefa foi
realizada pela American National Standards nstitute (ANS) em 1986 e SO em
1987.
O SQL foi revisto em 1992 e a esta verso foi dado o nome de SQL-92. Foi revisto
novamente em 1999 e 2003 para se tornar SQL:1999 (SQL3) e SQL:2003,
respectivamente. O SQL:1999 usa expresses regulares de emparelhamento,
queries recursivas e gatilhos (triggers). Tambm foi feita uma adio controversa de
tipos no-escalados e algumas caractersticas de orientao a objeto. O SQL:2003
introduz caractersticas relacionadas ao XML, seqncias padronizadas e colunas
com valores de auto-generalizao (inclusive colunas-identidade).
Tal como dito anteriormente, o SQL, embora padronizado pela ANS e SO, possui
muitas variaes e extenses produzidos pelos diferentes fabricantes de sistemas
gerenciadores de bases de dados. Tipicamente a linguagem pode ser migrada de
plataforma para plataforma sem mudanas estruturais principais.
Os 'adr9,s da SQL:
Ano Nome Conhecido como Mudanas
1986 SQL-86
SQL-87
(Adotado pela SO)
Primeira publicao do padro ANS/SO
1989 SQL-89 Apenas uma pequena verso do padro original
1992 SQL-92 SQL2
Maior atualizao do padro original e ainda
suportando os padres originais
1999 SQL99 SQL3
Atualizao do padro acrescentado em 1992 e novas
formas de selecionar os dados, e aplicada novas
regras de integridade dos dados e a introduo da
orientao a objetos.
2003 SQL-2003
ntroduzido suporte a XML e campos de valores auto
gerveis.
11
Captulo 1 - Conceitos bsicos
*;*; A lin6ua6,7 Transa+)-SQL
A linguagem Transact-SQL subdividida em trs grupos de comandos:
a)a ,<ini)ion Lan6ua6, =L>
CREATE TABLE - Criar uma nova tabela no banco de dados
ALTER TABLE alterar uma tabela do banco de dados
ROP TABLE excluir uma tabela do banco de dados
CREATE I$E? criar index na tabela do banco de dados
ROP I$E? excluir index da tabela
a)a %ani'ula)ion Lan6ua6, =%L>
SELECT extrair dados do banco de dados
UPATE alterar dados do banco de dados
ELETE apagar dados do banco de dados
I$SERT I$TO inserir novos dados no banco de dados
a)a Con)rol Lan6ua6, =CL>
/RA$T permitir privilgios aos usurios do banco de dados
REVOKE revogar privilgios aos usurios do banco de dados
E$@ negar permisso de acesso aos usurios do banco de dados
Estes comandos so relativamente simples o que pode levar algumas pessoas a
acharem que extremamente simples manipular informaes em uma base de
dados, e que qualquer um pode ser um DBA, mas a histria no bem essa, estes
comandos possuem clausulas que podem tornar um comando SQL muito complexo,
maior ainda se realizado em ambientes onde aplicaes acessam e alteram
informaes o tempo todo, a linguagem SQL muito poderosa, mas s com ela no
se pode construir uma aplicao completa, pois a SQL no possui instrues para
construo de programas, por este motivo a Microsoft criou a linguagem Transa+)-
SQL, para que funcione os comandos SQL em conjunto com uma linguagem
procedural.
11
Captulo 1 - Conceitos bsicos
SQL S,rv,r %ana6,7,n) S)udio
O SQL S,rv,r %ana6,7,n) S)udio um ambiente de desenvolvimento integrado
para acessar, configurar, gerenciar e desenvolver todos os componentes do SQL
Server. O SQL S,rv,r %ana6,7,n) S)udio combina um amplo grupo de
ferramentas grficas com editores de scripts sofisticados para fornecer acesso ao
SQL Server para desenvolvedores e administradores de todos os nveis de
conhecimento.
O SQL S,rv,r %ana6,7,n) S)udio combina os recursos do En),r'ris, %ana6,r,
Qu,ry Analyz,r e Analysis %ana6,r, includos em verses anteriores do SQL
Server, em um nico ambiente. Alm disso, o SQL S,rv,r %ana6,7,n) S)udio
trabalha com todos os componentes do SQL S,rv,r, como R,'or)in6 S,rvi+,s,
In),6ra)ion S,rvi+,s , SQL S,rv,r Co7'a+) 4;A SP*.
O SQL Management Studio compatvel com qualquer verso do SQL Server.
A7-i,n), SQL S,rv,r 3BBA EC'r,ss
12
Captulo 3 DML Simples
Ca'()ulo 3 - Al6uns o-D,)os do SQL S,rv,r
Prin+i'ais o-D,)os do SQL S,rv,r
Um banco de dados composto de objetos, ndices, tipos de dados e restries:
Cada objeto tem uma linha correspondente na tabela sysobjects. Seu tamanho
mnimo 1Mb.
a)a-as, uma estrutura que contm todos os outros objetos. Por
padro formado por dois arquivos: um de dados (com extenso .MDF) e
um de log (com extenso LDF).
Ta-l, E Todos os dados do sistema so inclusos em tabelas, formado por
linhas e colunas e estas tabelas ficam armazenadas no Database.
Cons)rain)8 ,<aul) , Rul, E Estes objetos, consistem em regras utilizadas
para manter a consistncia e a integridade dos dados no Database.
a)a Ty', , Us,r ,<in,d a)a Ty', E Os dados so armazenados no
disco sob um formato representado pelo datatype. Um datatype dever ser
atribudo a cada coluna de uma tabela.
Vi,F E Representa uma seleo de dados em uma ou mais tabelas.
Ind,C E So responsveis pela otimizao de acesso aos dados de uma
tabela utilizando a estrutura de busca B-Tree.
Pro+,dur, E Bloco de comandos Transact-SQL, responsvel por uma
determinada tarefa. Sua lgica pode ser compartilhada por varias
aplicaes.
Tri66,r E Bloco de comandos Transact-SQL. O objeto trigger criado
sobre uma tabela e ativado no momento da execuo de instrues como
update, insert e delete.
Gun+)ion E Bloco de comandos Transact-SQL, responsvel por uma
determinada tarefa. Sua lgica pode ser compartilhada por vrias
aplicaes. Vale lembrar que uma funo sempre retornara um tipo de
valor.
O-s; Os objetos procedure, trigger e function so processados mais rapidamente,
pois seu cdigo fica compilado na memria do servidor.
1$
Captulo 3 DML Simples
a)a-as,s
Os objetos que fazem parte de um sistema de banco de dados so criados dentro de
um database, uma estrutura lgica composta por dois tipos de arquivos, um
responsvel por manter a estrutura de tabelas com seus dados e outro responsvel
pelo armazenamento de Transactionlog, ou seja, armazenado todas as transaes
efetuadas.
Para criarmos um banco de dados no SQL Server 2005, utilizamos instruo:
CREATE ATABASE
Por exemplo, para criarmos uma base de dados com o nome de DB_ESTUDO,
utilizamos a seguinte instruo: CREATE ATABASE BHESTUO.
CREATE ATABASE BHESTUO
Quando um banco de dados criado o mesmo encontra-se vazio, at que uma
tabela seja inserida, no entanto para criarmos uma tabela no banco de dados
precisamos ter acesso a ele, para utilizarmos um banco de dados utilizamos a
clausula use, ento executaremos a seguinte instruo:
USE I$O%E O BA$CO E AOSJ
Seguindo o nosso exemplo a instruo ficaria assim: "USE DB_ESTUDO.
1%
Captulo 3 DML Simples
Dessa forma, quando for necessrio executar alguma instruo em uma
determinada base de dados podemos alternar entre as bases utilizando o comando
"use.
Caso seja necessrio eliminar uma base de dados, devemos utilizar a instruo
dro' da)a-as,.
ROP ATABASE I$O%E A BASE E AOSJ
Conforme o exemplo: "DROP DATABASE DB_ESTUDO
Ta-,las
Uma tabela um objeto de banco de dados formada por um conjunto de linhas e
colunas, cada uma dessas colunas refere-se a um atributo associado a tabela que
tambm chamamos de entidade, os datatypes, ou seja o formato do dado gravado
devera ser especificado para cada coluna
Para criarmos uma tabela utilizamos a instruo:
CREATE TABLE
Criando a 'ri7,ira Ta-,la
Neste exemplo temos uma tabela chamada Tb_Cliente.
inCodHCli v+$o7,HCli
1 Marina Farina
2 Edson Mendes
3 Aline Moda
4 Tatiana Souza
5 Cssio Adriano
remos cri-la em nossa base de dados DB_Estudo para isso caso voc tenha
excludo a base de dados ser necessrio recri-la e utilizar a instruo "use para
acessarmos a base de dados onde iremos criar nossa primeira tabela.
1&
Captulo 3 DML Simples
Na base de dados db_estudo executaremos a seguinte instruo:
CREATE TABLE T-HCli,n),
(
inCodHCli int
,v+$o7,HCli varchar(4B)
)
CREATE TABLE T-HCli,n),
O +o7ando Ins,r)
Para acrescentarmos linhas em uma tabela, necessrio utilizarmos o comando
NSERT.
insert into tb_cliente values (1,'Marina Farina')
insert into tb_cliente values (2,'Edson Mendes')
insert into tb_cliente values (3,'Aline Moda')
insert into tb_cliente values (4,'Tatiane Souza')
insert into tb_cliente values (5,'Cssio Adriano')
importante lembrar que os apstrofos (') devem ser utilizados em strings e
caracteres, com exceo de dados numricos; Os valores de cada coluna por sua
vez, devem ser separados por vrgulas.
O-s; No SQL 7 e Access obrigatrio usar a clausula "into, a partir do SQL 2000 e
superior est clausula no mais obrigatria.
1)
Captulo 3 DML Simples
A ins)ru01o S,l,+)
Os dados em uma tabela podem ser lidos atravs da instruo SELECT.
Por exemplo, para lermos os dados da tabela Tb_Clientes que criamos utilizamos a
instruo:
SELECT * FROM T-HCli,n),s
SELECT K GRO% T-HCli,n),s
O asterisco (*) significa que queremos trazer todas as colunas da tabela Cliente.
Caso seja necessrio removermos uma tabela do banco de dados, devemos
executar a seguinte instruo:
ROP TABLE Tb_Cliente
17
Captulo 3 DML Simples
A s,6unda Ta-,la
Agora, devemos criar a tabela cliente com diferentes dados, com e-mail e endereo,
de modo que ela seja exibida da seguinte maneira:
in+odHCli v+$o7,HCli v+EndHCli +hGon,HCli v+E7ailHCli
1 Marina Farina R Campos, 299 3211-1563 mari@blue.com
2 Edson Mendes Av. Paulista, 277 5125-2000 emendes@tree.com
3 Aline Moda Al. Santos, 512 4116-1518 amoda@estilo.com
4 Tatiana Souza Av. Rebouas, 15 9985-0965 tsouza@comp.com
5 Cssio Adriano Av. 9 de julho, 60 5465-1358 cadriano@tetra.com
Criaremos est tabela no banco de dados DB_Estudo
use BHEs)udo
create table tb_cliente
(
inCod_cli int
,vcNome_cli varchar(30)
,vcEnd_cli varchar(30)
,chFone_cli char(11)
,vcEmail_cli varChar(30)
)
Assim que a tabela cliente criada devemos inserir os dados apresentados
anteriormente, para isso ser necessrio executar as seguintes instrues:
insert tb_cliente
values(1,'Marina Farina','R Campos, 299','3211-1563','mari@blue.com')
insert tb_cliente
values(2,'Edson Mendes','Av. Paulista, 277','5125-2000','emendes@tree.com')
insert tb_cliente
values(3,'Aline Moda','Al. Santos, 512','4116-1518','amoda@estilo.com')
insert tb_cliente
values(4,'Tatiana Souza','Av. Rebouas, 15','9985-0965','tsouza@comp.com')
insert tb_cliente
values(5,'Cssio Adriano','Av. 9 de julho, 60','5465-1358','cadriano@tetra.com')
Feito isso ser necessrio executar o comando SELECT para visualizarmos os
dados inseridos na tabela.
Select * from )-H+li,n),
Finalmente podemos finalizar este script e partir para o prximo, mas antes
eliminaremos est tabela atravs da instruo:
DROP TABLE )-H+li,n),
1/
Captulo 3 DML Simples
A ),r+,ira Ta-,la
Neste prximo exemplo iremos inserir dados referentes ao salrio e a data que o
funcionrio foi registrado, para isso, utilize o datatype decimal e o datatype datetime.
O tipo decimal necessita de dois parmetros separados por vrgula para identificar a
parte inteira e qual ser a parte decimal como (10,2),
Durante a incluso dos dados decimais, o ponto (.) dever ser utilizado como
separador de casas decimais.
O tipo datetime baseado no padro norte-americano, ou seja, os valores devem
atender ao modelo mm/dd/aaaa. O sinal de apostrofo (') tambm deve ser utilizado
para indicar o comeo e o final de cada data. A barra obliqua necessria para a
separao dos valores referentes ao ms, dia e ano.
inCod_Cli vcNome_Cli vcEnd_Cli chFone_Cli vcEmail_Cli dcSal_Cli dtData_Cli
1
Marina
Farina
R Campos,
299
3211-1563 mari@blue.com 1800.00 04/15/2008
2
Edson
Mendes
Av. Paulista,
277
5125-2000 emendes@tree.com 1210.10 03/20/2007
3 Aline Moda
Al. Santos,
512
4116-1518 amoda@estilo.com 2000.00 08/28/2006
4
Tatiana
Souza
Av.
Rebouas,
15
9985-0965 tsouza@comp.com 1500.30 05/01/2004
5
Cssio
Adriano
Av. 9 de julho 5465-1358 cadriano@tetra.com 1945.88 24/06/2005
use db_estudo
create table tb_cliente
(
inCod_cli int
, vcNome_cli varchar(30)
, vcEnd_cli varchar(30)
, chFone_cli char(11)
, vcEmail_cli varChar(30)
, dcSal_cli decimal(10,2)
, dtData_cli datetime
)
Depois de criada a tabela adicione os dados:
insert tb_cliente values(1,'Marina Farina','R Campos, 299','3211-
1563','mari@blue.com',1800.00,'15/04/2008')
insert tb_cliente values(2,'Edson Mendes','Av. Paulista, 277','5125-
2000','emendes@tree.com',1210.10,'20/03/2007')
insert tb_cliente values(3,'Aline Moda','Al. Santos, 512','4116-
1518','amoda@estilo.com',2000.00,'28/08/2006')
insert tb_cliente values(4,'Tatiana Souza','Av. Rebouas, 15','9985-
0965','tsouza@comp.com',1500.30,'05/01/2004')
insert tb_cliente values(5,'Cssio Adriano','Av. 9 de julho, 60','5465-
1358','cadriano@tetra.com',1945.88,'24/06/2005')
19
Captulo 3 DML Simples
Ca'()ulo 4 - %L Si7'l,s
Os comandos DML (Data Manipulation Language - Linguagem de Manipulao de
Dados) um subconjunto da linguagem usada para selecionar, inserir, atualizar e
apagar dados, por meio destes comandos, essas tarefas podem ser executadas em
vrios registros ao mesmo tempo.
I$SERT usada para somar uma fila (formalmente uma tupla) a uma tabela
existente.
SELECT o comumente mais usado do DML, comanda e permite ao usurio
especificar uma query como uma descrio do resultado desejado. A questo
no especifica como os resultados deveriam ser localizados.
UPATE para mudar os valores de dados em uma fila de tabela existente.
ELETE permite remover filas existentes de uma tabela.
I$SERT
A instruo I$SERT utilizada para adicionar registros em uma tabela de um banco
de dados.
I$SERT [NTO] <NomeTabela> VALUES=<valores>>
I$SERT [NTO] <NomeTabela> =coluna1, coluna2,..colunaN>
VALUES =valor1, valor2, ..., valorN>
Os valores descritos junto ao comando I$SERT so transformados em uma ou mais
linhas da tabela. Os nomes das colunas nas quais os dados sero inseridos devem
ser separados por vrgulas.
As colunas que no foram declaradas no comando NSERT podem apresentar um
valor padro caso essa definio seja configurada na tabela, ou simplesmente o
valor NULL.
O-s; No SQL 7 obrigatrio utilizar a clusula I$TO na instruo de I$SERT, no
SQL SERVER 2000 ou superior, est clusula no mais obrigatria.
21
Captulo 3 DML Simples
Para compreendermos o uso do I$SERT, consideremos o exemplo a seguir.
I$SERT 'osi+ional
A instruo NSERT posicional deve ser utilizada quando queremos inserir
dados de acordo com a ordem fsica das colunas da tabela.
Exemplo:
NSERT T-HCli,n),
VALUES (*,'Marcos Evangel','Rua 1','3515-2119','mEva@free.com','4500.26','10/15/02')
NSERT T-HCli,n),
VALUES (3,'Adalberto Bacili','Rua 2','3288-1563','aBaci@free.com','5600.38','10/20/03')
NSERT T-HCli,n),
VALUES (4,'Srgio Manoel','Rua So Bento','4545-1212','sMano@free.com','4982.74','01/25/04')
NSERT T-HCli,n),
VALUES (L,'Thiago Hawano','Rua Direta','7875-1520','tHawa@free.com','6423.12','02/14/06')
NSERT T-HCli,n),
VALUES (A,'Carina Tugues','Rua Torta ','3132-3113','cTugue@free.com','6800.98','01/13/98')
NSERT T-HCli,n),
VALUES (M,'Fabio Monte','Av. Santos','2526-1515','fMonte@free.com','4678.15','06/25/92')
21
Captulo 3 DML Simples
I$SERT d,+lara)ivo
O NSERT declarativo deve ser utilizado quando queremos incluir dados na
tabela de modo que possamos definir uma ordem em que tais valores sero
adicionados.
Exemplo:
NSERT NTO T-HCli,n), (inCodH+li, v+$o7,H+li, v+EndHCli, v+Gon,H+li, v+E7ailH+li,
d+SalH+li, d)A)aH+li)
VALUES (*,'Marcos Evangel','Rua 1','3515-2119','mEva@free.com','4500.26','10/15/02')
NSERT NTO T-HCli,n), ( inCodH+li
, v+$o7,H+li
, v+EndHCli
, v+Gon,H+li
, v+E7ailH+li
, d+SalH+li
, d)A)aH+li
)
VALUES (3,'Adalberto Bacili','Rua 2','3288-1563','aBaci@free.com','5600.38','10/20/03')
NSERT NTO T-HCli,n), ( inCodH+li
, v+$o7,H+li
, v+EndHCli
, v+Gon,H+li
, v+E7ailH+li
, d+SalH+li
, d)A)aH+li
)
VALUES ( 4
, 'Srgio Manoel'
, 'Rua So Bento'
, '4545-1212'
, 'sMano@free.com'
, '4982.74'
, '01/25/04'
)
O-s; As trs estruturas esto corretas, neste exemplo apenas estruturei as instrues de
formas diferentes para ilustrar algumas maneiras de organizar a instruo, lembrando
que para executarmos uma instruo, temos de selecionar todo o comando referente a
mesma.
22
Captulo 3 DML Simples
SELECT
Esta sem duvidas a instruo SQL mais importante e mais utilizada na
linguagem SQL para a realizao de consultas a dados. Por meio desta instruo
podemos retornar dados para outros comandos SQL e outras aplicaes.
Para compreendermos o uso do SELECT, consideremos o exemplo a seguir.
ECi-indo )odas as +olunas
Para que todos os dados contidos dentro da tabela cliente sejam exibidos,
devemos utilizar o seguinte comando:
SELECT * FROM Tb_Cliente
Com a utilizao do comando ( K ), os dados so exibidos na mesma ordem
em que foram criados na tabela Cliente.
ECi-indo al6u7as +olunas
Para exibirmos apenas os dados de algumas colunas da tabela de clientes,
devemos substituir o ( * ) pelos nomes das colunas da tabela.
SELECT vcNome_cli, vcEnd_cli, vcEmail_cli FROM Tb_Cliente
ECi-indo +olunas u)ilizando alias
Podemos substituir o nome de uma coluna por um alias (apelido), para
facilitarmos a visualizao.
SELECT vcNome_cli AS Nome_Cliente
, vcEnd_cli AS Endereco_Cliente
, vcEmail_cli AS Email_Cliente
FROM Tb_Cliente
2$
Captulo 3 DML Simples
No necessrio utilizar clusula AS para colocarmos um apelido nas
colunas da tabela, mas muitos usurios, preferem manter a clusula AS para
facilitar a identificao do apelido.
SELECT vcNome_cli Nome_Cliente
, vcEnd_cli Endereco_Cliente
, vcEmail_cli Email_Cliente
GRO% Tb_Cliente
Existe tambm outra maneira de se utilizar os apelidos de colunas, como
mostra o exemplo a seguir:
SELECT Nome_Cliente = vcNome_cli
, Endereco_Cliente = vcEnd_cli
, Email_Cliente = vcEmail_cli
GRO% Tb_Cliente
ECi-indo +olunas u)ilizando alias +o7 ,s'a0o no no7,
Para utilizarmos espaos em branco em apelidos de colunas, devemos fazer
o uso dos colchetes [Nome Cliente], vejamos alguns exemplos:
SELECT vcNome_cli AS NNome ClienteO
, vcEnd_cli AS NEndereco ClienteO
, vcEmail_cli AS NEmail ClienteO
GRO% Tb_Cliente
SELECT vcNome_cli NNome ClienteO
, vcEnd_cli NEndereco ClienteO
, vcEmail_cli NEmail ClienteO
GRO% Tb_Cliente
SELECTNNome ClienteO = vcNome_cli
, NEndereco ClienteO = vcEnd_cli
, NEmail ClienteO = vcEmail_cli
GRO% Tb_Cliente
2%
Captulo 3 DML Simples
Criando u7a +oluna vir)ual +o7 o +o7ando SELECT
Quando utilizamos uma instruo SELECT no necessariamente podemos
exibir apenas as colunas existentes em uma tabela, podemos apresentar
colunas que no existe na tabela para, por exemplo, descrever uma situao
em relao aos dados listados. No exemplo a seguir a coluna Tipo de Cliente
no faz parte do banco de dados, mas podemos inclu-la em uma consulta
para retornarmos alguma descrio sobre os dados, vejamos o exemplo
SELECT vcNome_cli AS NNome ClienteO
, vcEnd_cli AS NEndereco ClienteO
, vcEmail_cli AS NEmail ClienteO
,'Ex-aluno' AS NTipo de ClienteO
GRO% Tb_Cliente
SELECT vcNome_cli NNome ClienteO
, vcEnd_cli NEndereco ClienteO
, vcEmail_cli NEmail ClienteO
,'Ex-aluno' NTipo de ClienteO
GRO% Tb_Cliente
SELECT NNome ClienteO = vcNome_cli
, NEndereco ClienteO = vcEnd_cli
, NEmail ClienteO = vcEmail_cli
, NTipo de ClienteO = 'Ex-aluno'
GRO% Tb_Cliente
2&
Captulo 3 DML Simples
ECi-indo u7a o',ra01o +o7 +o7ando SELECT
Algumas vezes necessitamos exibir alguns dados que no existem em uma
tabela, como por exemplo, se quisermos exibir um aumento de 10% no salrio
de cada cliente. Desejamos exibir esta informao, mas no queremos salvar
esta informao na tabela. Vejamos o exemplo:
SELECT vcNome_cli AS NNome ClienteO
, vcEnd_cli AS NEndereco ClienteO
, vcEmail_cli AS NEmail ClienteO
8'Ex-aluno' AS NTipo de ClienteO
,dcSal_cli AS NSalrio do ClienteO
,dcSal_cli * 1.1 AS NSalrio com 10% de aumentoO
GRO% Tb_Cliente
SELECT vcNome_cli NNome ClienteO
, vcEnd_cli NEndereco ClienteO
, vcEmail_cli NEmail ClienteO
,'Ex-aluno' NTipo de ClienteO
,dcSal_cli NSalrio do ClienteO
,dcSal_cli * 1.1 NSalrio com 10% de aumentoO
GRO% Tb_Cliente
SELECT NNome ClienteO = vcNome_cli
, NEndereco ClienteO = vcEnd_cli
, NEmail ClienteO = vcEmail_cli
, NTipo de ClienteO = 'Ex-aluno'
, NSalrio do ClienteO = dcSal_cli
, NSalrio com 10% de aumentoO = dcSal_cli * 1.1
GRO% Tb_Cliente
2)
Captulo 3 DML Simples
ECi-indo a',nas u7a v,z os dados r,',)idos E ISTI$CT
Conforme a tabela abaixo o cliente Fabio Monte foi adicionado duas vezes na
tabela de cadastro de cliente, mas desejamos exibir apenas uma vez cada
registro.
Ao listarmos os dados de Nome de cliente e data de Cadastro teremos o
cliente Fabio Monte aparecera duas vezes como no exemplo abaixo:
SELECT vcNome_cli, dtData_cl
GRO% Tb_Cliente
Para que os registros repetidos no sejam exibidos, devemos utilizar a
clusula ISTI$CT junto como comando SELECT, como mostra a instruo
a seguir:
SELECT ISTI$CT vcNome_cli, dtData_cli
GRO% Tb_Cliente
27
Captulo 3 DML Simples
Co'iando dados d, u7a )a-,la 'ara ou)ra )a-,la u)ilizando os +o7andos
I$SERT +o7 SELECT
Para copiarmos dados de uma tabela para outra, precisamos que a estrutura
das tabelas seja similar, ou se diferentes, que a tornemos similares por meio
da instruo SELECT.
I$SERT +o7 SELECT Puando as )a-,las s1o i6uais
Para este exemplo, criaremos duas tabelas com estruturas idnticas, mas
representando entidades diferentes.
CREATE TABLE tb_cliente
(
inCod_cli int
, vcNome_cli varchar(30)
, vcEnd_cli varchar(30)
, chFone_cli char(11)
, vcEmail_cli varChar(30)
, dcSal_cli decimal(10,2)
, dtData_cli datetime
)
CREATE TABLE tb_funcionario
(
inCod_fun int
, vcNome_fun varchar(30)
, vcEnd_fun varchar(30)
, chFone_fun char(11)
, vcEmail_fun varChar(30)
, dcSal_fun decimal(10,2)
, dtData_fun datetime
)
Os dados j esto disponveis na tabela de cliente, mas queremos copi-los
para a tabela de funcionrios. Como ambas possuem a mesma quantidade de
colunas e o mesmo tipo de dados em cada coluna e uma seqncia idntica,
podemos utilizar a seguinte instruo:
I$SERT I$TO tb_funcionario
SELECT K GRO% tb_cliente
I$SERT tb_funcionario
SELECT K GRO% tb_cliente
2/
Captulo 3 DML Simples
I$SERT +o7 SELECT Puando as )a-,las s1o di<,r,n),s
Para este exemplo, criaremos duas tabelas com estruturas idnticas, mas
representando entidades diferentes.
CREATE TABLE tb_cliente
(
inCod_cli int
, vcNome_cli varchar(30)
, vcEnd_cli varchar(30)
, dtData_cli datetime
)
CREATE TABLE tb_funcionario
(
inCod_fun int
, vcNome_fun varchar(30)
, vcEnd_fun varchar(30)
, chFone_fun char(11)
, vcEmail_fun varChar(30)
, dcSal_fun decimal(10,2)
, dtData_fun datetime
)
Embora a tabela de cliente contenha alguns registros, nem todas as
colunas existentes em funcionrio, existem na tabela de clientes. Para
que seja possvel copiar dados de cliente para funcionrio, devemos
utilizar a instruo SELECT com as colunas virtuais, como no exemplo
abaixo:
I$SERT I$TO Tb_funcionario
SELECT inCod_cli
, vcNome_cli
, vcEnd_cli
, '0000-0000'
, 'No tem e-mail'
, 0
,dtData_cli
GRO% tb_cliente
I$SERT Tb_funcionario
SELECT inCod_cli
, vcNome_cli
, vcEnd_cli
, '0000-0000'
, 'No tem e-mail'
, 0
,dtData_cli
GRO% tb_cliente
Dessa forma a tabela de funcionrio ter os seguintes registros:
29
Captulo 3 DML Simples
4;4; UPATE
Os registros de cada tabela podem ser alterados por meio do comando UPATE,
por exemplo, por meio deste comando podemos aumentar o valor do salrio de
todos os clientes em 5%.
Para utilizarmos esta instruo precisamos, especificar algumas informaes.
Como o nome da tabela que ser atualizada e as colunas que sofrero a
alterao
Para compreendermos o uso do UPATE, consideremos o exemplo a seguir.
Al),rando dados d, u7a +oluna
Para alterarmos apenas os dados da coluna dcSal_cli devemos utilizar a
seguinte instruo:
UPATE Tb_cliente
SET dc_Sal_cli = dc_Sal_cli * 1.05
Aps executarmos este comando os registros apareceram da seguinte forma:
$1
Captulo 3 DML Simples
Al),rando dados d, varias +olunas
Para alterarmos os dados de diferentes colunas da tabela devemos
especificar o nome das colunas separadas por vrgula.
UPATE Tb_cliente
SET dc_Sal_cli = dc_Sal_cli * 1.05
, dtData_cli = dtData_cli + 1
UPATE Tb_cliente
SET dc_Sal_cli = dc_Sal_cli * 1.05
, dtData_cli = dtData_cli + 1
GRO% Tb_cliente
Alm de alterarmos o salrio dos clientes, estamos somando 1 dia a mais na
data de cadastro dos clientes.
ELETE
A instruo ELETE deve ser utilizado quando desejamos eliminar dados de
uma tabela.
Por exemplo:
ELETE Tb_cliente ELETE GRO% Tb_cliente
O-s; Caso alguma linha no possa ser removida da tabela, nenhum dado ser
eliminado.
$1
Captulo 4 - A clusula WHERE
Ca'()ulo L - A +l.usula QRERE
A clusula QRERE uma parte opcional da instruo SELECT, ELETE e da
instruo UPATE. A clusula QRERE permite selecionar linhas baseado em uma
expresso booleana. Somente as linhas para as quais a expresso avaliada como
TRUE so retornadas no resultado, ou no caso da instruo ELETE, excludas, ou
no caso da instruo UPATE, atualizadas.
Utilizaremos a seguinte tabela de produtos para trabalharmos com a clusula WHERE.
CREATE TABLE tb_Produto
( inCod_Prod int
, vcNome_Prod varchar(50)
, vcTipo_Prod varchar(50)
, inQtd_Prod int
, dcValor_Prod decimal(10,2)
)
GO
NSERT NTO tb_Produto
VALUES(1,'Teclado','nformtica',100,150.00)
NSERT NTO tb_Produto
VALUES(2,'Mouse','nformtica',300,45.00)
NSERT NTO tb_Produto
VALUES(3,'Filmadora Digital','Digitais',500,2500.00)
NSERT NTO tb_Produto
VALUES(4,'Celular','Telefones',1000,1500.00)
NSERT NTO tb_Produto
VALUES(5,'DVD Player','Eletrnicos',150,150.00)
NSERT NTO tb_Produto
VALUES(6,'Caixas de Som','nformtica',20,80.00)
NSERT NTO tb_Produto
VALUES(7,'Televisor','Digitais',50,25000.00)
NSERT NTO tb_Produto
VALUES(8,'Rgua','Escritrio',180,10.00)
NSERT NTO tb_Produto
VALUES(9,'CD','nformtica',320,1.50)
NSERT NTO tb_Produto
VALUES(10,'DVD','nformtica',500,3.50)
$2
Captulo 4 - A clusula WHERE
EC,7'lo *: Al),ra01o linha EC,7'lo 3: S,l,01o EC,7'lo 4: A'a6ar
linha
UPDATE tb_Produto
SET dcValor_Prod = dcValor_Prod *1.1
WHERE vcTipo_Prod = 'nformtica'
SELECT * FROM tb_Produto
WHERE vcTipo_Prod = 'nformtica'
DELETE FROM tb_produto
WHERE inCod_Prod = 8
EC,7'los :
EC,7'lo *: Al),ra01o linha
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
1 Teclado nformtica 100 165.00
2 Mouse nformtica 300 49.50
3 Filmadora Digital Digitais 500 2500.00
4 Celular Telefones 1000 1500.00
5 DVD Player Eletrnicos 150 150.00
6 Caixas de Som nformtica 20 88.00
7 Televisor Digitais 50 25000.00
8 Rgua Escritrio 180 10.00
9 CD nformtica 320 1.65
10 DVD nformtica 500 3.85
Exemplo 2: Seleo
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
1 Teclado nformtica 100 165.00
2 Mouse nformtica 300 49.50
6 Caixas de Som nformtica 20 88.00
9 CD nformtica 320 1.65
10 DVD nformtica 500 3.85
$$
Captulo 4 - A clusula WHERE
EC,7'lo 4: A'a6ar linha
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
1 Teclado nformtica 100 165.00
2 Mouse nformtica 300 49.50
3 Filmadora Digital Digitais 500 2500.00
4 Celular Telefones 1000 1500.00
5 DVD Player Eletrnicos 150 150.00
6 Caixas de Som nformtica 20 88.00
7 Televisor Digitais 50 25000.00
9 CD nformtica 320 1.65
10 DVD nformtica 500 3.85
A +l.usula QRERE +o7 os o',rador,s l56i+os A$ , OR
Os operadores lgicos AND e OR so empregados na clusula WHERE quando
necessitamos especificar mais que uma condio de comparao.
EC,7'lo *: Precisamos listar todos os produtos de informtica cuja quantidade
seja menor que 300.
Logo queremos os produtos Sond,T Tipo= nformtica S,T Quantidade menor
que 300.
Ento: QRERE vcTipo_Prod = 'nformtica' A$ inQtd_Prod < 300
SELECT * FROM tb_Produto
WHERE vcTipo_Prod = 'nformtica'
A$ inQtd_Prod < 300
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
1 Teclado nformtica 100 165.00
6 Caixas de Som nformtica 20 88.00
$%
Captulo 4 - A clusula WHERE
EC,7'lo 3: Precisamos aumentar o valor do produto em 10% dos produtos que
forem dos tipos Eletrnicos ou sobre o valor daqueles cujo preo maior ou igual
a R$700,00.
Logo queremos os produtos Sond,T Tipo= Eletrnicos SouT Valor <= 700,00
Ento: QRERE vcTipo_Prod = 'Eletrnicos' OR dcValor_Prod < = 700.00
UPDATE tb_Produto
SET dcValor_Prod = dcValor_Prod *1.1
WHERE vcTipo_Prod = 'Eletrnicos'
OR d+ValorHProd I U VBB;BB
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
1 Teclado nformtica 100 181.50
2 Mouse nformtica 300 54.45
3 Filmadora Digital Digitais 500 2500.00
4 Celular Telefones 1000 1500.00
5 DVD Player Eletrnicos 150 165.00
6 Caixas de Som nformtica 20 96.80
7 Televisor Digitais 50 25000.00
9 CD nformtica 320 1.82
10 DVD nformtica 500 4.24
A +l.usula QRERE +o7 o o',rador I$
O operador N permite verificar se o valor de uma coluna est presente em uma
lista de elementos.
Considerando a tabela Produto, podemos utilizar o N ou o operador OR para
selecionar os produtos do tipo Eletrnicos ou do tipo nformtica. Vejamos os
exemplos:
EC,7'lo O',rador OR
SELECT * FROM tb_Produto
WHERE vcTipo_Prod = 'Eletrnicos'
OR vcTipo_Prod = 'nformtica'
EC,7'lo O',rador I$
SELECT * FROM tb_Produto
WHERE vcTipo_Prod I$ ('Eletrnicos','nformtica')
$&
Captulo 4 - A clusula WHERE
Ao executarmos ambas as instrues obtemos os mesmos resultados.
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
1 Teclado nformtica 100 181.50
2 Mouse nformtica 300 54.45
5 DVD Player Eletrnicos 150 165.00
6 Caixas de Som nformtica 20 96.80
9 CD nformtica 320 1.82
10 DVD nformtica 500 4.24
A +l.usula QRERE +o7 os o',rador,s $OT I$
O operador lgico NOT N, ao contrrio de N, permite obter resultados que no
esteja em uma determinada condio. Por exemplo, no queremos os produtos
do tipo Eletrnicos e nformtica.
EC,7'lo O',rador $OT I$
SELECT * FROM tb_Produto
WHERE vcTipo_Prod $OT I$ ('Eletrnicos','nformtica')
Tambm possivel utilizar o operador lgico AND em conjunto ao sinal de
comparao diferente ( <> ) ou ( != ) para obter o mesmo resultado.
SELECT * FROM tb_Produto
WHERE vcTipo_Prod IJ 'Eletrnicos'
AND vcTipo_Prod IJ 'nformtica'
SELECT * FROM tb_Produto
WHERE vcTipo_Prod WU 'Eletrnicos'
AND vcTipo_Prod WU 'nformtica'
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
3 Filmadora Digital Digitais 500 2500.00
4 Celular Telefones 1000 1500.00
7 Televisor Digitais 50 25000.00
$)
Captulo 4 - A clusula WHERE
L;*; A +l.usula QRERE +o7 o o',rador BETQEE$
O operador BETWEEN tem a finalidade de permitir a consulta de uma faixa de
valores. Dessa forma, podemos selecionar da tabela produtos os produtos que
estejam entre R$100,00 e R$500,00. Vejamos o exemplo:
SELECT * FROM tb_Produto
WHERE dcValor_Prod BETQEE$ 100.00 A$ 500.00
Outra forma de se obter o mesmo resultado por meio da seguinte instruo:
SELECT * FROM tb_Produto
WHERE dcValor_Prod >= 100.00 AND dcValor_Prod <= 500.00
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
1 Teclado nformtica 100 181.50
5 DVD Player Eletrnicos 150 165.00
A +l.usula QRERE +o7 os o',rador,s $OT BETQEE$
O operador NOT BETWEEN ao contrrio do anterior, permite consultar valores
que no estejam numa determinada faixa de valores.
SELECT * FROM tb_Produto
WHERE dcValor_Prod $OT BETQEE$ 100.00 A$ 500.00
Outra forma de se obter o mesmo resultado por meio da seguinte instruo:
SELECT * FROM tb_Produto
WHERE dcValor_Prod < 100.00 OR dcValor_Prod > 500.00
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
2 Mouse nformtica 300 54.45
3 Filmadora Eletrnicos 500 2750.00
4 Celular Eletrnicos 1000 1650.00
6 Caixas de Som nformtica 20 96.80
7 Televisor Eletrnicos 50 27500.00
9 CD nformtica 320 1.82
10 DVD nformtica 500 4.24
$7
Captulo 4 - A clusula WHERE
O O',rador LIKE
O operador LKE [como] faz casamento de padres. Um padro uma string
contendo caracteres que podem ser combinados com parte de outra string.
Por exemplo, o caractere % em um padro representa qualquer quantidade de
caracteres. Por exemplo, para obter todos os produtos cujo (primeiro) nome
comea com C, use:
SELECT * FROM tb_produto
WHERE vcNome_Prod LKE 'C%'
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
4 Celular Eletrnicos 1000 1650.00
6 Caixas de Som nformtica 20 96.80
9 CD nformtica 320 1.82
Para obter todos os produtos que contenham as letras 'ad' no meio (ou no incio
ou no fim), use:
SELECT * FROM tb_produto
WHERE vcNome_Prod LKE '%ad%'
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
1 Teclado nformtica 100 181.50
3 Filmadora Digital Digitais 500 2500.00
Tambm possvel usar os colchetes para combinar com uma determinada
faixa de caracteres. Por exemplo, LKE '[CD]%' encontra os produtos que iniciam
com C ou K
SELECT * FROM tb_produto
WHERE vcNOme_Prod LKE '[CD]%'
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
4 Celular Telefones 1000 1500.00
5 DVD Player Eletrnicos 150 165.00
6 Caixas de Som nformtica 20 96.80
9 CD nformtica 320 1.82
10 DVD nformtica 500 4.24
$/
Captulo 4 - A clusula WHERE
Tambm possvel trazer os produtos que comeam com as letras de A at F.
SELECT * FROM tb_produto
WHERE vcNome_Prod LKE '[A-F]%'
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
3 Filmadora Digital Digitais 500 2500.00
4 Celular Telefones 1000 1500.00
5 DVD Player Eletrnicos 150 165.00
6 Caixas de Som nformtica 20 96.80
9 CD nformtica 320 1.82
10 DVD nformtica 500 4.24
J o LKE '[^T]%' encontra os produtos que no comeam com T (o caractere ^
indica no).
SELECT * FROM tb_produto
WHERE vcNome_Prod LKE '[^T]%'
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
2 Mouse nformtica 300 54.45
3 Filmadora Digital Digitais 500 2500.00
4 Celular Telefones 1000 1500.00
5 DVD Player Eletrnicos 150 165.00
6 Caixas de Som nformtica 20 96.80
9 CD nformtica 320 1.82
10 DVD nformtica 500 4.24
Caso invertamos a posio da % como no exemplo abaixo, teremos o valores
que terminam com, por exemplo, R.
SELECT * FROM tb_produto
WHERE vcNome_Prod LKE '%R'
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
4 Celular Telefones 1000 1500.00
5 DVD Player Eletrnicos 150 165.00
7 Televisor Digitais 50 25000.00
Note que as comparaes feitas com LKE dependem da ordem de classificao
[sort order] escolhida durante a instalao do SQL Server. Se for usada a ordem
"accentinsensitive", ele consegue procurar ignorando acentos. Por exemplo,
LKE 'camara' vai encontrar tambm 'Cmara'.
$9
Captulo 4 - A clusula WHERE
A +l.usula QRERE +o7 os o',rador,s $OT LIKE
O operador NOT LKE utilizado de forma oposta ao operador LKE.
Por exemplo, queremos produtos que no possuem a letra "R no nome do
produto.
SELECT * FROM tb_produto
WHERE vcNome_Prod NOT LKE '%R%'
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
1 Teclado nformtica 100 181.50
2 Mouse nformtica 300 54.45
6 Caixas de Som nformtica 20 96.80
9 CD nformtica 320 1.82
10 DVD nformtica 500 4.24
Ou produtos que no comeam com a letra "C.
SELECT * FROM tb_produto
WHERE vcNome_Prod NOT LKE 'c%'
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
1 Teclado nformtica 100 181.50
2 Mouse nformtica 300 54.45
3 Filmadora Digital Digitais 500 2500.00
5 DVD Player Eletrnicos 150 165.00
7 Televisor Digitais 50 25000.00
10 DVD nformtica 500 4.24
Outro caractere para usar em padres o sublinhado (_). Ele combina com um
nico caractere. Por exemplo, se nos seus dados existem campos como, por
exemplo, nome 'Sousa' ou 'Souza', voc pode usar: LKE '%sou_a%'.
%1
Captulo - A Clusula !RDER "#
Ca'()ulo A - A Cl.usula ORER B@
ORER B@
Para ver o resultado numa ordem particular, use a clusula ORDER BY. Se
estiver presente, deve ser a ltima clusula do comando SELECT, a clusula
ORER B@ utilizada em conjunto com a instruo SELECT, a fim de retornar
o resultado de uma consulta em uma determinada ordem.
Ord,nando 'or +olunas
Podemos utilizar como critrio de ordenao, o nome ou o numero referente a
coluna que se deseja ordenar.
Ord,nando 'or u7a +oluna
SELECT * FROM tb_produto
ORDER BY vcNome_Prod
SELECT * FROM tb_produto
ORDER BY 2
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
6 Caixas de Som nformtica 20 96.80
9 CD nformtica 320 1.82
4 Celular Telefones 1000 1500.00
10 DVD nformtica 500 4.24
5 DVD Player Eletrnicos 150 165.00
3 Filmadora Digital Digitais 500 2500.00
2 Mouse nformtica 300 54.45
1 Teclado nformtica 100 181.50
7 Televisor Digitais 50 25000.00
Ord,nando 'or varias +olunas
SELECT * FROM tb_produto
ORDER BY vcTipo_Prod, dcValor_Prod
SELECT * FROM tb_produto
ORDER BY 3,5
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
3 Filmadora Digital Digitais 500 2500.00
7 Televisor Digitais 50 25000.00
5 DVD Player Eletrnicos 150 165.00
9 CD nformtica 320 1.82
10 DVD nformtica 500 4.24
2 Mouse nformtica 300 54.45
6 Caixas de Som nformtica 20 96.80
1 Teclado nformtica 100 181.50
4 Celular Telefones 1000 1500.00
A;*; ORER B@ ASC , ESC
%1
Captulo - A Clusula !RDER "#
Na clusula ORER B@ pode-se adicionar mais uma instruo que indica se a
ordenao ser ascendente ou descendente.
ASC
Quando utilizamos est instruo, estamos solicitando uma ordenao
ascendente, ou seja, do menor para o maior.
SELECT vcNome_Prod, dcValor_Prod FROM tb_produto
ORDER BY dcValor_Prod ASC
v+$o7,HProd d+ValorHProd
CD 1.82
DVD 4.24
Mouse 54.45
Caixas de Som 96.80
DVD Player 165.00
Teclado 181.50
Celular 1500.00
Filmadora Digital 2500.00
Televisor 25000.00
ESC
Quando utilizamos est instruo, estamos solicitando uma ordenao
descendente, ou seja, do maior para o menor.
SELECT vcNome_Prod, dcValor_Prod FROM tb_produto
ORDER BY dcValor_Prod DESC
v+$o7,HProd d+ValorHProd
Televisor 25000.00
Filmadora Digital 2500.00
Celular 1500.00
Teclado 181.50
DVD Player 165.00
Caixas de Som 96.80
Mouse 54.45
DVD 4.24
CD 1.82
%2
Captulo - A Clusula !RDER "#
ASC , ESC
Podemos combinar as clusulas ASC e ESC de maneira que uma coluna
fique na ordem crescente e a outra fique na ordem decrescente, por exemplo,
queremos que a primeira coluna do tipo de produto esteja na ordem
crescente, mas os preos estejam na ordem decrescente. Vejamos o
exemplo:
SELECT vcTipo_Prod, vcNome_Prod, dcValor_Prod FROM tb_produto
ORDER BY vcTipo_Prod ASC, dcValor_Prod DESC
v+Ti'oHProd v+$o7,HProd d+ValorHProd
Digitais Televisor 25000.00
Digitais Filmadora Digital 2500.00
Eletrnicos DVD Player 165.00
nformtica Teclado 181.50
nformtica Caixas de Som 96.80
nformtica Mouse 54.45
nformtica DVD 4.24
nformtica CD 1.82
Telefones Celular 1500.00
$o)a: Se no especificarmos ASC nem DESC, o default ASC.
A +l.usula TOP
A clusula TOP permite que retornemos em uma consulta um limite mximo de
linhas estipulado na clusula TOP.
Est clusula muito utilizado tambm para realizarmos testes para verificarmos
nomes de campos de uma determinada tabela sem precisarmos retornar todos
os registros.
SELECT TOP 5 * FROM tb_Produto
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
1 Teclado nformtica 100 181.50
2 Mouse nformtica 300 54.45
3 Filmadora Digital Digitais 500 2500.00
4 Celular Telefones 1000 1500.00
5 DVD Player Eletrnicos 150 165.00
%$
Captulo - A Clusula !RDER "#
A +l.usula TOP +o7 Ord,r By
Por exemplo, queremos os trs produtos mais caros de nossa loja.
SELECT TOP 3 * FROM tb_Produto
ORDER BY dcValor_Prod DESC
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
7 Televisor Digitais 50 25000.00
3 Filmadora Digital Digitais 500 2500.00
4 Celular Telefones 1000 1500.00
A +l.usula TOP QITR TIES +o7 ORER B@
Especifica que linhas adicionais so retornadas do conjunto de resultados
base com o mesmo valor das colunas que aparecem na ltima das TOP n
linhas (PERCE$T). TOP... QITR TIES s pode ser especificado em
instrues SELECT, e apenas se uma clusula ORER B@ for especificada.
Para o exemplo abaixo iremos realizar mais um I$SERT na tabela de
produtos.
NSERT NTO tb_Produto
VALUES(1,'Teclado Wireless','nformtica',20,150.00)
Agora vamos supor que precisamos obter como resultado o produto com a
menor quantidade de unidades. Porm, preciso considerar a existncia do e
produtos com a mesma quantidade de unidades. Neste caso o comando para
retornar os produtos com menor numera de unidades:
SELECT TOP 1 QITR TIES * FROM tb_Produto
ORDER BY inQtd_Prod ASC
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
6 Caixas de Som nformtica 20 96.80
1 Teclado Wireless nformtica 20 150.00
A clusula QITR TIES retorna a primeira linha da tabela, alm de todas as
linhas que apresentam quantidade idntica quantidade do produto que a
clusula TOP selecionou.
%%
Captulo - A Clusula !RDER "#
Vejamos mais um exemplo com a clusula WTH TES.
Na instruo SELECT com TOP normalmente s retornado a quantidade
mxima que especificada na clusula TOP, neste caso, apenas oito
registros, mas quando utilizamos a clusula WTH TES a instruo retorna
tambm os registros onde a quantidade igual ao ultimo registro, neste caso,
o oitavo registro.
SELECT TOP 8 WTH TES * FROM tb_Produto
ORDER BY inQtd_Prod ASC
inCodHProd v+$o7,HProd v+Ti'oHProd inQ)dHProd d+ValorHProd
6 Caixas de Som nformtica 20 96.80
1 Teclado Wireless nformtica 20 150.00
7 Televisor Digitais 50 25000.00
1 Teclado nformtica 100 181.50
5 DVD Player Eletrnicos 150 165.00
2 Mouse nformtica 300 54.45
9 CD nformtica 320 1.82
10 DVD nformtica 500 4.24
3 Filmadora Digital Digitais 500 2500.00
%&
Captulo $ - Associan%o &abelas
Ca'()ulo M - In),6ridad, , Consis)Xn+ia dos ados
Quando falamos em integridade, pensamos em proteo contra hackers e ataques
do gnero, ou at mesmo backup, mas a integridade comea em um nvel muito
mais baixo, comea na criao e projeto do banco de dados.
R,6ras d, In),6ridad, , +onsis)Xn+ia
In),6ridad, d, o7(nio
A integridade de domnio nada mais do que a integridade do campo como o
tipo de dados correto, se permite valores nulos ou no nulos, valores padro,
verificao de valores e restries, estes mecanismos foram criados para dar
integridade aos campos. Os tipos de dados tambm so caracterizados como
integridade de domnio, se o tipo de dado estiver incorreto, ou com mais posies
que o necessrio, pode haver um risco que quebre a qualidade da informao.
In),6ridad, d, En)idad,
A integridade de entidade nada mais que a integridade da tabela, isto
conseguido atravs das chaves primrias ou campos nicos, uma tabela sem
chave primria ou campo nico uma tabela sem integridade de entidade,
muito comum encontrarmos base de dados com tabelas sem qualquer tipo de
restrio, alguns colocam campo auto incrementvel e no se preocupam com a
chave primria ou principal, mas esquecem que o campo auto incrementvel no
garante a no duplicidade dos registros.
In),6ridad, R,<,r,n+ial
A integridade referencial conhecida principalmente pelas chaves estrangeiras
ou referencias a outras tabelas, nada mais que criarmos campos de mesmo
tipo de dados referente a uma coluna de chave primria de outra tabela, isto
possvel a partir da integridade de entidade, apenas conseguimos criar uma
chave estrangeira a partir de uma chave primria ou nica.
%)
Captulo $ - Associan%o &abelas
Para que possamos compreender as regras referentes integridade e
consistncia de dados, utilizaremos a tabela de Colaborador, descrita abaixo.
v+$o7, +hS,Co d+Salario
Luana Maia M 1980.00
Andr nca M 2103.00
Suzana Silva F 2530.00
Rogrio Tecca M 1752.00
Andr nca M 2103.00

CREATE TABLE tb_colaborador
(
vcNome varchar(100)
,chSexo char(1)
,dcSalario decimal(10,2)
)
GO
NSERT NTO tb_colaborador values ('Luana Maia','M',1980.00)
NSERT NTO tb_colaborador values ('Andr nca','M',2103.00)
NSERT NTO tb_colaborador values ('Suzana Silva','F',2530.00)
NSERT NTO tb_colaborador values ('Rogrio Tecca','M',1752.00)
NSERT NTO tb_colaborador values ('Andr nca','M',2103.00)
%7
Captulo $ - Associan%o &abelas
Cons)rain)s
Uma restrio N+ons)rain)O uma propriedade de uma coluna usada para
reforar a integridade de dados. Geralmente restries so definidas quando a
tabela criada, mas podem tambm ser definidas ou retiradas quando a tabela j
contm dados. Se um comando de alterao (I$SERT ou UPATE) no satisfaz
uma das restries, o comando cancelado.
Toda restrio tem um nome, que voc pode informar nos comandos CREATE
TABLE e ALTER TABLE. Se voc no informar um nome, o SQL gera um
automaticamente, como PK_TTLEAUTH_AU_D_154AF3E0.
A fim de assegurar a integridade dos dados, o SQL SERVER oferece cinco tipos
de restries diferentes, os quais esto relacionados na tabela abaixo:
Ti'os d, In),6ridad, Ti'os d, Cons)rain)s
Chave Primria Constraint Primary Key
Chave Estrangeira Constraint Foreign Key e Constraint References
Chave Primria, Secundria ou Chave Unica Constraint Unique
Regras de validao Constaint Check
Valor Padro Constraint Default
Chav,s 'ri7.rias
A chave primria de uma tabela uma coluna ou seqncia de colunas que
identificam unicamente uma linha dentro da tabela, ou seja, seu valor no pode
ser repetido para outras linhas. Ao definir uma chave primria, automaticamente
criado um ndice clustered na tabela. S pode existir uma chave primria na
tabela. No se pode inserir um valor nulo em qualquer coluna chave primria
(lembrando que nulo um valor desconhecido, diferente de 0 ou de espao em
branco). Recomenda-se uma coluna inteira e pequena, como uma chave primria
Vejamos o exemplo da tabela colaborador, o funcionrio Andr foi inserido duas
vezes na tabela de colaborador, para aplicarmos um aumento salarial apenas a
um dos Andrs necessitamos de um identificador que diferencie um Andr do
outro Andr, para isso precisamos incluir uma coluna de cdigo do colaborador
que nos permita diferenciar um colaborador do outro, ento criaremos uma
coluna de cdigo do tipo inteiro que seja auto-incremento e seja nica.
%/
Captulo $ - Associan%o &abelas
ALTER TABLE tb_colaborador ADD ind int DENTTY(1,1) PRMARY KEY
v+$o7, +hS,Co d+Salario inId
Luana Maia M 1980.00 1
Andr nca M 2103.00 2
Suzana Silva F 2530.00 3
Rogrio Tecca M 1752.00 4
Andr nca M 2103.00 5
Ao adicionarmos uma nova coluna, a mesma sempre ser gerada na ultima
coluna da tabela.
IE$TIT@
Quando indicamos um campo como DENTTY estamos dizendo que este campo
ser auto incrementvel, portanto no podemos especific-lo ou adicionar um
valor ao mesmo quando realizarmos um NSERT na tabela, pois os valores deste
campo so auto gerveis.
IE$TIT@ N =s,,d 8 in+r,7,n)> O
SEE - Semente
Corresponde ao numero do primeiro valor que ser inserido na tabela.
I$CRE%E$T - ncremento
o valor incremental que acrescentado ao valor de identidade linha anterior,
que foi carregado, o famoso "passo.
Caso no seja especificado o seed e o increment o padro (1,1)
$o)a: Existem situaes em que a constraint Pri7ary K,y definida em vrias
colunas. Quando isso ocorre, possvel que haja valores duplicados em uma
coluna, porm, a combinao de valores da coluna que representa a constraint
Pri7ary K,y deve ser nica.
%9
Captulo $ - Associan%o &abelas
Chav,s 'ri7.rias8 s,+und.rias ou +hav,s Yni+as
Alm das constraints Pri7ary K,y, tambm podemos utilizar constraints
U$IQUE, uma restrio UNQUE em uma coluna ou grupo de colunas determina
que o seu valor deva ser nico na tabela. Esse tipo de restrio usado para
chaves alternadas, ou seja, valores que se repetem na tabela alm da chave
primria. Pode haver vrias restries UNQUE na tabela e as colunas de uma
restrio UNQUE permitem valores nulos.
Vamos adicionar o campo Documento na tabela colaborador, o mesmo dever
ser NCO para cada colaborador, mas primeiro precisamos criar um campo
documento e inserir seus respectivos valores.
Criando o campo Documento na tabela colaborador
ALTER TABLE tb_colaborador ADD vcDocumento varchar(11)
v+$o7, +hS,Co d+Salario inId v+o+u7,n)o
Luana Maia M 1980.00 1 NULL
Andr nca M 2103.00 2 NULL
Suzana Silva F 2530.00 3 NULL
Rogrio Tecca M 1752.00 4 NULL
Andr nca M 2103.00 5 NULL
UPDATE tb_colaborador SET vcDocumento = '22623228884'
WHERE ind = 1
UPDATE tb_colaborador SET vcDocumento = '22623228881'
WHERE ind = 2
UPDATE tb_colaborador SET vcDocumento = '22623228882'
WHERE ind = 3
UPDATE tb_colaborador SET vcDocumento = '22623228883'
WHERE ind = 4
UPDATE tb_colaborador SET vcDocumento = NULL
WHERE ind = 5
v+$o7, +hS,Co d+Salario inId v+o+u7,n)o
Luana Maia M 1980.00 1 22623228884
Andr nca M 2103.00 2 22623228881
Suzana Silva F 2530.00 3 22623228882
Rogrio Tecca M 1752.00 4 22623228883
Andr nca M 2103.00 5 NULL
Obs. Nota quando adicionamos um novo campo a tabela, a coluna ser
sempre inserida no final da tabela.
&1
Captulo $ - Associan%o &abelas
Aps atualizarmos a tabela de colaborador, podemos adicionar a restrio
U$IQUE no campo documento, para garantirmos que duas pessoas no tero
o mesmo documento na tabela.
ALTER TABLE tb_colaborador ADD CONSTRANT UQ_Documento UNQUE(vcDocumento)
Note que colocamos um nome a constraint UNQUE de UQ_Documento.
$o)a: As constraints do tipo U$IQUE podem ser utilizadas para referenciar uma
chave estrangeira.
Chav,s ,s)ran6,iras
Uma forma importante de integridade no banco de dados a integridade
referencial, que a verificao de integridade feita entre duas tabelas. Por
exemplo, a tabela 'Dependente' ser usada para relacionar dados de
COLABORADOR e DEPENDENTES. Ela contm as colunas indColab e
indDepen. A segunda deve conter um cdigo vlido que exista na tabela
'Colaborador'.
Uma chave estrangeira Gor,i6n K,y uma restrio de integridade referencial.
Ela consiste de uma coluna ou grupo de colunas cujo valor deve coincidir com
valores da outra tabela, embora a chave estrangeira possa conter valores nulos,
possvel que, a verificao dos valores que formam esta constraint no ocorra,
ento para garantirmos a verificao da chave estrangeira, fazemos uso da
restrio $OT $ULL com atribuio desta coluna.
Vejamos nas tabelas abaixo como este tipo de referencia implementado.
Tabela de Colaborador
inIdCola-
Chav, Pri7.ria v+$o7,
v+o+u7,n)o Chav,
Zni+a
+hS,Co
A',nas % ou G
d+Salario
valor,s 'osi)ivos
1 Luana Maia 22623228884 M 1980.00
2 Andr nca 22623228881 M 2103.00
3 Suzana Silva 22623228882 F 2530.00
4 Rogrio Tecca 22623228883 M 1752.00
Tabela de Dependente
inId,',n
Chav, Pri7.ria inIdCola- v+$o7, d)$as+
+hS,Co
a',nas % ou G v+Par,n),
1 4 sabella da Silva 02/13/95 F Filha
2 2 Marina Faria 01/15/82 F Esposa
3 3 Paulo Henrique 09/21/80 M Marido
4 3 Aline Faria 07/16/93 F Filha
3 1 Thiago Maia 09/21/99 M Filho
&1
Captulo $ - Associan%o &abelas
Na pagina anterior, temos duas tabelas, Colaborador e Dependente, onde podemos
verificar quais os funcionrios que temos em nossa base de dados e encontrar seus
respectivos dependentes, como possumos um cdigo do colaborador na tabela de
dependentes, podemos encontrar facilmente quem so seus filhos, Marido ou
esposa, note que apenas criamos uma segunda coluna que permite a entrada de
valores numricos, com isso no garantimos a integridade dos dados, pois podemos
inserir qualquer valor nesta coluna mesmo no existindo este cdigo na tabela de
colaboradores, para resolver este tipo de problema de inconsistncia, devemos
colocar uma verificao para que no possa ser atribuda uma entrada que no
exista em colaborador, para isso deve-se fazer uso da famosa chave estrangeira ou
foreign key.
R,6ras d, valida01o
Devemos implementar regras de validao em nossas tabelas para que
possamos garantir a qualidade da informao que estamos trabalhando em
nosso banco de dados, est regras podem evitar confuses na insero de
valores nas tabelas, protegendo desta forma a integridade dos dados, e
impedindo que um possvel erro se propague por um tempo indeterminado em
sua base de dados.
Por exemplo, ao criarmos um campo que classifique uma pessoa como sexo
Masculino ou Feminino, poderia restringir a informao para este campo como
sendo somente Masculino e Feminino, dessa forma garantimos que ao retornar
uma consulta, no encontraremos um valor estranho como, por exemplo, o
endereo na coluna de sexo.
Valor Padr1o
O valor padro uma regra que pode ser aplicada a inmeras colunas de sua
tabela, quando um valor padro estabelecido para uma determinada coluna,
o sistema assume que ele deve ser utilizado nas situaes em que o usurio,
deixa de inserir um valor a um campo da tabela.
Tabela de Colaborador2
inIdCola- v+$o7, +hS,Co
d+Salario
valor 'adr1o *BBB;BB
1 Luana Maia M *BBB;BB
2 Andr nca M *BBB;BB
3 Suzana Silva F 2530.00
4 Rogrio Tecca M 1752.00
Valor,s nulos , n1o nulos
Alm dos valores padro, podemos atribuir valores nulos e no nulos a uma
determinada coluna. Assim ao deixarmos de inserir um valor em um
determinado campo, o mesmo assumiria um valor nulo, e ao restringirmos
como no nulo, no poderemos deixar de inserir valor neste campo, ao
&2
Captulo $ - Associan%o &abelas
tentarmos deixar um campo no nulo em branco o SQL Server retornar um
erro.
Atribuir um valor nulo a uma coluna significa que ela no ter valor. Assim de
acordo com as regras de integridade e consistncia dos dados, preciso
atribuir a nulabilidade das colunas de uma tabela a fim de determinar se elas
aceitaro valores nulos (NULL) ou no (NOT NULL).
a)a )y',s
Datatypes so os tipos de dados que o SQL Server aceita. Eles existem para
que possamos definir o tipo de contedo de um campo de tabela ou de uma
varivel ou parmetro.
Aqui est uma lista de Data Types mais utilizados.
TIPOS $U%RICOS
$O%E
TA%A$RO
=B@TES>
%E$OR
VALOR
%AIOR
VALOR AR%A[E$A
BGNT 8 -263 2
63
- 1 NTERO
NT 4 -231 2
31
- 1 NTERO
SMALLNT 2 -215 2
15
- 1 NTERO
TNYNT 1 0 255 NTERO
DECMAL(C, D) VARVEL -1038 10
38
- 1
DECMAL EXATO, ONDE C NDCA NMERO DE POSES E D O NMERO
DE CASAS DECMAS
NUMERC(C, D) VARVEL -1038 10
38
- 1
DECMAL EXATO, ONDE C NDCA NMERO DE POSES E D O NMERO
DE CASAS DECMAS
MONEY 8 -263 2
63
- 1 MONETRO - EQUVALE A UM DECMAL COM 4 CASAS DECMAS
SMALLMONEY 4 -231 2
31
- 1 MONETRO - EQUVALE A UM DECMAL COM 4 CASAS DECMAS
FLOAT(D) 4 OU 8 -1.79 X 10
308
1.79 X 10
308
PONTO FLUTUANTE, ONDE D NDCA O NMERO MXMO DE CASAS
DECMAS, ENTRE 0 E 53
REAL 4 -3.4 X 10
38
3.4 X 10
38
PONTO FLUTUANTE - EQUVALENTE AO FLOAT(24)
TIPOS TE?TO
$O%E TABELA
LI%ITE
=CARACTERES>
TA%A$RO
=CARACTERES>
AR%A[E$A
CHAR(N) ASC 8000 EXATAMENTE N
CARACTERES, ONDE N NDCA O TAMANHO DO
CAMPO
VARCHAR(N) ASC 8000 AT N
CARACTERES, ONDE N NDCA O TAMANHO DO
CAMPO
NCHAR(N)
UNCOD
E
4000 EXATAMENTE N
CARACTERES, ONDE N NDCA O TAMANHO DO
CAMPO
NVARCHAR(N
)
UNCOD
E
4000 AT N
CARACTERES, ONDE N NDCA O TAMANHO DO
CAMPO
TEXT ASC 2
31
- 1 AT 2
31
- 1 CARACTERES
NTEXT
UNCOD
E
2
31
- 1 AT 2
31
- 1 CARACTERES
TIPOS ATA RORA
$O%E
TA%A$RO
=B@TES>
%E$OR VALOR %AIOR VALOR PRECIS"O
DATETME 8
1753-01-01
00:00:00.000
9999-12-31
23:59:59.997
3.33 ms
SMALLDATET
ME
4 1/1/1900 00:00 6/6/2079 23:59
1 MNUTO, SENDO QUE AT 29.998ms ARREDONDA PARA
MENOS E ACMA DSSO PARA O PROXMO
&$
Captulo $ - Associan%o &abelas
R,6ras d, Cons)rain)s
As constraints so utilizadas para limitar o tipo de informao que pode ser
inserida em uma tabela, uma constraint pode ser especificada quando uma
tabela criada (com a declarao CREATE TABLE) ou aps a tabela ser
criada (com o ALTER TABLE).
Cons)rain) EGAULT
Esta +ons)rain) serve para indicar um valor padro para um campo, quando
uma declarao I$SERT no especifica o valor para a coluna. Uma omisso
de um campo no I$SERT pode atribuir um valor constante, o valor de um
sistema de funo, ou $ULL para uma coluna. Voc pode usar uma
+ons)rain) ,<aul) em qualquer coluna, exceto colunas DENTDADE e
colunas do tipo timestamp.
Cons)rain) U$IQUE
Esta constraint faz a validao de valores nicos em uma coluna de uma
tabela, o SQL Server utiliza um ndice para garantir que uma coluna ou um
conjunto de colunas no contenha valores duplicados. Diferente da PRMARY
KEY, podemos colocar vrias constraints UNQUE por tabela mas para cada
campo que possue uma constraint UNQUE somente podemos inserir o valor
NULL uma vez.
Cons)rain) CRECK
Quando criamos uma constraint do tipo CHECK o banco ir analisar os dados
quando tentarmos inserir ou modificar uma coluna. Se a expresso avaliada
para false, o banco de dados no ir salvar a nova linha ou alterao.
mplementar uma contraint check semelhante a construir uma clusula
WHERE. Podemos utilizar muito dos mesmos operadores (>, <, <=,> =, <>, =)
e mais o BETWEEN, N, LKE, e NULL. Podemos tambm utilizar expresses
com os operadores AND e OR. Assim podemos restringir a entrada de valores
em um determinado campo.
Cons)rain) PRI%AR@ KE@
A constraint PRMARY KEY identifica exclusivamente cada registro em um
banco de dados/tabela, a coluna definida como Chave primria deve conter
valores exclusivos e no pode conter valores NULOS.
Cada tabela deve ter uma chave primria, e cada tabela pode ter apenas uma
chave primria.
Cons)rain) GOREI/$ KE@
A constraint FOREGN KEY utilizada para implementar o conceito de chave
estrangeira e serve para indicar que o contedo de um campo deve
referenciar a um outro campo que possua ou uma chave primria ou uma
constraint UNQUE.
&%
Captulo $ - Associan%o &abelas
Quando o campo que est sendo referenciado residir na mesma tabela, no
precisamos uitilizar a palavra-chave FOREGN KEY, podendo somente utilizar
REFERENCES. Esta constraint tambm pode ser desabilitada, para o caso
de uma grande insero de dados na tabela.
%od,lo ,n)idad, , r,la+iona7,n)o =%ER>
O Modelo Entidade Relacionamento, foi desenvolvido pelo professor Peter Chen,
a fim de representar as estruturas de dados de uma forma mais natural e mais
prxima do mundo real dos negcios, tem seu conceito fundamentado na teoria
de modelos relacionais apresentada pelo pesquisador E.T. Codd, um modelo
abstrato cuja finalidade descrever, de maneira conceitual as informaes que
representam um determinado sistema, segundo Paulo Cougo , descreve o
mundo como "...cheio de coisas que possuem caractersticas prprias e que se
relacionam entre si.
Essas coisas podem ser pessoas, objetos, conceitos e eventos que possam ser
expressos como entidades.
O Modelo E-R propem que a realidade seja visualizada sob trs pontos de vista.
Assim, h trs conceitos fundamentais no Modelo E-R: Entidade, Atributo e
Relacionamento.
En)idad,, do latim, entitas, significa ser, existncia; algo que possui existncia
distinta e separada, real ou imaginria.
Uma entidade corresponde representao de todo e qualquer substantivo,
concreto ou abstrato, sobre o qual se precisa armazenar e/ou recuperar
informaes.
Em ingls, o conceito de entidade recebe o nome que demonstra bem o seu
significado, que "entity type, ou seja, um tipo de entidade.
Outro aspecto importante no conceito de entidade a possibilidade de
individualizao de cada um dos objetos que compem o padro.
A)ri-u)o so os elementos que definem a caracterstica de uma determinada
entidade. Uma entidade funcionrio representa um tipo, no qual so classificados
todos os funcionrios da Organizao. No entanto, cada indivduo possui
caractersticas prprias que devem ser diferenciadas, como por exemplo, o fato
de que cada funcionrio possui um nome, um salrio, um cargo, uma data de
nascimento, entre outras coisas. Essas caractersticas de mesmo tipo so
utilizadas pela Organizao para contratar, administrar, pagar e desligar os
funcionrios.
Esses tipos de caractersticas (ou tipos de informao) so denominados
a)ri-u)os de uma entidade.
Em ingls, o conceito de atributo recebe o nome de "attribute type, ou seja, um
tipo de atributo.
&&
Captulo $ - Associan%o &abelas
R,la+iona7,n)o a forma como os objetos que compem a realidade se
relacionam. Quando se reduz a realidade em objetos como entidades e seus
atributos, est se trabalhando com a parte esttica dos Negcios.
Todavia, na verdade, iremos encontrar situaes onde Clientes solicitam
Cotaes, que geram Pedidos de Vendas quando aprovadas; os Pedidos
vendem Produtos em quantidades e preos diferentes que so faturados atravs
da Nota Fiscal, que paga em parcelas pelas Duplicatas e, assim por diante, em
um fluxo dinmico.
sto mostra que os dados se relacionam entre si, indicando a prpria dinmica
dos negcios, bem como as regras e polticas que os regem. Para representar
essa dinmica, o Modelo E-R define o conceito de r,la+iona7,n)o entre as
,n)idad,s.
R,la+iona7,n)o
Obviamente, o Modelo E-R, como toda representao, no a prpria realidade,
mas foi desenvolvido para estar o mais prximo dela. Por isso, alm de
representar as relaes de posse, envolvimento, composio e gerao (entre
outras), incorporou, tambm, outro conceito para melhorar o conhecimento sobre
as polticas e regras dos Negcios.
Este conceito chamado de Cardinalidad, do R,la+iona7,n)o. um conceito
que melhora o conhecimento sobre as 'ol()i+as e r,6ras dos Negcios,
consistindo de nmeros (cardinais) colocados ao lado do nome do
relacionamento.
De acordo com a cardinalidade, existem 3 (trs) tipos bsicos de relacionamento
entre as entidades.
R,la+iona7,n)o *:*
Relacionamento On, )o On,8 * 'ara * ou *:*8 indica que u7a nica
ocorrncia de uma entidade pode se relacionar com apenas u7a nica
ocorrncia de outra entidade.
Por exemplo: em uma tabela de Convidado e outra de Conjugue, a cada um
dos convidados pode se ter apenas um conjugue, assim como cada um dos
conjugues s podem ter apenas um convidado.
R,la+iona7,n)o *:$
Para compreendermos o relacionamento de On, )o %any, u7 'ara 7ui)os,
* 'ara $ ou *:$, consideremos duas entidades A e B. Neste tipo de
relacionamento, cada elemento da entidade A pode ter um relacionamento
com vrios elementos da entidade B. Entretanto, cada um dos elementos da
entidade B pode estar relacionado a apenas um elemento da entidade A. No
mundo real, este o tipo de relacionamento mais utilizado.
&)
Captulo $ - Associan%o &abelas
Tabela Colaborador
inIdCola- v+$o7, +hS,Co d+Salario
1 Luana Maia M 1000.00
2 Andr nca M 1000.00
3 Suzana Silva F 2530.00
4 Rogrio Tecca M 1752.00
Tabela Dependente
inId,',nd inIdCola- v+$o7,,',n +hS,Co d)$as+i7,n)o
1 4 Luana Maia M 03/05/2005
2 2 Andr nca M 02/05/1998
3 1 Suzana Silva F 03/09/2001
4 1 Rogrio Tecca M 05/06/1988
Podemos observar nestas tabelas que h funcionrios com mais de um
dependente. No entanto, cada um dos dependentes est relacionado a
apenas um funcionrio.
R,6ras d, r,la+iona7,n)o *:$
Para que seja estabelecido um relacionamento de On, )o %any, u7 'ara
7ui)os, * 'ara $ ou *:$, devemos contar com duas tabelas, em que a
primeira, obrigatoriamente deve ter uma coluna que utilize uma chave
primaria, para que a mesma possa ser identificada e referenciada pela
outra tabela. Vale lembrar que colunas com a Constraint Primary Key no
aceitam valores nulos e nem repetidos.
J na tabela que representa o relacionamento para muitos, dever haver uma
coluna referente primeira tabela, a qual deve utilizar a chave estrangeira
para garantirmos que apenas valores existentes na tabela 1 possam ser
inseridos na coluna Foreign Key da tabela 2.
Devemos estar atentos ao fato de que, colunas que utilizam a chave
estrangeira aceitam a insero de valores repetidos.
R,la+iona7,n)o $:$
R,la+iona7,n)o $ 'ara $, %ui)os 'ara %ui)os (%any )o %any ou $:$)
um dos tipos de relacionamentos que se podem estabelecer entre os campos
de duas tabelas. Assim, para cada valor do campo de uma tabela, pode haver
N valores no campo da outra tabela e vice-versa.
Em bancos de dados relacionais, isto normalmente feito atravs de uma
tabela de ligao. Ela se liga a cada lado N, com relacionamento 1 para N em
cada lado. Cada possibilidade de ligao registrada isoladamente, ou seja,
ao relacionar cinco informaes de cada lado, so registradas 25 linhas na
tabela de ligao.
&7
Captulo $ - Associan%o &abelas
A chave primria desta tabela criada pela juno dos campos chaves das
tabelas interligadas.
Para compreendermos este tipo de relacionamento, tomemos como exemplo
as tabelas Aluno e Curso. Com elas, temos a seguinte situao: um aluno
pode fazer diversos cursos em um curso pode haver diversos alunos.
Vejamos a contruo e o relacionamento destas tabelas:
R,6ras d, r,la+iona7,n)o $:$
use db_aula
CREATE TABLE tb_aluno
(
inCodAluno int not null
, vcNomeAluno varchar(150)
, chSexoAluno char(1)
, dtCadastro datetime
, Constraint PK_Aluno Primary Key(inCodAluno)
, Constraint CK_SexoAluno Check(chSexoAluno in ('M','F'))
)
GO
nsert into tb_aluno values (1,'Fernando','M',getdate())
nsert into tb_aluno values (2,'Aline','F',getdate())
nsert into tb_aluno values (3,'Carlos','M',getdate())
nsert into tb_aluno values (4,'Rodrigo','M',getdate())
GO
Tabela tb_aluno
inCodAluno v+$o7,Aluno +hS,CoAluno d)Cadas)ro
1 Fernando M 03/05/2005
2 Aline M 02/05/2007
3 Carlos F 03/09/2007
4 Rodrigo M 05/06/2008
&/
Captulo $ - Associan%o &abelas
CREATE TABLE tb_curso
(
inCodCurso int not null
, vcNomeCurso varchar(150)
, chCursoAtivo char(1)
, dtCadastro datetime
, Constraint PK_Curso Primary Key(inCodCurso)
, Constraint CK_CursoAtivo Check(chCursoAtivo in ('S','N'))
)
GO
nsert into tb_curso values (1,'Matemtica','S',getdate())
nsert into tb_curso values (2,'Portugus','S',getdate())
nsert into tb_curso values (3,'Geografia','S',getdate())
nsert into tb_curso values (4,'Histria','S',getdate())
nsert into tb_curso values (6,'ngls','S',getdate())
GO
Tabela tb_curso
inCodCurso v+$o7,Curso +hCursoA)ivo d)Cadas)ro
1 Matemtica S 03/01/2005
2 Portugus S 02/01/2005
3 Geografia S 03/01/2005
4 ngls S 05/01/2005
&9
Captulo $ - Associan%o &abelas
/*Agora construiremos a tabela de relacionamento N:N*/
Create Table tb_AlunoCurso
(
inCodAluno int not null
, inCodCurso int not null
, Constraint PK_AlunoCurso Primary Key(inCodAluno, inCodCurso)
, Constraint FK_Aluno Foreign Key(inCodAluno) references tb_aluno(inCodAluno)
, Constraint FK_Curso Foreign Key(inCodCurso) references tb_curso(inCodCurso)
)
GO
nsert into tb_alunoCurso values(1,1)
nsert into tb_alunoCurso values(1,2)
nsert into tb_alunoCurso values(2,1)
nsert into tb_alunoCurso values(2,2)
nsert into tb_alunoCurso values(2,3)
nsert into tb_alunoCurso values(3,3)
nsert into tb_alunoCurso values(1,3)
nsert into tb_alunoCurso values(1,4)
Tabela tb_AlunoCurso
inCodAluno inCodCurso
1 1
1 2
2 1
2 2
2 3
3 3
1 3
1 4
)1
Captulo $ - Associan%o &abelas
Ca'()ulo V - Asso+iando Ta-,las
#OI$
Joins so operaes onde podemos retornar dados de duas ou mais tabelas, a
clausula JON indica como o Microsoft Sql Server deve utilizar o dado de uma
tabela, para selecionar dados de outra tabela.
An)i6o Es)ilo VS; $ovo Es)ilo
O T-SQL suporta dois tipos diferentes de sintaxes para joins implementado pelo
padro ANS, e nenhuma delas est em processo de depreciao ainda. Os
elementos do Join antigo so complementos do novo estilo, isto quer dizer que,
voc poder utilizar ambos, sem preocupao de o SQL Server no suportar a
sintaxe futuramente.
O estilo mais antigo foi introduzido no SQL ANS em 1989, utilizando vrgulas
para separar os nomes das tabelas aps a clusula FROM, e no existiam as
clusulas JON e ON.
EC,7'lo:
FROM tabela1, tabela2
WHERE tabela1.codigo = tabela2.codigo
O ANS SQL: 1989 tm suporte apenas para os tipos CROSS e NNER JON.
Este padro no tem suporte para OUTER JONS (Left, Right e Full).
O estilo mais novo ANS SQL: 1992, foi removido as vrgulas para separar as
tabelas e introduzido as clusulas JON e ON.
EC,7'lo:
FROM tabela1 <join_type> JON tabela2 ON <on_filtro>
WHERE where_filtro
O ANS SQL: 1992 implementou suporte para OUTER JONS, e necessitou da
implementao de filtros na clusula ON, veremos isso com mais detalhes mais a
frente.
)1
Captulo $ - Associan%o &abelas
A condio da clausula JON define a forma como duas tabelas devem ser
unidas em uma consulta.
Especificando as colunas de cada tabela para serem utilizadas para
interligao das mesmas, uma interligao tpica especificando uma
chave estrangeira de uma das tabelas, e associando-a a sua chave na
outra tabela.
Especificando um operador lgico (exemplo: =, or, <>) para ser utilizado
na comparao dos valores das colunas.
Aps a clusula FROM, devemos especificar as entidades que sero
combinadas, a seleo de linhas retornadas, ser controlada por meio de uma
ao conjunta entre as condies de associao e de busca, como HAVNG e
WHERE.
Utilizando novamente as tabelas:
Tabela Colaborador
inIdCola- v+$o7, +hS,Co d+Salario
1 Luana Maia M 1000.00
2 Andr nca M 1000.00
3 Suzana Silva F 2530.00
4 Rogrio Tecca M 1752.00
Tabela Dependente
inId,',nd inIdCola- v+$o7,,',n +hS,Co d)$as+i7,n)o
1 4 Luana Maia M 03/05/2005
2 2 Andr nca M 02/05/1998
3 1 Suzana Silva F 03/09/2001
4 1 Rogrio Tecca M 05/06/1988
)2
Captulo $ - Associan%o &abelas
Podemos realizar uma consulta para retornar o Colaborador com seus
respectivos dependentes, utilizando a instruo da seguinte forma:
SELECT * FROM tb_Colaborador AS C
JON tb_Dependente AS D
ON C.indColab = D.indColab
Observe que para os nomes de tabelas utilizamos um apelido para nos
referirmos s tabelas na clusula O!, caso o apelido no fosse criado teramos
de especificar os nomes da tabela por completo ao inv"s de utilizar apenas #$% e
#&% antes dos c'digos(
I$$ER #OI$
nner Join utilizado para combinar as linhas entre duas ou mais tabelas, com
base em alguns critrios de juno.
Uma juno interior chamada de equijoin quando as colunas so comparadas
usando o =, e as duas colunas aparecem no resultado, mostrando dados
redundantes, j que elas tm o mesmo valor. Uma juno interior chamada
juno natural quando a coluna usada para juno aparece apenas uma vez no
resultado, vinda de uma ou outra tabela.
Para o prximo exemplo, utilizaremos duas tabelas, a tabela de cliente e a tabela
de veculos, nosso objetivo ser listar todos os clientes que possuem veculos.
Tabela de Cliente
inIdCli,n)
,
v+Cli,n), v+o+u7,n)o v+E%ail d)$as+i7,n)o +hGla6A)ivo d)Cadas)ro
1 Romulo Wendell 22653229812 rWendell@trans.com.br 08/01/2000 S 06/11/2008
2 Cristina Lima 42653229812 cLima@Sunn.com.br 08/01/1985 S 06/11/2008
3 Carla Tardoche 62653229812 Ctardoche@terra.com.br 08/12/1982 S 06/11/2008
4 Wagner Sasaki 92653229812 wSasakil@tucs.com.br 05/10/2001 S 06/11/2008
5 Daniel Bo 23053229812 dBo@lumens.com.br 07/05/1985 S 06/11/2008
6 Leticia Padovani 45653229812 lePadovani@tecnet.com.br 05/07/2002 S 06/11/2008
Tabela de Veiculo
inIdV,i+ulo inIdCli,n), v+V,i+ulo +hPla+a v+Chassi v+Ano%od,lo +hGla6A)ivo
1 3 C3 DDD6872 f4gfd2hg4f6h5dd 2008/2008 S
2 5 Golf DDX6879 f4gfd564f6h5dd 2008/2008 S
3 2 Vectra ATD6878 f4gfd2hfsd6h5d 2005/2006 S
4 6 Astra DTD6856 f4gfd2hg4ffd66d 2007/2008 S
)$
Captulo $ - Associan%o &abelas
Create Table tb_Cliente
(
indCliente int identity(1,1) Not Null
, vcCliente varchar(150) Not Null
, vcDocumento varchar(11) Not Null
, vcEMail varchar(150)
, dtNascimento smalldatetime
, chFlagAtivo char(1) Not Null
, dtCadastro smalldatetime default getdate()
, Constraint Pk_cliente Primary Key (indCliente)
, Constraint UQ_vcDocumento Unique (vcDocumento)
, Constraint CK_ClienteAtivo Check (chFlagAtivo in ('S','N'))
)
GO
nsert into tb_cliente
values('Romulo Wendell', '22653229812', 'rWendell@trans.com.br','2000/08/01','S',default)
nsert into tb_cliente
values('Cristina Lima', '42653229812', 'cLima@Sunn.com.br','1985/08/01','S',default)
nsert into tb_cliente
values('Carla Tardoche', '62653229812', 'cTardoche@terra.com.br','1982/08/12','S',default)
nsert into tb_cliente
values('Wagner Sasaki', '92653229812', 'wSasakil@tucs.com.br','2001/05/10','S',default)
nsert into tb_cliente
values('Daniel Bo', '23053229812', 'dBo@lumens.com.br','1985/07/05','S',default)
nsert into tb_cliente
values('Leticia Padovani', '45653229812', 'lePadovani@tecnet.com.br','2002/05/07','S',default)
Create Table )-HV,i+ulo
(
inIdV,i+ulo int dentity(*,*) Not Null
, inIdCli,n), int
, v+V,i+ulo varchar(*BB) Not Null
, +hPla+a char(V)
, v+Chassi varchar(3B)
, v+Ano%od,lo char(\)
, +hGla6A)ivo char(*)
, d)Cadas)ro smalldatetime default getdate()
, Constraint P]HV,i+ulo Primary Key (inIdV,i+ulo)
, Constraint UQHCliV,i+ Unique (inIdV,i+ulo, InIdCli,n),)
, Constraint UQHv+Chassi Unique (v+Chassi)
, Constraint CKHV,i+uloA)ivo Check (+hGla6A)ivo in ('S','N'))
, Constraint GKHCli,n), Foreign Key (inIdCli,n),)
References )-HCli,n),(inIdCli,n),)
)GO
nsert into tb_Veiculo
values(3,'C3','DDD6872','f4gfd2hg4f6h5dd','2008/2008','S', default)
nsert into tb_Veiculo
values(5,'Golf','DDX6879','f4gfd564f6h5dd','2008/2008','S', default)
nsert into tb_Veiculo
values(2,'Vectra','ATD6878','f4gfd2hfsd6h5d','2005/2006','S', default)
nsert into tb_Veiculo
values(6,'Astra','DTD6856','f4gfd2hg4ffd66d','2007/2008','S', default)
)%
Captulo $ - Associan%o &abelas
Como podemos observar, nas tabelas acima, a coluna indCliente, aparece nas duas
tabelas, porm cada tabela tem os seus atributos, a associao entre estas tabelas,
dever ser feita atravs do cdigo comum entre as tabelas, para retornarmos todos
os clientes que possuem veiculo utilizamos a seguinte instruo:
Select C.indCliente, C.vcCliente, V.vcVeiculo, V.chPlaca, V.vcAnoModelo
From tb_Cliente as C
NNER JON tb_Veiculo as V
ON C.indcliente = V.indCliente
Order By 1
OU
Select C.indCliente, C.vcCliente, V.vcVeiculo, V.chPlaca, V.vcAnoModelo
From tb_Cliente C, tb_Veiculo V
Where C.indcliente = V.indCliente
Order By 1
Ests duas formas ser aceito pelo SQL Server, e ambas retornam o mesmo
resultado.
O resultado deste SELECT a tabela abaixo:
inIdCli,n), v+Cli,n), v+V,i+ulo +hPla+a v+Ano%od,lo
2 Cristina Lima Vectra ATD6878 2005/2006
3 Carla Tardoche C3 DDD6872 2008/2008
5 Daniel Bo Golf DDX6879 2008/2008
6 Leticia Padovani Astra DTD6856 2007/2008
Notem que os clientes de D 1 e 4 no foram listados nestas tabela, isso acontece
porque a funo do NNER JON justamente cruzar as informaes que existem
em ambas as tabelas.
)&
Captulo $ - Associan%o &abelas
LEGT #OI$
Left Join ou Left Outer Join retorna os dados referentes a duas tabelas ou mais,
mas neste caso as linhas da primeira tabela, sem correspondncia na segunda
tabela so preservadas e todos os dados da primeira tabela (esquerda), sero
apresentados.
Vejamos o exemplo abaixo utilizando as mesmas tabelas anteriores:
Select C.indCliente, C.vcCliente, V.vcVeiculo, V.chPlaca, V.vcAnoModelo
From tb_Cliente as C
Left Outer Join tb_Veiculo as V
ON C.indcliente = V.indCliente
Order By 1
inIdCli,n), v+Cli,n), v+V,i+ulo +hPla+a v+Ano%od,lo
1 Romulo Wendell NULL NULL NULL
2 Cristina Lima Vectra ATD6878 2005/2006
3 Carla Tardoche C3 DDD6872 2008/2008
4 Wagner Sasaki NULL NULL NULL
5 Daniel Bo Golf DDX6879 2008/2008
6 Leticia Padovani Astra DTD6856 2007/2008
Note que mesmo no existindo um veiculo associado ao cliente 1 e 4, os
mesmos foram retornados na consulta, e os campos da segunda tabela que no
possuem valor, so retornados com o valor NULL.
))
Captulo $ - Associan%o &abelas
RI/RT #OI$
Right Join ou Right Outer Join retorna os dados referentes a duas tabelas ou
mais, mas neste caso as linhas da segunda tabela, sem correspondncia na
primeira tabela so preservadas e todos os dados da segunda tabela (direita),
sero apresentados.
Para este exemplo, ser necessrio inserir mais alguns veculos em nossa base
de dados.
nsert into tb_Veiculo
values(null,'C4 VTR','CDX6879','f4gfd564f6h3dd','2008/2008','S', default)
nsert into tb_Veiculo
values(null,'Audi A8','FB6878','JKfd2hfsd6h5d','2005/2006','S', default)
nsert into tb_Veiculo
values(null,'New Civic','GTD6856','f4gfdfdg4ffd66d','2007/2008','S', default)
Aps a insero dos novos veiculo, reparem que os mesmos no esto
associados a nenhum inCodCliente por enquanto.
Select C.indCliente, C.vcCliente, V.vcVeiculo, V.chPlaca, V.vcAnoModelo
From tb_Cliente as C
Right Outer JON tb_Veiculo as V
ON C.indcliente = V.indCliente
Order By 1
inIdCli,n), v+Cli,n), v+V,i+ulo +hPla+a v+Ano%od,lo
NULL NULL C4 VTR
CDX68
79 2008/2008
NULL NULL Audi A8
FBI687
8 2005/2006
NULL NULL
New
Civic
GTD68
56 2007/2008
2 Ci!"i#$ Li%$ Vec"$
ATD68
78 2005/2006
& C$'$ T$d(c)e C&
DDD68
72 2008/2008
5 D$#ie' B( G('*
DDX68
79 2008/2008
6
Le"ici$
+$d(v$#i A!"$
DTD68
56 2007/2008
Note que ao contrario do Left Join a tabela conservada a tabela de veiculo,
onde possvel se ver todos os veiculo e os que ainda no possuem donos.
)7
Captulo $ - Associan%o &abelas
GULL #OI$
Full Join ou Full Outer Join retorna todos os dados referentes a duas ou mais
tabelas, quando realizamos uma consulta utilizando a clusula Full Outer Join,
todas a linhas das tabelas so retornadas. Caso uma linha de dado de uma
tabela no seja associado a linha de outra, os valores no encontrados na outra
tabela sero listados como nulos.
Select C.inIdCli,n),, C.v+Cli,n),, V.v+V,i+ulo, V.+hPla+a, V.v+Ano%od,lo
From )-HCli,n), as C
Full Outer JON )-HV,i+ulo as V
ON C.inId+li,n), = V.inIdCli,n),
Order By *
inIdClient
e vcCliente vcVeiculo
chPlac
a vcAnoModelo
NULL NULL C4 VTR
CDX687
9 2008/2008
NULL NULL Audi A8 FBI6878 2005/2006
NULL NULL New Civic
GTD685
6 2007/2008
,
R(%u'(
-e#de'' NULL NULL NULL
2 Ci!"i#$ Li%$ Vec"$
ATD687
8 2005/2006
& C$'$ T$d(c)e C&
DDD687
2 2008/2008
4 -$.#e /$!$0i NULL NULL NULL
5 D$#ie' B( G('*
DDX687
9 2008/2008
6
Le"ici$
+$d(v$#i A!"$
DTD685
6 2007/2008
Note que neste caso no necessrio se preocupar com a tabela da direita ou
esquerda, este tipo de consulta retorna todos os registros que existem nas
tabelas referenciadas.
)/
Captulo $ - Associan%o &abelas
CROSS #OI$
As consultas do tipo Cross Join geram um produto cartesiano entre os registros
de duas tabelas. Em outras palavras, o Cross Join retorna uma linha para cada
possibilidade de combinao com outra linha da outra tabela. Se a tabela da
esquerda possuir N linhas e a tabela da direita possuir M linhas. O Cross Join
retornar N x M linhas.
Em uma consulta utilizando o Cross Join, no devemos utilizar a clusula ON,
pois como o Cross Join cruza todos registros da primeira tabela, com todos os
registros da segunda tabela, no precisamos especificar uma condio de
consulta para ests tabelas.
Select C.inIdCli,n),, C.v+Cli,n),, V.v+V,i+ulo, V.+hPla+a, V.v+Ano%od,lo
From )-HCli,n), as C
Cross JON)-HV,i+ulo as V
Order By *
O7
Select C.inIdCli,n),, C.v+Cli,n),, V.v+V,i+ulo, V.+hPla+a, V.v+Ano%od,lo
From )-HCli,n), C, )-HV,i+ulo V
Order By *
)9
Captulo $ - Associan%o &abelas
R,sul)ado do Cross #oin ,n)r, as )a-,las Cli,n), , V,i+ulo:
inIdClie
nte vcCliente
vcVeic
ulo
chPlac
a
vcAnoMod
elo
,
R(%u'(
-e#de'' C&
DDD68
72 2008/2008
,
R(%u'(
-e#de'' G('*
DDX68
79 2008/2008
,
R(%u'(
-e#de'' Vec"$
ATD68
78 2005/2006
,
R(%u'(
-e#de'' A!"$
DTD68
56 2007/2008
,
R(%u'(
-e#de'' C4 VTR
CDX68
79 2008/2008
,
R(%u'(
-e#de'' Audi A8
FBI687
8 2005/2006
,
R(%u'(
-e#de''
New
Civic
GTD68
56 2007/2008
2 Ci!"i#$ Li%$ C&
DDD68
72 2008/2008
2 Ci!"i#$ Li%$ G('*
DDX68
79 2008/2008
2 Ci!"i#$ Li%$ Vec"$
ATD68
78 2005/2006
2 Ci!"i#$ Li%$ A!"$
DTD68
56 2007/2008
2 Ci!"i#$ Li%$ C4 VTR
CDX68
79 2008/2008
2 Ci!"i#$ Li%$ Audi A8
FBI687
8 2005/2006
2 Ci!"i#$ Li%$
New
Civic
GTD68
56 2007/2008
&
C$'$
T$d(c)e C&
DDD68
72 2008/2008
&
C$'$
T$d(c)e G('*
DDX68
79 2008/2008
&
C$'$
T$d(c)e Vec"$
ATD68
78 2005/2006
&
C$'$
T$d(c)e A!"$
DTD68
56 2007/2008
&
C$'$
T$d(c)e C4 VTR
CDX68
79 2008/2008
&
C$'$
T$d(c)e Audi A8
FBI687
8 2005/2006
&
C$'$
T$d(c)e
New
Civic
GTD68
56 2007/2008
4
-$.#e
/$!$0i C&
DDD68
72 2008/2008
4
-$.#e
/$!$0i G('*
DDX68
79 2008/2008
4
-$.#e
/$!$0i Vec"$
ATD68
78 2005/2006
4 -$.#e A!"$ DTD68 2007/2008
71
Captulo $ - Associan%o &abelas
/$!$0i 56
4
-$.#e
/$!$0i C4 VTR
CDX68
79 2008/2008
4
-$.#e
/$!$0i Audi A8
FBI687
8 2005/2006
4
-$.#e
/$!$0i
New
Civic
GTD68
56 2007/2008
5 D$#ie' B( C&
DDD68
72 2008/2008
5 D$#ie' B( G('*
DDX68
79 2008/2008
5 D$#ie' B( Vec"$
ATD68
78 2005/2006
5 D$#ie' B( A!"$
DTD68
56 2007/2008
5 D$#ie' B( C4 VTR
CDX68
79 2008/2008
5 D$#ie' B( Audi A8
FBI687
8 2005/2006
5 D$#ie' B(
New
Civic
GTD68
56 2007/2008
6
Le"ici$
+$d(v$#i C&
DDD68
72 2008/2008
6
Le"ici$
+$d(v$#i G('*
DDX68
79 2008/2008
6
Le"ici$
+$d(v$#i Vec"$
ATD68
78 2005/2006
6
Le"ici$
+$d(v$#i A!"$
DTD68
56 2007/2008
6
Le"ici$
+$d(v$#i C4 VTR
CDX68
79 2008/2008
6
Le"ici$
+$d(v$#i Audi A8
FBI687
8 2005/2006
6
Le"ici$
+$d(v$#i
New
Civic
GTD68
56 2007/2008
7.1. Os +o7andos UPATE , ELETE
Suponhamos que alguns dados da tabela de cliente sero alterados, ou at
mesmo, removidos com base nos dados da tabela Ordem Servio, sendo que
ambas esto relacionadas. Para realizar essa tarefa, devemos utilizar os
comandos UPDATE e DELETE com a clausula JON.
Para este exemplo utilizaremos a tabela de Cliente e Veiculo criadas
anteriormente, e criaremos uma nova tabela, a tabela OrdemServico.
inCodOS inIdV,i+ulo inIdCli,n), v+S,rvi+o d)a)aS,rvi+o d+ValorS,rvi+o
1 1 3 Troca de leo 07/11/2008 21:29 150.00
2 1 3 Troca de escapamento 07/11/2008 21:29 250.00
3 2 5 Troca de amortecedores 07/11/2008 21:30 550.00
4 4 6 Balanceamento 07/11/2008 21:30 120.00
5 3 2 Troca de Pneus P10.000 08/11/2008 21:32 2120.00
71
Captulo $ - Associan%o &abelas
6 3 2 Troca Pastilhas Freio 07/11/2008 21:33 250.00
Create Table )-HOrd,7S,rvi+o
(
inCodOS int identity not null
, inIdCli,n), int
, inIdV,i+ulo int
, v+S,rvi+o varchar(*BB)
, d)a)aS,rvi+o smalldatetime not null default getdate()
, d+ValorS,rvi+o decimal(*B,3) not null
, Constraint PKHS,rvi+o Primary Key (inCodOs)
, Constraint GKHOSCli,n), Foreign key (inIdCli,n),) References )-H+li,n),(inIdCli,n),)
, Constraint GKHOSV,i+ulo Foreign Key (inIdV,i+ulo) References )-Hv,i+ulo(inIdV,i+ulo)
)
Antes de realizarmos um Update ou Delete, vamos realizar uma S,l,01o d,
%ul)i'las Ta-,las para retornarmos apenas os dados que esto relacionados
nas trs tabelas:
Tb_Cliente
Tb_Veiculo
Tb_OrdemServico
72
Captulo $ - Associan%o &abelas
Para isso podemos fazer uso da clusula NNER JON que listar apenas o
cliente que tiver veiculo e ter efetuado algum tipo de servio.
SELECT O.inCodOS
, C.v+Cli,n),
, V.v+V,i+ulo
, O.v+S,rvi+o
8 O;dvValorS,rvi+o
, O.d)a)aS,rvi+o
FROM )-HCli,n), AS C
NNER JON )-Hv,i+ulo AS V
ON C.inId+li,n), = V.inId+li,n),
NNER JON )-Hord,7S,rvi+o AS O
ON V.inIdV,i+ulo = O.inIdV,i+ulo
AND V.inId+li,n), = O.inId+li,n),
Para este SELECT temos o resultado:
inCod
OS vcCliente
vcVeic
ulo vcServico
dcValorServ
ico dtDataServico
,
C$'$
T$d(c)e C& T(c$ de 1'e( ,50200 07/,,/2008 2,329
2
C$'$
T$d(c)e C&
T(c$ de
e!c$4$%e#"( 250200 07/,,/2008 2,329
& D$#ie' B( G('*
T(c$ de
$%("eced(e! 550200 07/,,/2008 2,3&0
4
Le"ici$
+$d(v$# A!"$ B$'$#ce$%e#"( ,20200 07/,,/2008 2,3&0
5 Ci!"i#$ Li%$ Vec"$
T(c$ de +#eu!
+,02000 2,20200 08/,,/2008 2,3&2
6 Ci!"i#$ Li%$ Vec"$
T(c$ +$!"i')$!
Fei( 250200 07/,,/2008 2,3&&
UPATE
Para exemplificar o uso do comando UPDATE, suponhamos que todos os preos
cobrados pelo servio nos veculos C3 e Vectra, tenham de ser aumentado em
10%, ento em primeiro lugar devemos conseguir encontrar todos os Clientes
com seus veculos C3 e Vectra e suas ordens de servios:
SELECT O.inCodOS
, C.v+Cli,n),
, V.v+V,i+ulo
, O.v+S,rvi+o
8 O;dvValorS,rvi+o
, O.d)a)aS,rvi+o
FROM )-HCli,n), AS C
NNER JON )-Hv,i+ulo AS V
ON C.inId+li,n), = V.inId+li,n),
NNER JON )-Hord,7S,rvi+o AS O
ON V.inIdV,i+ulo = O.inIdV,i+ulo
AND V.inId+li,n), = O.inId+li,n),
WHERE V.v+V,i+ulo like '%C3%'
OR V.v+V,i+ulo like '%Vectra%'
7$
Captulo $ - Associan%o &abelas
inCod
OS vcCliente
vcVeic
ulo vcServico
dcValorServ
ico dtDataServico
,
C$'$
T$d(c)e C& T(c$ de 1'e( ,50200 07/,,/2008 22326
2
C$'$
T$d(c)e C&
T(c$ de
e!c$4$%e#"( 250200 07/,,/2008 22326
5 Ci!"i#$ Li%$ Vec"$
T(c$ de +#eu!
+,02000 2,20200 08/,,/2008 22326
6 Ci!"i#$ Li%$ Vec"$
T(c$ +$!"i')$!
Fei( 250200 07/,,/2008 22326
Aps conseguirmos selecionar os dados corretos, devemos realizar o UPDATE,
utlizando as clusulas que nos auxiliaram a encontrar os clientes que queriamos:
UPDATE )-HOrd,7S,rvi+o
SET d+ValorS,rvi+o = d+ValorS,rvi+o * *;*
FROM )-HCli,n), AS C
NNER JON )-Hv,i+ulo AS V
ON +.inId+li,n), = v.inId+li,n),
NNER JON )-Hord,7S,rvi+o AS O
ON V.inIdV,i+ulo = O.inIdV,i+ulo
AND V.inId+li,n), = O.inId+li,n),
WHERE V.v+V,i+ulo like '%C3%'
OR V.v+V,i+ulo like '%Vectra%'
Quando executamos este cdigo a coluna dcValorServico atualizada em 10%.
inCod
OS vcCliente
vcVeic
ulo vcServico
dcValorServ
ico dtDataServico
,
C$'$
T$d(c)e C& T(c$ de 1'e( ,65200 07/,,/2008 22326
2
C$'$
T$d(c)e C&
T(c$ de
e!c$4$%e#"( 275200 07/,,/2008 22326
5 Ci!"i#$ Li%$ Vec"$
T(c$ de +#eu!
+,02000 2&&2200 08/,,/2008 22326
6 Ci!"i#$ Li%$ Vec"$
T(c$ +$!"i')$!
Fei( 275200 07/,,/2008 22326
7%
Captulo $ - Associan%o &abelas
ELETE
Assim como atualizamos um determinado valor de uma linha, podemos utilizar a
mesma idia, para excluir uma ou mais linhas da nossa tabela.
Para exemplificar suponhamos que queremos excluir as Ordens de Servio
referentes ao veiculo C3.
Selecionamos primeiramente os dados a fim de validar se os filtros e JONs esto de
acordo.
SELECT O.inCodOS
, C.v+Cli,n),
, V.v+V,i+ulo
, O.v+S,rvi+o
8 O;dvValorS,rvi+o
, O.d)a)aS,rvi+o
FROM )-HCli,n), AS C
NNER JON )-Hv,i+ulo AS V
ON C.inId+li,n), = V.inId+li,n),
NNER JON )-Hord,7S,rvi+o AS O
ON V.inIdV,i+ulo = O.inIdV,i+ulo
AND V.inId+li,n), = O.inId+li,n),
WHERE V.v+V,i+ulo like '%C3%'
inCod
OS vcCliente
vcVeic
ulo vcServico
dcValorServ
ico dtDataServico
,
C$'$
T$d(c)e C& T(c$ de 1'e( ,65200 07/,,/2008 22326
2
C$'$
T$d(c)e C&
T(c$ de
e!c$4$%e#"( 275200 07/,,/2008 22326
Aps selecionarmos os dados que desejamos apagar, utilizaremos o clusula
DELETE para realizar a excluso dos registros.
DELETE )-Hord,7S,rvi+o
FROM )-HCli,n), AS C
NNER JON )-Hv,i+ulo AS V
ON +.inId+li,n), = v.inId+li,n),
NNER JON )-Hord,7S,rvi+o AS O
ON V.inIdV,i+ulo = O.inIdV,i+ulo
AND V.inId+li,n), = O.inId+li,n),
WHERE V.v+V,i+ulo like '%C3%'
7&
Captulo ' - (nion e Sub)ue*+
Ca'()ulo ^ - Union , Su-Pu,ry
No SQL Server, podemos unir o resultado referente consulta de duas
tabelas, utilizando a execuo da instruo SELECT para cada tabela.
Neste mesmo capitulo estudaremos a utilizao de subqueries, para refinar a
consulta dos dados.
U$IO$8 U$IO$ ALL , E?CEPT
U$IO$ quando utilizamos somente a clusula U$IO$ combinamos o
resultado de duas tabelas, e o resultado no retornar dados duplicados,
ou seja, est clusula aplica tambm a funo distinct no resultado final,
assim os dados no aparecem duplicados.
U$IO$ ALL quando utilizamos a clusula U$IO$ ALL combinamos todos
os resultados da consulta das tabelas, e sero retornadas tambm linhas
duplicadas, caso a informao esteja ou fique duplicada na consulta.
E?CEPT quando utilizamos a clusula E?CEPT conseguimos identificar
as linhas que aparecem na primeira tabela, mas que no aparece na
segunda.
Para entendermos o uso das clusulas Union, Union All e Except utilizaremos as
tabelas abaixo:
Tb_cliente
inIdClie
nte vcCliente vcEMail dtCadastro
,
R(%u'(
-e#de''
-e#de''5"$#!2c(
%26
08/0,/2000
00300
2
Re#$"$
Feei$
Feei$'5!7'2c(%2
6
08/0,/2000
00300
& 8$ci$ Ri"$ Ri"$5%%c2c(%26
08/0,/2000
00300
4 9i0$ :ui0(
e:ui0(5"w(2c(%26

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

O-s,rva01o: Colunas do tipo ),C), n),C) e i7a6, no podem ser


usadas em group,b-,e*pression.
Para clusulas GROUP BY que no contm CUBE nem ROLLUP, o
nmero de itens de group,b-,e*pression limitado pelos tamanhos
da coluna GROUP BY, as colunas de agregao e os valores de
agregao envolvidos na consulta. Esse limite tem origem no limite de
8.060 bytes na tabela de trabalho intermediria que necessria para
manter resultados de consulta intermedirios. Um mximo de 12
expresses de agrupamento permitido quando CUBE ou ROLLUP
especificado.
Para compreendermos o uso da clusula GROUP BY utilizaremos o
exemplo da tabela de roupas abaixo:
inCodo
upa
vc!ipoo
upa
vcMarcao
upa
ch!amanho
oupa
in"tdo
upa
dcVal
or
,
C$'D$
=e$#! Viv$ 9'($) + 200 90200
2
C$'D$
=e$#! Viv$ 9'($) 8 &00 90200
&
C$'D$
=e$#! Viv$ 9'($) G ,00 90200
4
C$'D$
=e$#! NC**ice! + 200
,5020
0
5
C$'D$
=e$#! NC**ice! 8 &00
,5020
0
6
C$'D$
=e$#! NC**ice! G ,00
,5020
0
7
C$'D$
=e$#! Re''u! + 80
,2020
0
8
C$'D$
=e$#! Re''u! 8 ,00
,2020
0
9
C$'D$
=e$#! Re''u! G 50
,2020
0
,0 C$%i!e"$ Viv$ 9'($) + ,00 45200
,, C$%i!e"$ Viv$ 9'($) 8 200 45200
,2 C$%i!e"$ Viv$ 9'($) G 250 45200
,& C$%i!e"$ =$c$e>i#)( + 50
,2020
0
,4 C$%i!e"$ =$c$e>i#)( 8 60
,2020
0
,5 C$%i!e"$ =$c$e>i#)( G 20
,2020
0
,6 C$%i!e"$ C$v$'i#)( + 80
,4520
0
,7 C$%i!e"$ C$v$'i#)( 8 ,20
,4520
0
,8 C$%i!e"$ C$v$'i#)( G &0 ,4520
/9
Captulo , - &otali-an%o Da%os
0
,9
C$'D$
/(ci$'
Vi'$
9!4$"$#$ + 20
,&020
0
20
C$'D$
/(ci$'
Vi'$
9!4$"$#$ 8 40
,&020
0
2,
C$'D$
/(ci$'
Vi'$
9!4$"$#$ G ,5
,&020
0
22
C$'D$
/(ci$'
8$i(
Be"(''i + 60 80200
2&
C$'D$
/(ci$'
8$i(
Be"(''i 8 &0 80200
24
C$'D$
/(ci$'
8$i(
Be"(''i G 20 80200
25 T(4 G$!"$EG$!"$ + 200 ,5200
26 T(4 G$!"$EG$!"$ 8 &00 ,5200
27 T(4 G$!"$EG$!"$ G &00 ,5200
91
Captulo , - &otali-an%o Da%os
CREATE TABLE TBHRou'a(
inCodRou'a int not null identity(*,*)
, v+Ti'oRou'a varchar(*AB) not null
, v+%ar+aRou'a varchar(*AB) not null
, +hTa7anhoRou'a char(33) not null
, inQ)dRou'a int not null
, d+Valor decimal(*B,3) not null
)
/O
insert into )-Hrou'a values('Cala Jeans', 'Viva Eloah', 'P', 3BB, \B)
insert into )-Hrou'a values('Cala Jeans', 'Viva Eloah', 'M', 4BB, \B)
insert into )-Hrou'a values('Cala Jeans', 'Viva Eloah', 'G', *BB, \B)
insert into )-Hrou'a values('Cala Jeans', 'NOfficers', 'P', 3BB, *AB)
insert into )-Hrou'a values('Cala Jeans', 'NOfficers', 'M', 4BB, *AB)
insert into )-Hrou'a values('Cala Jeans', 'NOfficers', 'G', *BB, *AB)
insert into )-Hrou'a values('Cala Jeans', 'Rellus', 'P', ^B, *3B)
insert into )-Hrou'a values('Cala Jeans', 'Rellus', 'M', *BB, *3B)
insert into )-Hrou'a values('Cala Jeans', 'Rellus', 'G', AB, *3B)
insert into )-Hrou'a values('Camiseta', 'Viva Eloah', 'P', *BB, LA)
insert into )-Hrou'a values('Camiseta', 'Viva Eloah', 'M', 3BB, LA)
insert into )-Hrou'a values('Camiseta', 'Viva Eloah', 'G', 3AB, LA)
insert into )-Hrou'a values('Camiseta', 'Jacarezinho', 'P', AB, *3B)
insert into )-Hrou'a values('Camiseta', 'Jacarezinho', 'M', MB, *3B)
insert into )-Hrou'a values('Camiseta', 'Jacarezinho', 'G', 3B, *3B)
insert into )-Hrou'a values('Camiseta', 'Cavalinho', 'P', ^B, *LA)
insert into )-Hrou'a values('Camiseta', 'Cavalinho', 'M', *3B, *LA)
insert into )-Hrou'a values('Camiseta', 'Cavalinho', 'G', 4B, *LA)
insert into )-Hrou'a values('Cala Social', 'Vila Espartana', 'P', 3B , *4B )
insert into )-Hrou'a values('Cala Social', 'Vila Espartana', 'M', LB, *4B)
insert into )-Hrou'a values('Cala Social', 'Vila Espartana', 'G', *A, *4B)
insert into )-Hrou'a values('Cala Social', 'Mario Bertolli', 'P', MB , ^B )
insert into )-Hrou'a values('Cala Social', 'Mario Bertolli', 'M', 4B, ^B)
insert into )-Hrou'a values('Cala Social', 'Mario Bertolli', 'G', 3B, ^B)
insert into )-Hrou'a values('Top', 'Gasta-Gasta', 'P', 3BB, *A)
insert into )-Hrou'a values('Top', 'Gasta-Gasta', 'M', 4BB, *A)
insert into )-Hrou'a values('Top', 'Gasta-Gasta', 'G', 4BB, *A)
91
Captulo , - &otali-an%o Da%os
A partir da tabela de roupas, suponhamos que desejamos saber a quantidade
de registros em nossa tabela:
Select count(*) From tb_roupa
Est instruo retorna a quantidade de registros (linhas) que existe na tabela, neste
caso 27 linhas.
Mas ainda no estamos satisfeitos com esta informao, queremos saber a
quantidade de cada tipo de roupa que existe em nossa loja:
Select vcTipoRoupa, sum(inQtdRoupa) as Total
From tb_roupa
Group by vcTipoRoupa
Observe que o resultado foi agrupado pelo campo vcTipoRoupa
vc!ipoo
upa !otal
C$'D$
=e$#! ,4&0
C$'D$
/(ci$' ,85
C$%i!e"$ 9,0
T(4 800
Para mais um exemplo pratico, desejamos saber a quantidade de roupas
agrupadas pelas marcas:
Select vcMarcaRoupa, sum(inQtdRoupa) as Total
From tb_roupa
Group by vcMarcaRoupa
vcMarcaou
pa !otal
C$v$'i#)( 2&0
G$!"$EG$!"$ 800
=$c$e>i#)( ,&0
8$i( Be"(''i ,,0
NC**ice! 600
Re''u! 2&0
Vi'$
9!4$"$#$ 75
Viv$ 9'($) ,,50
92
Captulo , - &otali-an%o Da%os
Para tornar o exemplo um pouco mais interessante, vamos agrupar o total
pelo tipo de roupa e suas respectivas marcas:
Select vcTipoRoupa, vcMarcaRoupa, sum(inQtdRoupa) as Total
From tb_roupa
Group by vcTipoRoupa, vcMarcaRoupa
vc!ipooup
a
vcMarcao
upa !otal
C$%i!e"$ C$v$'i#)( 2&0
T(4 G$!"$EG$!"$ 800
C$%i!e"$ =$c$e>i#)( ,&0
C$'D$ /(ci$'
8$i(
Be"(''i ,,0
C$'D$ =e$#! NC**ice! 600
C$'D$ =e$#! Re''u! 2&0
C$'D$ /(ci$'
Vi'$
9!4$"$#$ 75
C$'D$ =e$#! Viv$ 9'($) 600
C$%i!e"$ Viv$ 9'($) 550
Tambm podemos apresentar como resultado o preo total das roupas,
multiplicando a quantidade total pelo seu preo:
Select vcTipoRoupa
, vcMarcaRoupa
, sum(inQtdRoupa * dcValor) as [Valor Total]
From tb_roupa
Group by vcTipoRoupa, vcMarcaRoupa
vc!ipooup
a
vcMarcao
upa
Valor
!otal
C$%i!e"$ C$v$'i#)( &&&50200
T(4 G$!"$EG$!"$ ,2000200
C$%i!e"$ =$c$e>i#)( ,5600200
C$'D$ /(ci$'
8$i(
Be"(''i 8800200
C$'D$ =e$#! NC**ice! 90000200
C$'D$ =e$#! Re''u! 27600200
C$'D$ /(ci$'
Vi'$
9!4$"$#$ 9750200
C$'D$ =e$#! Viv$ 9'($) 54000200
C$%i!e"$ Viv$ 9'($) 24750200
9$
Captulo , - &otali-an%o Da%os
Para que o resultado retorne a quantidade e o valor total, ser preciso o
mesmo procedimento do exemplo anterior:
Select vcTipoRoupa
, vcMarcaRoupa
, sum(inQtdRoupa) as Quantidade
, sum(inQtdRoupa* dcValor) as [Valor Total]
From tb_roupa
Group by vcTipoRoupa, vcMarcaRoupa
vc!ipooup
a
vcMarcao
upa
"uantida
de
Valor
!otal
C$%i!e"$ C$v$'i#)( 2&0 &&&50200
T(4 G$!"$EG$!"$ 800 ,2000200
C$%i!e"$ =$c$e>i#)( ,&0 ,5600200
C$'D$ /(ci$'
8$i(
Be"(''i ,,0 8800200
C$'D$ =e$#! NC**ice! 600 90000200
C$'D$ =e$#! Re''u! 2&0 27600200
C$'D$ /(ci$'
Vi'$
9!4$"$#$ 75 9750200
C$'D$ =e$#! Viv$ 9'($) 600 54000200
C$%i!e"$ Viv$ 9'($) 550 24750200
A +l.usula RAVI$/ +o7 /ROUP B@
A clusula Having, determina uma condio de busca, para selecionar quais
os grupos a que ser exibido no resultado. Por exemplo, para selecionar os
tipos de roupas onde o a quantidade seja maior que 200, pode-se fazer da
seguinte maneira:
Select vcTipoRoupa, vcMarcaRoupa
, Sum(inQtdRoupa) as Quantidade
, Sum(inQtdRoupa* dcValor) as [Valor Total]
From tb_roupa
Group by vcTipoRoupa, vcMarcaRoupa
Having Sum(inQtdRoupa) > 200
vc!ipooup
a
vcMarcao
upa
"uantida
de
Valor
!otal
C$%i!e"$ C$v$'i#)( 2&0 &&&50200
T(4 G$!"$EG$!"$ 800 ,2000200
C$'D$ =e$#! NC**ice! 600 90000200
C$'D$ =e$#! Re''u! 2&0 27600200
C$'D$ =e$#! Viv$ 9'($) 600 54000200
C$%i!e"$ Viv$ 9'($) 550 24750200
9%
Captulo , - &otali-an%o Da%os
Suponhamos, agora, que desejamos obter apenas aquelas cuja quantidade
ultrapasse as 200 unidades e cujos valores estocado igual ou superior a
50000,00, vejamos a instruo:
Select vcTipoRoupa, vcMarcaRoupa
, Sum(inQtdRoupa) as Quantidade
, Sum(inQtdRoupa * dcValor) as [Valor Total]
From tb_roupa
Group by vcTipoRoupa, vcMarcaRoupa
Having Sum(inQtdRoupa) > 200
And Sum(inQtdRoupa * dcValor) >= 50000
vc!ipooup
a
vcMarcao
upa
"uantida
de
Valor
!otal
C$'D$ =e$#! NC**ice! 600 90000200
C$'D$ =e$#! Viv$ 9'($) 600 54000200
9&
Captulo , - &otali-an%o Da%os
A +l.usula QITR ROLLUP +o7 /ROUP B@
A clusula WTH ROLLUP gera linhas de subtotal para cada condio exclusiva
de valores definidos EM GROUP BY. A ordem das colunas afeta os
agrupamentos de sada de ROLLUP e pode afetar o numero de linhas do
conjunto de resultado.
Para este exemplo utilizaremos a mesma tabela de roupas criada anteriormente.
Suponhamos que desejamos exibir ainda a quantidade de roupas e suas
respectivas marcas contabilizando um subtotal para cada tipo de roupa e marca,
utilizando a clusula WTH ROLLUP objetos o seguinte resultado:
Select vcTipoRoupa, vcMarcaRoupa
, Sum(inQtdRoupa) as Quantidade
, Sum(inQtdRoupa* dcValor) as [Valor Total]
From tb_roupa
Group by vcTipoRoupa, vcMarcaRoupa
With Rollup
vc!ipooup
a
vcMarcao
upa
"uantida
de
Valor
!otal
C$'D$ =e$#! NC**ice! 600 90000200
C$'D$ =e$#! Re''u! 2&0 27600200
C$'D$ =e$#! Viv$ 9'($) 600 54000200
C$'D$ =e$#! NULL ,4&0 ,7,600200
C$'D$ /(ci$'
8$i(
Be"(''i ,,0 8800200
C$'D$ /(ci$'
Vi'$
9!4$"$#$ 75 9750200
C$'D$ /(ci$' NULL ,85 ,8550200
C$%i!e"$ C$v$'i#)( 2&0 &&&50200
C$%i!e"$ =$c$e>i#)( ,&0 ,5600200
C$%i!e"$ Viv$ 9'($) 550 24750200
C$%i!e"$ NULL 9,0 7&700200
T(4 G$!"$EG$!"$ 800 ,2000200
T(4 NULL 800 ,2000200
NULL NULL &&25 275850200
Cada campo NULL apresentado nesta tabela representa a linha de total referente
a cada agrupamento, sendo que a ultima linha representa o total geral.
9)
Captulo , - &otali-an%o Da%os
A +l.usula CUBE +o7 /ROUP B@
A clusula CUBE gera linhas de subtotal para cada condio exclusiva de
valores definidos EM GROUP BY como ROLLUP e gera tambm linhas de
tabulao cruzada.
A quantidade de linhas de subtotal no conjunto de resultados especificada de
acordo com a quantidade de colunas includas na clusula GROUP BY.
Vejamos o exemplo abaixo:
Select v+Ti'oRou'a
, v+%ar+aRou'a
, +hTa7anhoRou'a
, Sum(inQ)dRou'a) as Quan)idad,
, Sum(inQ)dRou'a* d+Valor) as NValor To)alO
From )-Hrou'a
Group by v+Ti'oRou'a, v+%ar+aRou'a, +hTa7anhoRou'a
With Cube
vc!ipoo
upa
vcMarcao
upa
ch!amanho
oupa
"uantid
ade
Valor
!otal
C$'D$
=e$#!
NC**ice! G ,00
,500020
0
C$'D$
=e$#!
NC**ice! 8 &00
4500020
0
C$'D$
=e$#!
NC**ice! + 200
&000020
0
C$'D$
=e$#!
NC**ice! NULL 600
9000020
0
C$'D$
=e$#!
Re''u! G 50 6000200
C$'D$
=e$#!
Re''u! 8 ,00
,200020
0
C$'D$
=e$#!
Re''u! + 80 9600200
C$'D$
=e$#!
Re''u! NULL 2&0
2760020
0
C$'D$
=e$#!
Viv$ 9'($) G ,00 9000200
C$'D$
=e$#!
Viv$ 9'($) 8 &00
2700020
0
C$'D$
=e$#!
Viv$ 9'($) + 200
,800020
0
C$'D$
=e$#!
Viv$ 9'($) NULL 600
5400020
0
C$'D$
=e$#!
NULL NULL ,4&0
,7,6002
00
C$'D$
/(ci$'
8$i(
Be"(''i
G 20 ,600200
C$'D$
/(ci$'
8$i(
Be"(''i
8 &0 2400200
C$'D$
/(ci$'
8$i(
Be"(''i
+ 60 4800200
C$'D$
/(ci$'
8$i(
Be"(''i
NULL ,,0 8800200
C$'D$
/(ci$'
Vi'$
9!4$"$#$
G ,5 ,950200
C$'D$
/(ci$'
Vi'$
9!4$"$#$
8 40 5200200
C$'D$
/(ci$'
Vi'$
9!4$"$#$
+ 20 2600200
C$'D$
/(ci$'
Vi'$
9!4$"$#$
NULL 75 9750200
C$'D$
/(ci$'
NULL NULL ,85
,855020
0
C$%i!e"$ C$v$'i#)( G &0 4&50200
C$%i!e"$ C$v$'i#)( 8 ,20
,740020
0
C$%i!e"$ C$v$'i#)( + 80
,,60020
0
C$%i!e"$ C$v$'i#)( NULL 2&0
&&&5020
0
C$%i!e"$ =$c$e>i#)( G 20 2400200
C$%i!e"$ =$c$e>i#)( 8 60 7200200
C$%i!e"$ =$c$e>i#)( + 50 6000200
C$%i!e"$ =$c$e>i#)( NULL ,&0
,560020
0
97
Captulo , - &otali-an%o Da%os
C$%i!e"$ Viv$ 9'($) G 250
,,25020
0
C$%i!e"$ Viv$ 9'($) 8 200 9000200
C$%i!e"$ Viv$ 9'($) + ,00 4500200
C$%i!e"$ Viv$ 9'($) NULL 550
2475020
0
C$%i!e"$ NULL NULL 9,0
7&70020
0
T(4 G$!"$EG$!"$ G &00 4500200
T(4 G$!"$EG$!"$ 8 &00 4500200
T(4 G$!"$EG$!"$ + 200 &000200
T(4 G$!"$EG$!"$ NULL 800
,200020
0
T(4 NULL NULL 800
,200020
0
NULL NULL NULL &&25
2758502
00
NULL C$v$'i#)( G &0 4&50200
NULL C$v$'i#)( 8 ,20
,740020
0
NULL C$v$'i#)( + 80
,,60020
0
NULL C$v$'i#)( NULL 2&0
&&&5020
0
NULL G$!"$EG$!"$ G &00 4500200
NULL G$!"$EG$!"$ 8 &00 4500200
NULL G$!"$EG$!"$ + 200 &000200
NULL G$!"$EG$!"$ NULL 800
,200020
0
NULL =$c$e>i#)( G 20 2400200
NULL =$c$e>i#)( 8 60 7200200
NULL =$c$e>i#)( + 50 6000200
NULL =$c$e>i#)( NULL ,&0
,560020
0
NULL
8$i(
Be"(''i
G 20 ,600200
NULL
8$i(
Be"(''i
8 &0 2400200
NULL
8$i(
Be"(''i
+ 60 4800200
NULL
8$i(
Be"(''i
NULL ,,0 8800200
NULL NC**ice! G ,00
,500020
0
NULL NC**ice! 8 &00
4500020
0
NULL NC**ice! + 200
&000020
0
NULL NC**ice! NULL 600
9000020
0
NULL Re''u! G 50 6000200
NULL Re''u! 8 ,00
,200020
0
NULL Re''u! + 80 9600200
NULL Re''u! NULL 2&0
2760020
0
NULL
Vi'$
9!4$"$#$
G ,5 ,950200
NULL
Vi'$
9!4$"$#$
8 40 5200200
NULL
Vi'$
9!4$"$#$
+ 20 2600200
NULL
Vi'$
9!4$"$#$
NULL 75 9750200
NULL Viv$ 9'($) G &50
2025020
0
NULL Viv$ 9'($) 8 500
&600020
0
NULL Viv$ 9'($) + &00
2250020
0
NULL Viv$ 9'($) NULL ,,50
7875020
0
C$'D$
=e$#!
NULL G 250
&000020
0
C$'D$
/(ci$'
NULL G &5 &550200
C$%i!e"$ NULL G &00
,800020
0
T(4 NULL G &00 4500200
NULL NULL G 885
5605020
0
C$'D$
=e$#!
NULL 8 700
8400020
0
9/
Captulo , - &otali-an%o Da%os
C$'D$
/(ci$'
NULL 8 70 7600200
C$%i!e"$ NULL 8 &80
&&60020
0
T(4 NULL 8 &00 4500200
NULL NULL 8 ,450
,297002
00
C$'D$
=e$#!
NULL + 480
5760020
0
C$'D$
/(ci$'
NULL + 80 7400200
C$%i!e"$ NULL + 2&0
22,0020
0
T(4 NULL + 200 &000200
NULL NULL + 990
90,0020
0
A +l.usula #OI$ +o7 /ROUP B@
A clusula GROUP BY tambm pode ser implementada com SELECT que
implemente clusulas JONs podem assim ser retornado dados adicionais que
esto em outra tabela.
Para implementarmos o GROUP BY em conjunto com a clusula JON, vamos
criar mais uma tabela, apenas para ilustrar est outra maneira de trazer a
informao.
Aplique a alterao abaixo na tabela de roupa, para que o mesmo passe a
referenciar a nova tabela:
Alter table tb_Roupa add constraint fk_tamanho Foreign key (chTamanhoRoupa)
References tb_tamanhoRoupa(chCodTamanho)
GO
Create table tb_tamanhoRoupa(
chCodTamanho char(2)
, vcDescTamanho varchar(50)
, Constraint PK_codTamanho Primary Key (chCodTamanho)
)
GO
insert into tb_tamanhoRoupa values('P','Pequeno')
insert into tb_tamanhoRoupa values('M','Mdio')
insert into tb_tamanhoRoupa values('G','Grande')
Vamos agora realizar a consulta utilizando nossa nova tabela descrio do
tamanho da roupa:
Select vcTipoRoupa, vcMarcaRoupa, chTamanhoRoupa, t.vcDescTamanho
, Sum(inQtdRoupa) as Quantidade
, Sum(inQtdRoupa* dcValor) as [Valor Total]
From tb_roupa as r
nner join tb_tamanhoRoupa as t
on r.chTamanhoRoupa = t.chCodTamanho
Group by vcTipoRoupa, vcMarcaRoupa, chTamanhoRoupa, t.vcDescTamanho
99
Captulo , - &otali-an%o Da%os
vc!ipooup
a
vcMarcaoup
a
ch!amanho
oupa
vcDesc!am
anho
"uantid
ade
Valor
!otal
C$'D$ =e$#! NC**ice! G G$#de ,00 ,5000200
C$'D$ =e$#! NC**ice! 8 8Fdi( &00 45000200
C$'D$ =e$#! NC**ice! + +e7ue#( 200 &0000200
C$'D$ =e$#! Re''u! G G$#de 50 6000200
C$'D$ =e$#! Re''u! 8 8Fdi( ,00 ,2000200
C$'D$ =e$#! Re''u! + +e7ue#( 80 9600200
C$'D$ =e$#! Viv$ 9'($) G G$#de ,00 9000200
C$'D$ =e$#! Viv$ 9'($) 8 8Fdi( &00 27000200
C$'D$ =e$#! Viv$ 9'($) + +e7ue#( 200 ,8000200
C$'D$ /(ci$' 8$i( Be"(''i G G$#de 20 ,600200
C$'D$ /(ci$' 8$i( Be"(''i 8 8Fdi( &0 2400200
C$'D$ /(ci$' 8$i( Be"(''i + +e7ue#( 60 4800200
C$'D$ /(ci$' Vi'$ 9!4$"$#$ G G$#de ,5 ,950200
C$'D$ /(ci$' Vi'$ 9!4$"$#$ 8 8Fdi( 40 5200200
C$'D$ /(ci$' Vi'$ 9!4$"$#$ + +e7ue#( 20 2600200
C$%i!e"$ C$v$'i#)( G G$#de &0 4&50200
C$%i!e"$ C$v$'i#)( 8 8Fdi( ,20 ,7400200
C$%i!e"$ C$v$'i#)( + +e7ue#( 80 ,,600200
C$%i!e"$ =$c$e>i#)( G G$#de 20 2400200
C$%i!e"$ =$c$e>i#)( 8 8Fdi( 60 7200200
C$%i!e"$ =$c$e>i#)( + +e7ue#( 50 6000200
C$%i!e"$ Viv$ 9'($) G G$#de 250 ,,250200
C$%i!e"$ Viv$ 9'($) 8 8Fdi( 200 9000200
C$%i!e"$ Viv$ 9'($) + +e7ue#( ,00 4500200
T(4 G$!"$EG$!"$ G G$#de &00 4500200
T(4 G$!"$EG$!"$ 8 8Fdi( &00 4500200
T(4 G$!"$EG$!"$ + +e7ue#( 200 &000200
111
Captulo 1. - Compute "#
Ca'()ulo *B - Co7'u), B@
A clusula Co7'u), By nos permite exibir totais como colunas de resumo
adicionais no fim do conjunto de resultados. Podemos utilizar a clusula Co7'u),
com ou sem o By, para obtermos dados totalizados. Quando utilizamos a clusula
Compute By podemos visualizar totalizaes de dados sem o agrupamento deles.
Utilizando a tabela de roupa do capitulo 9 podemos realizar totalizaes das
quantidades de produtos da seguinte maneira:
Select v+Ti'oRou'a
, v+%ar+aRou'a
, inQ)dRou'a
From )-Hrou'a
order by v+Ti'oRou'a
Compute Sum(inQ)dRou'a) By v+Ti'oRou'a
Para esta instruo temos um resultado com 4 tabelas, pois optamos no exemplo
anterior Computar pelo tipo de roupa, logo criada uma tabela para cada tipo de
roupa, como nas imagens abaixo:
vc!ipooupa
vcMarca
oupa
in"tdoup
a
C$'D$ =e$#! Viv$ 9'($) 200
C$'D$ =e$#! Viv$ 9'($) &00
C$'D$ =e$#! Viv$ 9'($) ,00
C$'D$ =e$#! NC**ice! 200
C$'D$ =e$#! NC**ice! &00
C$'D$ =e$#! NC**ice! ,00
C$'D$ =e$#! Re''u! 80
C$'D$ =e$#! Re''u! ,00
C$'D$ =e$#! Re''u! 50
S$M
,4&0
vc!ipoo
upa
vcMarcao
upa
in"tdou
pa
C$'D$
/(ci$'
Vi'$
9!4$"$#$ 20
C$'D$
/(ci$'
Vi'$
9!4$"$#$ 40
C$'D$
/(ci$'
Vi'$
9!4$"$#$ ,5
C$'D$
/(ci$'
8$i(
Be"(''i 60
C$'D$
/(ci$'
8$i(
Be"(''i &0
C$'D$
/(ci$'
8$i(
Be"(''i 20
S$M
,85
vc!ipoo
upa
vcMarcao
upa
in"tdou
pa
C$%i!e"$ Viv$ 9'($) ,00
C$%i!e"$ Viv$ 9'($) 200
C$%i!e"$ Viv$ 9'($) 250
C$%i!e"$ =$c$e>i#)( 50
C$%i!e"$ =$c$e>i#)( 60
C$%i!e"$ =$c$e>i#)( 20
C$%i!e"$ C$v$'i#)( 80
C$%i!e"$ C$v$'i#)( ,20
C$%i!e"$ C$v$'i#)( &0
S$M
vc!ipoo
upa
vcMarcao
upa
in"tdou
pa
T(4 G$!"$EG$!"$ 200
T(4 G$!"$EG$!"$ &00
T(4 G$!"$EG$!"$ &00
S$M
800
111
Captulo 1. - Compute "#
9,0
*B;*; CO%PUTE B@ +o7 #OI$
A clusula CO%PUTE B@ tambm pode ser utilizada com a clusula JON, a fim
de se ter a associao de vrias tabelas.
Para o prximo exemplo devemos criar uma tabela de material que indicara o
tipo de material utilizado para se fazer a roupa e tambm iremos realizar algumas
alteraes na tabela de roupas.
inCodMateri
al vcMaterial
, A'.(d@(
2 +('iF!"e
& 8ic(*i6$
4 8i!"(
Create table )-H7a),rial(
inCod%a),rial int not null identity(*,*)
, v+%a),rial varchar(*AB) not null
, Constraint PKH%a),rial Primary Key (inCod%a),rial)
)
/O
insert into )-H7a),rial values('Algodo')
insert into )-H7a),rial values('Polister')
insert into )-H7a),rial values('Microfibra')
insert into )-H7a),rial values('Misto')
insert into )-H7a),rial values('Jeans')
Alter table )-Hrou'a add inCod%a),rial int
Alter table )-Hrou'a add Constraint GKH%a),rial
Foreign Key (inCod%a),rial) References )-H7a),rial(inCod%a),rial)
update )-Hrou'a
set in+od%a),rial = A
where v+)i'orou'a = 'cala Jeans'
update )-Hrou'a
set in+od%a),rial = L
where v+)i'orou'a = 'camiseta'
And in+odrou'a in(*B,**,*3)
update )-Hrou'a
set in+od%a),rial = *
where v+)i'orou'a = 'camiseta'
And in+odrou'a not in(*B,**,*3)
update )-Hrou'a
set in+od%a),rial = 4
where v+)i'orou'a = 'Cala Social'
update )-Hrou'a
set in+od%a),rial = 3
where v+)i'orou'a = 'top'
112
Captulo 1. - Compute "#
A seguir, temos um exemplo da utilizao da clusula Compute By com Join:
Select 7.v+%a),rial as %a),rial
, r.v+Ti'oRou'a as NTi'o d, Rou'aO
, r.v+%ar+aRou'a as %ar+a
, r.inQ)dRou'a as Quan)idad,
From )-Hrou'a as r
nner Join )-H7a),rial as 7
On r.in+od7a),rial = 7.in+od7a),rial
Order By 7.v+%a),rial , r.v+Ti'oRou'a
Compute Sum(inQ)dRou'a)
By 7.v+%a),rial, r.v+Ti'oRou'a
Compute Sum(inQ)dRou'a) --este Co7'u), gera um total geral
%a),rial
Ti'o d,
Rou'a %ar+a Quan)idad,
Algodo Camiseta Jacarezinho 50
Algodo Camiseta Jacarezinho 60
Algodo Camiseta Jacarezinho 20
Algodo Camiseta Cavalinho 80
Algodo Camiseta Cavalinho 120
Algodo Camiseta Cavalinho 30
SUM
360
%a),rial Ti'o d, Rou'a %ar+a Quan)idad,
Jeans Cala Jeans Viva Eloah 200
Jeans Cala Jeans Viva Eloah 300
Jeans Cala Jeans Viva Eloah 100
Jeans Cala Jeans NOfficers 200
Jeans Cala Jeans NOfficers 300
Jeans Cala Jeans NOfficers 100
Jeans Cala Jeans Rellus 80
Jeans Cala Jeans Rellus 100
Jeans Cala Jeans Rellus 50
SU%
1430
%a),rial Ti'o d, Rou'a %ar+a Quan)idad,
Microfibra Cala Social Vila Espartana 20
Microfibra Cala Social Vila Espartana 40
Microfibra Cala Social Vila Espartana 15
Microfibra Cala Social Mario Bertolli 60
Microfibra Cala Social Mario Bertolli 30
Microfibra Cala Social Mario Bertolli 20
SU%
185
%a),rial Ti'o d, Rou'a %ar+a Quan)idad,
Misto Camiseta Viva Eloah 100
Misto Camiseta Viva Eloah 200
Misto Camiseta Viva Eloah 250
SU%
550
%a),rial Ti'o d, Rou'a %ar+a Quan)idad,
Polister Top Gasta-Gasta 200
Polister Top Gasta-Gasta 300
Polister Top Gasta-Gasta 300
SU%
800
SU%
443A
11$
Captulo 1. - Compute "#
R,su7indo dados usando CO%PUTE , CO%PUTE B@
Os valores resumidos, gerados por COMPUTE, aparecem como conjuntos de
resultados distintos nos resultados da consulta. O resultado de uma consulta que
incluem uma clusula COMPUTE so como um relatrio de control-break. Trata-
se de um relatrio cujos valores de resumo so controlados pelos agrupamentos
ou quebras especificados.# Voc pode produzir valores resumidos para grupos e
tambm calcular mais de uma funo de agregao para o mesmo grupo.
Quando COMPUTE especificada com a clusula BY opcional, h dois
conjuntos de resultados para cada grupo qualificado para SELECT:
O primeiro conjunto de resultados de cada grupo possui o conjunto de
linhas de detalhe que contm as informaes da lista de seleo para
aquele grupo.
O segundo conjunto de resultados de cada grupo possui uma linha que
contm os subtotais das funes de agregao especificadas na clusula
COMPUTE daquele grupo.
Quando COMPUTE especificada sem a clusula BY opcional, h dois
conjuntos de resultados para SELECT:
O primeiro conjunto de resultados de cada grupo tem todas as linhas
de detalhe que contm as informaes da lista selecionada.
O segundo conjunto de resultados possui uma linha que contm os
totais das funes de agregao especificadas na clusula COMPUTE.
11%
Captulo 1. - Compute "#
As di<,r,n0as ,n)r, CO%PUTE , /ROUP B@
CO%PUTE produz diversos grupos de resultados. Um tipo de conjunto de
resultado contm as linhas de detalhes de cada grupo que contm as
expresses da lista selecionada. O outro tipo de conjunto de resultados
contm o subagregado de um grupo ou o agregado total da instruo
SELECT. A lista selecionada pode conter outras expresses alm das
colunas de agrupamento ou funes de agregao. As funes de agregao
so especificadas na clusula COMPUTE; no na lista de seleo.
/ROUP B@ produz um grupo de resultados nico. H uma linha para cada
grupo que contm apenas as colunas de agrupamento e funes de
agregao que mostram a subagregao daquele grupo. A lista selecionada
pode conter apenas as colunas de agrupamento e funes de agregao.
O-s; Voc no poder incluir tipos de dados n),C), ),C) ou i7a6, em uma
clusula COMPUTE ou COMPUTE BY.
11&
Captulo 11 &abelas
Ca'()ulo ** E Ta-,las
Todas as informaes do banco de dados SQL Server so armazenados em
tabelas. Geralmente, os dados so armazenados em tabelas permanentes; porm,
voc tambm pode criar tabelas temporrias.
Ta-,la ',r7an,n),
Podemos dizer que uma tabela permanente quando ela continuar existindo
mesmo que seja encerrada a conexo na qual ela foi criada.
Suponhamos que desejamos criar uma nova tabela de roupa que utilizamos no
exemplo anterior no capitulo 10. Para isso, podemos criar executando a seguinte
instruo:
Select * nto )-H'rodu)o From )-Hrou'a
Ta-,la ),7'or.ria /lo-al
Tabelas temporrias so similares a tabelas permanentes, exceto por serem
armazenadas no ),7'd- e excludas automaticamente quando no so mais
usadas.
H dois tipos de tabelas temporrias: lo+al e 6lo-al. Elas diferem uma da outra
pelo nome, visibilidade e disponibilidade. As tabelas temporrias locais tm um
nico sinal numrico (#) como primeiro caractere no nome; elas so visveis
somente na conexo atual para o usurio e so excludas quando o usurio se
desconecta da instncia do SQL Server. As tabelas temporrias globais tm dois
sinais numricos (##) como primeiros caracteres no nome; elas so visveis a
qualquer usurio aps serem criadas e so excludas quando todos os usurios
que consultam a tabela se desconectam da instncia do SQL Server.
Exemplo de tabela temporria local
Select * nto c)-H'rodu)o From )-Hrou'a
Exemplo de tabela temporria global
Select * nto cc)-H'rodu)o From )-Hrou'a
11)
Captulo 1/ Case
Ca'()ulo *3 E Cas,
A +l.usula CASE
As informaes pertencentes a uma tabela podem ser testadas por meio da
clusula CASE em conjunto com uma instruo SELECT. Est clusula muito
utilizada para controlarmos os resultados de uma consulta. Para exemplificar
utilizaremos a seguinte tabela de cliente:
inCod%cl
i vcNome%cli
chSexo
%cli
,
A#de
8(6i'e"e 8
2 Ti$.( A6$#( NULL
&
8(#ic$
8e#de! F
4 Lui! C$'(! 8
5
Re#$"$
F$#D$ F
create table )-H+li,n),
(
inCodH+li int identity
, v+$o7,H+li varchar(4B)
, +hS,CoH+li char(*)
)
/O
insert into )-H+li,n), values('Andre Mobilete', 'M')
insert into )-H+li,n), values('Tiago Abano', Null)
insert into )-H+li,n), values('Monica Mendes', 'F')
insert into )-H+li,n), values('Luis Carlos', 'M')
insert into )-H+li,n), values('Renata Frana', 'F')
Aps criarmos a nova tabela de cliente iremos selecionar todos os campos, mas
o campo sexo dever ser apresentado como Masculino ou Feminino.
Vejamos o exemplo do SELECT
Select inCodH+li as Codi6o
, v+$o7,H+li as Cli,n),
, S,Co = Case +hS,CoH+li
when 'M' then 'Masculino'
when 'F' then 'Feminino'
Else 'No Saber'
End
From )-H+li,n),
O resultado desta seleo a tabela abaixo:
Codi
go Cliente Sexo
, A#de 8(6i'e"e 8$!cu'i#(
2 Ti$.( A6$#( N@( /$6e
117
Captulo 1/ Case
& 8(#ic$ 8e#de! Fe%i#i#(
4 Lui! C$'(! 8$!cu'i#(
5 Re#$"$ F$#D$ Fe%i#i#(
11/
"0"L0!1RA20CA "3S0CA
BIBLIO/RAGICA B&SICA
Livros:
BATST, Julio. SQL SERVER 2005 Administrao e Desenvolvimento: Curso
Completo. So Paulo, Axcel Books: 2005.
DAMAS, Lus. SQL: Structured Query Language. 6 ed. So Paulo, LTC: 2007.
Paul Wilton and John W. Colby, Beginning SQL, Published by Wiley Publishing, nc.
Apostila SQL Server 7.
Si),s:
http://www.mhavila.com.br/link/db/sql.html
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=4832
http://www.linhadecodigo.com.br/Artigo.aspx?id=669
http://www.50minutos.com.br/2007/05/datatypes-do-sql-server/
http://www.odetocode.com/Articles/79.aspx
http://www.shammas.eng.br/acad/materiais/mer.pdf
http://pt.wikipedia.org/wiki/Modelo_de_Entidades_e_Relacionamentos
http://msdn.microsoft.com/pt-br/library/ms190452.aspx
http://msdn.microsoft.com/pt-br/library/ms177399.aspx
119

You might also like