You are on page 1of 27

Instituto de informtica

Disciplina:
Banco de Dados I
Linguagem SQL
Professor:
Gustavo Belgini Andretta
ndice
ndice_______________________________________________________________________________2
Linguagem SQL_______________________________________________________________________3
Notao para Sintaxes_______________________________________________________________________3
Tabelas, Colunas e Linhas______________________________________________________________
! Banco de "ados #$em%lo_____________________________________________________________&
Linguagem de 'ani%ula()o de "ados *nterativa +"'L,______________________________________-
SELEC__________________________________________________________________________________!
Eliminao de linhas duplicadas________________________________________________________________________7
Constantes e Expresses______________________________________________________________________________8
Condies de Procura________________________________________________________________________________8
Predicados Relacionais_______________________________________________________________________________
Predicado !et"een__________________________________________________________________________________
Predicado #$%%___________________________________________________________________________________&'
Predicado %I(E___________________________________________________________________________________&'
Predicado Exists___________________________________________________________________________________&&
Predicado I#______________________________________________________________________________________&&
$tili)ando mais de uma ta*ela na clusula from__________________________________________________________&+
Cha,es___________________________________________________________________________________________&-
.ari,eis /uplas___________________________________________________________________________________&0
1peraes de Con2untos_____________________________________________________________________________&0
Exi*indo Resultados 1rdenados_______________________________________________________________________&3
4unes de a5re5ao_______________________________________________________________________________&3
6 Clusula 76.I#8_______________________________________________________________________________&7
Consultas Complexas_______________________________________________________________________________&8
.un(/es Built0in_____________________________________________________________________12
"un#es para manipulao de strings__________________________________________________________$%
"un#es para manipulao de n&meros________________________________________________________'(
"un#es para manipulao de datas___________________________________________________________'(
"un#es de con)erso_______________________________________________________________________'$
'odi3icando o Banco de "ados_________________________________________________________22
Inserindo Lin*as: INSE+__________________________________________________________________''
+emo)endo Lin*as: DELEE________________________________________________________________'3
,odi-icando Lin*as: ./D0E_______________________________________________________________'3
*ntrodu()o a ""L 0 Linguagem de "e3ini()o de "ados______________________________________2&
a1elas 2a1les3 4 Criando5 0lterando e Excluindo_______________________________________________'6
7is#es 27ie8s3_____________________________________________________________________________'9
:ndices 2Indexes3___________________________________________________________________________'9
Banco de "ados * 4 5ro6eto de Banco de "ados
Linguagem SQL
SQL 9Structured Query Language: trata;se de um con2unto completo de comandos <ue permite ao usurio
acessar um *anco de dados relacional= > uma lin5ua5em no procedural <ue permite di)er apenas o <ue
,oc? <uer e no como fa)er isto=
6 lin5ua5em SQL sur5iu no in@cio do anos 7' como parte do pro2eto ABstem RC no la*oratDrio de pes<uisa
da I!E em Aan Fose= Inicialmente foi chamada de Ae<uel= Ela sur5iu com o intuito de fornecer ao
GusurioH 9ou desen,ol,edor: uma interface mais ami5,el com os *ancos de dados= 1*te,e 5rande
sucessoC sendo <ue a maioria dos 5erenciadores de *ancos de dados atuais a utili)am=
Em*ora existam inImeras ,erses do SQLC e cada produto utili)a umaC pode;se di)er <ue as diferenas
che5am a ser secundriasC pois o nIcleoC ou se2aC os principais comandos mantJm o mesmo padro= Em
&83C o 6merican #ational Atandart Intitute 96#AI: pu*licou um primeiro padro SQLC e 5randes
esforos ,em sendo tomados para <ue o padro 6#AI se2a cada ,e) mais o*edecido= 6 primeira 5rande
re,iso do padro AK% foi completa em &+C rece*endo a denominao de SQL2=ContudoC uma no,a
reformulaoC 2 chamada de SQL3C <ue incluir tam*Jm o suporte a o*2etosC est em ,ias de ser
completada=
6 SQL esta*eleceu;se claramente como a lin5ua5em padro de *ancos de dados= 6l5uns di)em <ue SQL J
uma lin5ua5em de consultaC entretantoC o seu propDsito inicial foi ampliado e ela permite uma interao
completa com o *ancoC desde a atuali)ao de dadosC criao de ta*elas atJ a administrao da *ase de
dados=
Podemos di,idir a lin5ua5em em al5uns mDdulos= Ao eles:
L "ata de3inition language +""L, 9%in5ua5em de definio de dados:: 6 SQL fornece comandos
para definioC modificao e remoo de ta*elasC criao de @ndicesC definio de ,ises= Inclui
tam*Jm comandos para especificao de direitos de acessos a ta*elas e ,ises=
L *nteractive data mani%ulation language +"'L, 9%in5ua5em de manipulao de dados interati,a::
6 SQL DML inclui uma lin5ua5em de consulta *aseada na l5e*ra relacional e no clculo
relacional de tuplas 9linhas:= Possui tam*Jm comandos para inserirC remo,er e modificar linhas
num *anco de dados=
L *ntegrit7 9Inte5ridade:: 6 SQL possui comandos para se especificar restries de inte5ridadeC como
cha,es primrias e cha,es estran5eiras=
L Transaction control 9Controle de /ransaes:: 6 SQL inclui comandos para especificao de in@cio
e fim de transaesC ,isando a inte5ridade dos dados no momento em <ue ocorrem atuali)aes=
6 lin5ua5em SQL pode ser utili)ada de duas maneiras diferentes:
L Interati,amente atra,Js de um pro5rama <ue fa) a interface com o *anco de dados= Por exemploC
utili)ando o SQLPlus do Oracle= Ele se encarre5a de manter a conexo com o *anco e o usurio
entra com as instrues SQLC rece*endo as respostas imediatamenteM ou
L Em*utida numa aplicao utili)ando uma lin5ua5em de pro5ramao comumC como PascalC CC
Centura BuilderC Delphi ou Visual BasicC etc=
#esta apostilaC particularmenteC daremos ?nfase N DML=
Notao para Sintaxes
#esta apostila utili)amos uma con,eno para descre,er as sintaxes de al5uns comandos e clusulas=
$tili)aremos o comando insert para explicar a notao:
insert into <nome da tabela> | (<C1, C2 ... Cn>) | values (< V1, V2 ... Vn >)
1s s@m*olos GOH 9menor: e GPH 9maior: indicam <ue de,emos su*stituir a frase de indicao por uma
string ,lida para o comando SQL= $tili)ando o exemploC poder@amos su*stituir Onome da ta*elaP por
4$#CI1#6RI1=
GEEK BRASIL http://www.geekbrasil.com.br -
Banco de "ados * 4 5ro6eto de Banco de "ados
Kuando encontrarmos uma lista do tipo: C&CC+ === CnC isto indica <ue de,e;se trocar esta se<Q?ncia
sim*Dlica por uma se<Q?ncia de colunas ou ,aloresC dependendo do caso= C&C C+ === CnC se5uindo o
exemploC poderia ser trocada pelas colunas da ta*ela 4$#CI1#6RI1C ou se2aC C1R_4$#CI1#6RI1C
#1EEC R8C etc=
!locos de comandos limitados pelo s@m*olo GSH 9pipe: so opcionaisC ou se2aC podem ser omitidos sem
in,alidar a expresso= #este casoC a se<Q?ncia C&C C+ === Cn pode ser omitida por estar entre pipes: S 9OC&C
C+ === CnP: S =
6s outras pala,ras <ue no se encontram entre GO PH ou entre GS SH so o*ri5atDrias 9pala,ras cha,es := 6s
pala,ras insertC into e )aluesC neste casoC so pala,ras;cha,es=
Tabelas, Colunas e Linas
#os *ancos de dados relacionaisC os dados so arma)enados em relaes ou ta*elas= $m exemplo de
ta*ela poderia conter os dados *sicos dos setores de uma empresaC como seu CDdi5o e seu #ome=
/a*ela de Aetores
CDdi5o e #omeC <ue no Eodelo Entidade;Relacionamento 9EER: nDs chamamos de atri*utosC a<ui so
denominados colunas=
$ma linha J a denominao dada a cada instTncia arma)enada na ta*ela de AetoresC ou se2aC 9&''C .endas:
constitui uma linha ou re5istro=
Ra mesma forma <ue os dados so arma)enadosC o resultado de um comando de consulta AK%C tam*Jm J
o*tido so* a forma de ta*elasC ou se2aC um con2unto de linhas e colunas=
1 *anco de dados utili)ado para a construo dos exemplos citados nesta apostila foi desen,ol,ido a
partir do exemplo GControle de Esto<ueH mostrado a se5uir atra,Js do seu Pro2eto Conceitual 9Ria5rama
de Entidades e Relacionamentos: e correspondente dia5rama de ta*elas=
GEEK BRASIL http://www.geekbrasil.com.br 0
Banco de "ados * 4 5ro6eto de Banco de "ados
! "anco de #ados $%em&lo
/odos os exemplos desta apostila esto *aseados num *ancos de dados exemploC <ue se prope a
arma)enarC simplificadamenteC os dados de um controle de esto<ue=
6 se5uirC temos o seu Eodelo de Entidade;Relacionamento 9EER:C se5uido pelo seu Ria5rama de
/a*elas 9ou Ria5rama Relacional:=
GEEK BRASIL http://www.geekbrasil.com.br U
Banco de "ados * 4 5ro6eto de Banco de "ados
GEEK BRASIL http://www.geekbrasil.com.br 3
Banco de "ados * 4 5ro6eto de Banco de "ados
Linguagem de 'ani&ula()o de #ados *nterativa (#'L)
Como citado anteriormenteC esta poro da lin5ua5em SQL cuida de fornecer aos usurios comandos e
funes para a recuperao de informaesC *em como a atuali)ao destas no *anco de dados=
6 instruo utili)ada para consultas na *ase de dados J a selectC en<uanto para atuali)aes so utili)adas
as instrues insertC para insero de linhasC deleteC para remoo de linhasC e updateC para alteraes nas
linhas=
SELECT
6 estrutura *sica da instruo de consulta select consiste em tr?s clusulas:
L select: > usada para listar os atri*utos dese2ados no resultado da consultaC ou se2aC as colunas
re<uisitadas como respostas=Esta listaC alJm de nomes de colunasC pode conter:
L um asterisco 9V:C indicando <ue todas as colunas de,em ser retornadasM
L expressesM
L constantesM
L funesM
L <ual<uer com*inao destesC conectadas por operadores aritmJticos e par?nteses=
L -rom: %ista as ta*elas a serem examinadas na a,aliao da expresso=6s colunas indicadas na
clusula select de,em constar nas ta*elas listadas nesta clusula=
L 8*ere: Consiste de uma condio de procura en,ol,endo atri*utos das ta*elas <ue aparecem na
clusula -rom= > o lu5ar onde se restrin5e ou seleciona <uais linhas de,ero ser retornadas=
$ma consulta t@pica SQL tem a forma:
select < A! A"! ...! A# $
+rom < R! R"! ...! R# $
% ,ere & %
onde:
L 6i : representa uma coluna 9atri*uto: de uma ta*ela RiC uma expressoC constante ou funoM
L Ri : representa uma ta*elaM
L P : uma condio de procura <ue utili)a os atri*utos de R&C ===C Rn=
6 clusula 8*ere pode ser omitidaM neste casoC o predicado J tido como sempre ,erdadeiro e todas as
linhas sero retornadas=
6 lista de colunas na clusula select 96&C ==C 6n: pode ser su*stitu@da por um asterisco 9V: para selecionar
todos os atri*utos de todas as ta*elas presentes na clusula -rom;
Considerando uma simples consulta ao *anco de dados exemplo: GKuais os cDdi5os de todos os
funcionrios <ue fi)eram al5uma re<uisio ao esto<ue WHM a instruo correspondente ser:
select '()*+,-'I(-ARI(
+rom RE.,ISI'A(
Elimi#a/0o 1e li#has 12plica1as
#o exemplo anteriorC caso um funcionrio ti,esse feito mais de uma re<uisioC o cDdi5o dele teria
aparecido mais de uma ,e) na resposta dada pelo 5erenciador de *anco de dados= EntretantoC a eliminao
de linhas repetidas ou duplicadas J poss@,el utili)ando a pala,ra;cha,e distinct depois de select= Ento
podemos reescre,er a consulta anterior da se5uinte maneira:
GEEK BRASIL http://www.geekbrasil.com.br 7
Banco de "ados * 4 5ro6eto de Banco de "ados
select distinct '()*+,-'I(-ARI(
+rom RE.,ISI'A(
#ota;se <ue J permitido o uso da pala,ra;cha,e all para especificar explicitamente <ue as duplicaes no
sero remo,idas= $ma ,e) <ue a deteno das duplicaes J o padroC o uso pala,ra;cha,e all pode ser
omitido= 6*aixo se5ue um exemplo utili)ando all:
select all '()*+,-'I(-ARI(
+rom RE.,ISI'A(
'o#sta#tes e E3press4es
Como citado anteriormenteC a lista da clusula select tam*Jm pode conter constantes e expresses=
Exemplo utili<ando constante:
select '()*RE.,ISI'A(! 51ata1a 1e6! )A7A
+rom RE.,ISI'A(
6s constantes utili)adas na clusula selectC alJm de stringsC podem ser de <uais<uer outros tiposC tais
como nImerosC datasC etc=
Exemplo utili<ando expresso:
select '()*RE.,ISI'A(! 8 .7)E / .7)E*9I-I9A : / ;;
+rom &R(),7(
$ma expresso pode conter uma com*inao de par?nteses e das <uatro operaes aritmJticas *sicas:
L adio 9X:
L su*trao 9;:
L multiplicao 9V:
L di,iso 9Y:
'o#1i/4es 1e &roc2ra
$ma condio de procura na clusula 8*ere <ualifica o escopo de um consultaC pois especifica as
condies particulares <ue de,em ser encontradas= 6 clusula 8*ere pode ser usada nas instrues selectC
deleteC update=
Cada condio de procura contJm um ou mais predicados conectados por operadores lD5icos orC andC e
notC conforme o exemplo:
,ere (not -1 and -2) and -. or -/
onde: Pi so predicados da clusula 8*ere=
6 se5uinte ordem de preced?ncia J utili)ada ao a,aliar uma expresso numa condio:
&= Primeiro so analisados as expresses dentro de par?ntesesM
+= 1 operador not J analisado antes do andM
-= 0nd antes do orM
0= 1peradores do mesmo n@,el de preced?ncia so analisados da es<uerda para a direita=
$tili)ando a re5ra de preced?nciaC a ordem de a,aliao dos predicadosC do exemplo anteriorC ser:
&= R& Z not P&
GEEK BRASIL http://www.geekbrasil.com.br 8
Banco de "ados * 4 5ro6eto de Banco de "ados
+= R+ Z R& and P+
-= R- Z R+ and P-
0= R0 Z R- or P0
1nde:
Ri trata;se um resultado *ooleano intermedirio=
Predicados usam operadoresC expressesC e constantes para especificar a condio a ser a,aliada=
1s se5uintes tipos de predicados sero discutidos:
L Relacionais
L BETWEE
L !LL
L L"#E
L E$"STS
L "
&re1ica1os Relacio#ais
1s predicados relacionais so a<ueles <ue relacionam duas expresses se5undo um operador= 1s
se5uintes operadores so suportados:
!&erador 0igni+icado
< Ig2al
=< )i>ere#te
<$ )i>ere#te
$ 9aior
=$ -0o maior 8me#or o2 ig2al :
< 9e#or
=< -0o me#or 8maior o2 ig2al :
$< 9aior o2 ig2al
<< 9e#or o2 ig2al
$m predicado relacional se5ue a se5uinte sintaxe: =expresso> =operador> =expresso>=
%o5o a*aixo encontra;se um exemplo utili)ando operadores relacionais= #este exemploC <ueremos
o*ter todos os dados dos funcionrios cu2os salrios so maiores ou i5uais a R[ &='''C'''=
select ?
+rom +,-'I(-ARI(
,ere SALARI( $< ;;;
%em*re <ue o uso do asterisco 9V: na clusula select indica o dese2o de <ue todas as colunas se2am
retornadas=
&re1ica1o Betwee#
1 predicado 1et8een compara um ,alor com uma faixa de ,alores= 1s limites da faixa esto
inclusos= Ele possui a se5uinte sintaxe:
<e%&ress)o> | not | bet,een <e%&ress)o> and <e%&ress)o>
1 exemplo se5uinte mostra uma instruo usando 1et8een:
GEEK BRASIL http://www.geekbrasil.com.br
Banco de "ados * 4 5ro6eto de Banco de "ados
select )ES'RI'A(
+rom &R(),7(
,ere &RE'( bet,een @; and ;;
#este exemploC recuperamos todas as descries de produtosC cu2os seus preos esto entre R[
U'C'' e R[ &''C''=
&re1ica1o -,LL
1 predicado N.LL testa ,alores nulos= .erificaC por exemploC se colunas no contJm nenhum
,alor arma)enado= Ele possui a se5uinte sintaxe:
<nome da coluna> is | not | 12LL
Caso se2a necessrio conhecer os funcionrios cu2o cadastro do endereo este2a faltandoC
utili)ar@amos a se5uinte instruo:
select '()*+,-'I(-ARI(!
-(9E
+rom +,-'I(-ARI(
,ere E-)ERE'( is 12LL
> poss@,el utili)ar o operador not 2untamente com a pala,ra;cha,e is 9is not N.LL: paraC por
exemploC montar condies de colunas <ue no possuem ,alores nulos=
&re1ica1o LIKE
1 predicado %I(E procura por strin5s <ue se encontram dentro de um determinado padro= 1
predicado %I(E sD pode ser usado com tipos de dados C76R e .6RC76R=
6 sintaxe para o predicado J se5uinte:
<nome da coluna> | not | li3e < &adr)o de &es4uisa >
1 padro de pes<uisa trata;se de uma strin5 a ser comparada com a coluna especificada= Este
padro pode ser formatado com a utili)ao de corin5asC permitindo a procura de su*strin5s= 1s
dois caracteres corin5as existentes so o s@m*olo porcenta5em \]^ e o undescore \_^=
A EB2iCale a Dero o2 mais caracteres
* EB2iCale a 2m caracter B2alB2er
1s exemplos a*aixos mostram a utili)ao do predicado %I(E:
L .erificar todos os funcionrios <ue possuem GAil,aH como Iltimo so*renome=
select ?
+rom +,-'I(-ARI(
,ere -(9E li3e 5ASilCa6
L Retornar todos os cDdi5os das re<uisies dos produtos <ue os cDdi5os comecem com \'&^=
select '()*RE.,ISI'A(
+rom I7E-S*RE.,ISI'A(
,ere '()*&R(),7( li3e 5;A6
L .erificar todos os produtos onde na descrio aparece a pala,ra \couro^=
GEEK BRASIL http://www.geekbrasil.com.br &'
Banco de "ados * 4 5ro6eto de Banco de "ados
select ?
+rom &R(),7(
,ere )ES'RI'A( li3e 5Aco2roA6
L Retornar todos os funcionrios cu2o o nome possui uma das preposies: deC do ou da=
select ?
+rom +,-'I(-ARI(
,ere -(9E li3e 5A 1* A6
&re1ica1o E3ists
> utili)ado para testar se o con2unto de linhas resultantes de uma consulta J ,a)io= Aintaxe:
| not | e%ists < subselect >
1 exemplo se5uinte mostra a utili)ao do predicado exists= #este caso dese2amos todos os nomes
de funcionrios <ue tenham feito pelo menos uma re<uisio= Para fa)ermos istoC utili)amos a
se5uinte lD5ica: para cada funcionrio em 4$#CI1#6RI1C pes<uisamos em REK$IAIC61 se ele
re<uisitou al5o=
select -(9E
+rom +,-'I(-ARI(
,ere e%ists
( select ?
+rom RE.,ISI'A(
,ere +,-'I(-ARI(.'()*+,-'I(-ARI( <
RE.,ISI'A(.'()*+,-'I(-ARI( )
&re1ica1o I-
1 predicado in compara um ,alor com um con2unto de ,alores= Este con2unto de ,alores pode ser
uma lista ou o resultado de um su*select= Aintaxe:
<e%&ress)o> | not | in < subselect >
ou
<e%&ress)o> | not | in < lista de valores >
1s se5uintes exemplos demonstram o uso do predicado in:
L Aelecionar todos os dados dos funcionrios <ue no possuem os cDdi5os: &&C +' e +&=
select ?
+rom +,-'I(-ARI(
,ere '()*+,-'I(-ARI( not in 8!";!":
L Aelecionar todas as re<uisies reali)adas por funcionrios <ue rece*em salrios superiores a
R[ &'''C''=
select ?
+rom RE.,ISI'A(
,ere '()*+,-'I(-ARI( in
8 select '()*+,-'I(-ARI(
+rom +,-'I(-ARI(
,ere SALARI( $ ;;;:
GEEK BRASIL http://www.geekbrasil.com.br &&
Banco de "ados * 4 5ro6eto de Banco de "ados
,tiliDa#1o mais 1e 2ma tabela #a clE2s2la >rom
#os exemplos <ue discutimos atJ o presente momentoC sD utili)amos uma ta*ela na clusula -romC ou
se2aC pes<uisamos apenas em uma ta*ela indi,idualmente= EntretantoC na maioria dos casosC precisaremos
com*inar e recuperar dados de di,ersas ta*elas simultaneamente= Para conse5uirmos istoC de,emos
relacionar na clusula -rom todas as ta*elas necessrias=
Caso fosse necessrio selecionarC por exemploC todos os funcionrios 9cDdi5o e nome: e seus respecti,os
setores 9cDdi5o e nome: seria preciso extrair dados de duas ta*elas: 4$#CI1#6RI1A e AE/1REAC pois
o cDdi5oC nome e cDdi5o do setor do funcionrio poderia ser extra@do da ta*ela 4$#CI1#_RI1AC mas o
nome do setor apenas da ta*ela setor= Resta maneira a instruo seria a se5uinte:
select '()*+,-'I(-ARI(!
+,-'I(-ARI(.-(9E!
+,-'I(-ARI(.'()*SE7(R!
SE7(R.-(9E
+rom +,-'I(-ARI(!
SE7(R
,ere +,-'I(-ARI(.'()*SE7(R < SE7(R.'()*SE7(R
6 lin5ua5em utili)a;se de um mJtodo chamado produto cartesiano para resol,er esta <uesto= 1 produto
cartesiano de ta*elasC 5era uma no,a ta*ela auxiliar contendo todas as colunas de todas as ta*elas listadas
na clusula -romC relacionando cada linha de uma ta*ela com todas as outras da se5unda ta*elaC e assim
por dianteC 5erando uma 5rande ta*ela <ue possui todas as com*inaes de linhas posss@,eis=
Para discutirmos melhor este mJtodo ima5inemos <ue as nossas ta*elas 4$#CI1#6RI1 e AE/1R
ti,essem os se5uintes dados:
".NCI?N0+I?:
C?D_".NCI?N0+I? N?,E C?D_SE?+ ?utras Colunas
&' 6ndrJ Pires &'' nononononononononon
&& Ro*erto 6)e,edo &'' nononononononononon
+' Carla Campos +'' nononononononononon
-' Cle*er !arros -'' nononononononononon
6 coluna G1utras ColunasH est representando todas as demais colunas 9R8C CP4C E#REREC1C
CIR6REC EA/6R1C A6%6RI1: da ta*elaC apenas para simplificar a demonstrao=
SE?+:
C?D_SE?+ N?,E
&'' .endas
+'' PCP
-'' Produo
6plicando o produto cartesiano entre 4$#CI1#6RI1 e AE/1R a ta*ela auxiliar resultante
4$#CI1#6RI1;AE/1R seria a se5uinte:
".NCI?N0+I?4SE?+:
COD_FUNCIONARIO FUNCIONARIO.NOME FUNCIONARIO.COD_SETOR Outras Colunas SETOR.COD_SETOR SETOR. NOME
10 Andr Pires 100 nononon 100 Vendas
10 Andr Pires 100 nononon 200 PCP
10 Andr Pires 100 nononon 300 Produo
11 Roberto Azevedo 100 nononon 100 Vendas
11 Roberto Azevedo 100 nononon 200 PCP
11 Roberto Azevedo 100 nononon 300 Produo
20 Carla Campos 200 nononon 100 Vendas
GEEK BRASIL http://www.geekbrasil.com.br &+
Banco de "ados * 4 5ro6eto de Banco de "ados
20 Carla Campos 200 nononon 200 PCP
20 Carla Campos 200 nononon 300 Produo
30 Cleber Barros 300 nononon 100 Vendas
30 Cleber Barros 300 nononon 200 PCP
30 Cleber Barros 300 nononon 300 Produo
.erificamosC entoC <ue a ta*ela 5erada possui todas as colunas de 4$#CI1#6RI1 adicionadas Ns
colunas de AE/1R= #ote <ue para o atri*utos C1R_AE/1R e #1EE foram necessrios <ualificadoresC
representados pelo nome da ta*elaC para no causar am*i5Qidades= Aempre <ue colunas com nomes
id?nticos existirem ser necessrio inserir os nomes das ta*elas N frente dos nomes das colunasC para fa)er
a distino=
6 ta*ela resultante ficou com &+ linhasC resultado do produto entre o nImero de linhas da ta*ela
4$#CI1#6RI1 90 linhas: e a ta*ela AE/1R 9- linhas := #o entantoC dentre estas linhasC ,rias no t?m
sentido prticoC pois 4$#CI1#6RI1=C1R_AE/1R J diferente de AE/1R=C1R_AE/1R= Reste modoC
sempre <ue utili)armos ,rias ta*elas numa clusula -romC ou se2aC utili)armos produto cartesianoC
de,emos fa)er o <ue a l5e*ra relacional chama de li5ao naturalC eliminando essas linhas= #o caso a
restrio foi feita atra,Js do predicado G"here 4$#CI1#6RI1=C1R_AE/1R Z
AE/1R=C1R_AE/1RH=
'haCes
6ntes de discutirmos o <ue ,em a ser a li5ao naturalC de,emos discutir o conceito de cha,es 9%eys:=
#um *anco de dados relacionalC existem dois tipos de cha,es:
C*a)e /rim@ria 2%rimar7 8e73
$ma cha,e primria J uma coluna ou um con2unto de colunas <ue identificam unicamente uma
linha numa ta*ela= 6s colunas <ue fa)em parte da cha,e primria so os atri*utos determinantes do
EER=Por exemploC na ta*ela AE/1RC o cDdi5o 9C1R_AE/1R: identifica unicamente cada linha=
Reste modoC uma cha,e primria J um ,alor <ue no pode se repetir dentro de uma mesma ta*ela=
C*a)e Estrangeira 23oreign 8e73
$ma cha,e estran5eira J uma ou mais colunas numa ta*ela <ue so cha,es primrias em outra
ta*elaC o <ue si5nifica <ue <ual<uer ,alor para uma coluna <ue J cha,e estran5eira de,e
corresponder a um ,alor existente na outra ta*ela onde a coluna J cha,e primria=#a lin5ua5em dos
sistemas 5erenciadores de *anco de dadosC isto J conhecido como integridade re-erencial= Por
exemploC temos o cDdi5o do setor 9C1R_AE/1R: na ta*ela 4$#CI1#6RI1 <ue J uma cha,e
estran5eira para o campo de mesmo nome na ta*ela AE/1R onde este J cha,e primria=
Recorrente do conceito de cha,e estran5eiraC tam*Jm sur5e a definio de re5ras de deleo= Esta
re5ra determina <ual processamento de,e ser praticado <uando da remoo de linhas de uma ta*ela
e <ue so referenciadas como cha,es estran5eiras em outras ta*elas= 1s dois tipos de re5ra de
deleo mais comuns so:
L +estrita 2restrict3: este re5ra determina <ue uma linha somente pode ser exclu@da de uma
ta*ela se os seus ,alores de cha,e primria no forem referenciados por nenhuma linha na
ta*ela onde ele pode aparecer como cha,e estran5eira= #o nosso exemploC J o <ue acontece
nas ta*elas AE/1R e 4$#CI1#6RI1C onde um setor somente pode ser remo,ido caso no
exista nenhum funcionrio pertencente N<uele setorM
L Em Cascata 2cascade3: este re5ra determina <ue a excluso de uma linha numa ta*ela
disparaC automaticamente 9em cascata:C a remoo de todas as linhas <ue referencia,am o
seu ,alor como cha,e estran5eira na outra ta*ela= #o exemploC J o <ue ocorre entre as
ta*elas REK$IAI`a1 e I/E#A_REK$IAI`a1C onde a remoo de uma re<uisio
ocasiona a remoo automtica de todos os seus itensC ou se2aC a remoo de todas as linhas
da ta*ela I/E#A_REK$IAI`a1 <ue referencia,am a re<uisio exclu@da=
ContudoC de,e;se ressaltar <ue a re5ra de deleo J definida para cada relao entre duas ta*elas
separadamente= Reste modoC J poss@,el a ocorr?ncia de casos onde uma cha,e primria J
referenciada como cha,e estran5eira de re5ra restrict por uma ta*elaC e como re5ra cascade por
GEEK BRASIL http://www.geekbrasil.com.br &-
Banco de "ados * 4 5ro6eto de Banco de "ados
outra= > o <ue ocorre com a ta*ela PR1R$/1 do nosso exemplo= $m produto somente poder ser
remo,ido se no existirem nenhuma linhas nas ta*elas I/E#A_RE.1%$`a1 e
I/E#A_REK$IAI`a1 <ue o referenciem e tam*Jm na ta*ela C1EP1AI`a1 caso ele aparece
como componente de outro produto= EntretantoC caso o produto aparea somente como compostoC
ele poder ser normalmente exclu@do e todas as suas composies 9linhas <ue o referenciam como
composto na ta*ela C1EP1AI`a1: tam*Jm sero remo,idas automaticamente=
FariECeis 72plas
AK% empresta a noo de ,ar,eis tuplas do Clculo Relacional de tuplas= $ma ,ari,el /upla em AK%
de,e ser associada a uma relao particularC definida na clusula -rom= Para ilustrarC ,amos reescre,er
uma das consultas anteriores utili)ando esse no,o conceito= 6 consulta Gselecionar todos os funcionrios
9cDdi5o e nome: e seus respecti,os setores 9cDdi5o e nome:HC utili)ando ,ari,eis tuplas ficaria assim:
select 7.'()*+,-'I(-ARI(! 7.+,-'I(-ARI(*-(9E!
S.'()*SE7(R! S.-(9E
+rom +,-'I(-ARI( 7! SE7(R S
,ere 7.'()*SE7(R < S.'()*SE7(R
.ar,eis /uplas so particularmente importantes <uando <ueremos comparar duas tuplas numa mesma
relaoC o <ue no seria poss@,el simplesmente com a aplicao do produto cartesiano= Por exemploC a
consulta Gselecionar todos os funcionrios <ue tra*alham no mesmo setor <ue o funcionrio de cDdi5o
+'HC resultaria na se5uinte sentena AK%:
select S.'()*+,-'I(-ARI(
+rom +,-'I(-ARI( 7!S
,ere 7.'()*+,-'I(-ARI( < "; and
7.'()*SE7(R < S.'()*SE7(R
#ote <ue a ,ari,el / foi utili)ada para locali)ar a tupla relati,a ao funcionrio de cDdi5o +' e seu
respecti,o setorC ao passo <ue a ,ari,el A foi utili)ada para locali)ar todos os funcionrios <ue tra*alham
neste setor= 6 ,ari,el A selecionar inclusi,e o prDprio funcionrio de cDdi5o +'=
(pera/4es 1e 'o#G2#tos
6 l5e*ra relacionalC na <ual a SQL se *aseiaC inclui as operaes union5 intersect e minus5 para 2unes
de con2untos= EntretantoC apenas a instruo union foi inclu@da no padro 6#AI da lin5ua5em SQL= Isto
no che5a a ser um pro*lemaC pois a instruo intersect pode ser reali)ada com a construo in5 e a
minus com a not in=
Para demonstrarmos a utilidade da instruo unionC ,amos considerar <ue a se5uinte consulta se2a
re<uisitada: fornea todos os cDdi5os dos funcionrios <ue pro,ocaram <ual<uer mo,imentao no
esto<ueC ou se2aC uma re<uisio ou uma de,oluo=
Para recuperarmos os funcionrios <ue re<uisitaram produtosC utili)ar@amos a se5uinte instruo:
select '()*+,-'I(-ARI(
+rom RE.,ISI'A(
Para a<ueles <ue de,ol,eram al5um produto:
select '()*+,-'I(-ARI(
+rom )EF(L,'A(
65ora para fa)ermos a unio destes dois con2untos de ,aloresC utili)amos o operador union= 6ssim a
instruo resultante J:
GEEK BRASIL http://www.geekbrasil.com.br &0
Banco de "ados * 4 5ro6eto de Banco de "ados
select '()*+,-'I(-ARI(
+rom RE.,ISI'A(
union
select '()*+,-'I(-ARI(
+rom )EF(L,'A(
Ae a consulta fosse os cDdi5os dos funcionrios <ue participaram de uma re<uisio e de uma de,oluoC
ter@amos:
select '()*+,-'I(-ARI(
+rom RE.,ISI'A(
intersect
select '()*+,-'I(-ARI(
+rom )EF(L,'A(
1 mesmo resultado o*ter@amos com a se5uinte sentena:
select '()*+,-'I(-ARI(
+rom RE.,ISI'A(
,ere '()*+,-'I(-ARI( in
(select '()*+,-'I(-ARI(
+rom )EF(L,'A()
Ae a consulta fosse para o*ter os cDdi5os dos funcionrios <ue participaram de al5uma re<uisioC mas
no participaram de nenhuma de,oluoC ter@amos:
select '()*+,-'I(-ARI(
+rom RE.,ISI'A(
minus
select '()*+,-'I(-ARI(
+rom )EF(L,'A(
1 mesmo resultado o*ter@amos com a se5uinte sentena:
select '()*+,-'I(-ARI(
+rom RE.,ISI'A(
,ere '()*+,-'I(-ARI( not in
(select '()*+,-'I(-ARI(
+rom )EF(L,'A()
Portanto pudemos compro,ar <ue tanto a operao intersect como a operao minus podem ser
reali)adas em construes anlo5as utili)ando in e not inC respecti,amente=
> importante ressaltar <ue o operador union trata as ta*elas como con2untosC e pela re5ra de unio de
con2untosC ,alores duplicados so descartados= 6ssimC se um funcionrio re<uisitou e de,ol,eu al5um
produtoC ele aparecer apenas uma ,e) na lista resultante= Caso se2a necessrio manter as duplicaesC
de,e;se utili)ar o operador union all ao in,Js de union;
GEEK BRASIL http://www.geekbrasil.com.br &U
Banco de "ados * 4 5ro6eto de Banco de "ados
E3ibi#1o Res2lta1os (r1e#a1os
SQL oferece controle so*re a ordem na <ual as linhas do resultado de uma consulta esto dispostas= 6
clusula order 1A ocasiona o aparecimento das linhas de resultado de uma consulta em uma ordem
determinada= Por exemplo para listar em ordem alfa*Jtica todos os funcionrios do setor &''C
escre,emos:
select +.-(9E! '()*+,-'I(-ARI(
+rom +,-'I(-ARI( +!
SE7(R S
,ere +.'()*SE7(R < S.'()*SE7(R and
S.'()*SE7(R < ;;
order b5 +.-(9E
Como padroC SQL lista itens na ordem ascendente= Para especificar a ordem de classificaoC podemos
especificar desc para descendente ou asc para ascendente= 6lJm do maisC a ordenao pode ser feita por
mIltiplos atri*utosC *astandoC para isto list;los na clusula order 1A= Auponha <ue fosse necessrio 5erar
uma lista contendo as re<uisies reali)adas em ordem descendenteC ou se2aC primeiro pelos mais
recentes= Para as re<uisies reali)adas no mesmo momentoC ordenamos em ordem ascendente pelo
nImero da re<uisio= #este caso o comando SQL seria:
select ?
+rom RE.,ISI'A(
order b5 1ata desc! '()*RE.,ISI'A( asc
Para atender a clusula order 1AC SQL precisa executar uma classificao= $ma ,e) <ue uma
classificao de um 5rande nImero de linhas pode ser custosoC de,e;se utili);la apenas <uando
necessrio=
+2#/4es 1e agrega/0o
SQL oferece a possi*ilidade de computar funes em 5rupos de linhas usando a clusula group 1A= 1s
atri*utosC dados na clusula group 1A5 so usados para formar 5rupos= %inhas com o mesmo ,alor em
todos os atri*utos na clusula group 1A so colocados em um 5rupo=
SQL inclui funes de a5re5ao para computar:
L mJdia: a)g
L m@nimo: min
L mximo: max
L total: sum
L contar: count
6s operaesC como a a)gC so chamadas funes de a5re5aoC por<ue operam em a5re5aes de linhas=
1 resultado de uma funo de a5re5ao J um ,alor Inico= Para ilustrarC considere a consulta GAelecione
o salrio mJdio em cada setor da empresaH= 6 instruo ficaria assim:
select '()*SE7(R!
avg 8SALARI(:
+rom +,-'I(-ARI(
grou& b5 '()*SE7(R
GEEK BRASIL http://www.geekbrasil.com.br &3
Banco de "ados * 4 5ro6eto de Banco de "ados
4unes de 65re5ao e seus resultados
Re,e;se notar <ue as funes A$E e 6.8 somente aceitam expresses numJricas como ar5umentosC
uma ,e) <ue elas calculam a soma e a mJdia de ,aloresC respecti,amente= 6s demais 9C1$#/C E6b e
EI#: aceitam <ual<uer tipo de dado na expresso como parTmetro=
6 principal particularidade a ser ressaltada J com relao N funo C1$#/= C1$#/9expresso: e
C1$#/9V: so sutilmente diferentesC uma ,e) <ue C1$#/9expresso: no conta as linhas nulas e
C1$#/9V: reali)a a conta5em de todas as linhasC se2am elas nulas ou no=
1utra <uesto a ser ressaltada com relao N utili)ao da clusula group 1A J <ue a lista de ,alores da
clusula select somente aceita funes de a5re5aoC constantes e expresses com*inando;asC alJm dos
campos listados na clusula group 1A= /al restrio J e,identeC uma ,e) <ue a incluso de outros campos
na lista do select seria totalmente sem sentido e imposs@,el de ser retornada=
PorJmC podemos tam*Jm usar as funes de a5re5ao sem a clusula group 1A= #este caso a ta*ela
inteira J tratada como um Inico 5rupo= $ma consultaC para contar o nImero de funcionrios da sua
empresaC pode ser expressa da se5uinte maneira:
select count 8? :
+rom +,-'I(-ARI(
A 'lE2s2la HAFI-G
Em certas situaesC J necessrio definir uma condio <ue se apli<ue a 5ruposC ao in,Js de linhas=
Ima5ine se esti,Jssemos interessados em sa*er o salrio mJdio apenas da<ueles setoresC cu2o salrio
mJdio se2a maior <ue R[ &&''C''= Esta condio no se aplica a linhas simplesC mas sim a cada 5rupo
constru@do com a clusula group 1A= Reste modoC no podemos utili)ar funes de a5re5ao na clusula
8*ere e para expressar tal condio utili)amos a clusula *a)ing= 1s predicados na clusula *a)ing so
aplicados depois da formao dos 5ruposC para <ue funes de a5re5ao possam ser usadas=
Expressamos esta consulta SQL assim:
select '()*SE7(R!
avg 8SALARI(:
+rom +,-'I(-ARI(
grou& b5 '()*SE7(R
aving avg 8SALARI(: $ ;;
Ae uma clusula 8*ere e uma clusula *a)ing aparecerem numa mesma consultaC o predicado na
clusula 8*ere J aplicado primeiro= 6s linhas <ue satisfa)em a condio da clusula 8*ere so ento
a5rupadas pela clusula group 1A= Em se5uidaC o predicado da clusula *a)ing J aplicado a cada 5rupo=
Ilustrando a utili)ao de 8*ere e *a)ing na mesma instruoC faremos a se5uinte consulta: cDdi5o do
produto e <uantidade total re<uisitadaC para os produtos <ue possuem <uantidade total re<uisitada maior
<ue &'=
select '()*&R(),7(!
sum 8.7)E :
GEEK BRASIL http://www.geekbrasil.com.br &7
Banco de "ados * 4 5ro6eto de Banco de "ados
+rom RE.,ISI'A( R!
I7E-S*RE.,ISI'A( I
,ere R.'()*RE.,ISI'A( < I.'()*RE.,ISI'A(
grou& b5 '()*&R(),7(
aving sum 8.7)E: $ ;;
'o#s2ltas 'omple3as
AK% permite <ue al5uns consultas mais ela*oradas possam ser feitasC utili)ando apenas ,ari,eis tuplas
sem as funes de a5re5ao= Por exemploC uma sentena em AK% para de,ol,er todos os setores <ue t?m
mais <ue &U funcionrios alocadosC seria:
select distinct S.-(9E
+rom SE7(R S
,ere ( select count(6)
+rom +,-'I(-ARI( 7
,ere 7.'()*SE7(R < S.'()*SE7(R) $ @
GEEK BRASIL http://www.geekbrasil.com.br &8
Banco de "ados * 4 5ro6eto de Banco de "ados
7un(8es "uilt9in
6lJm dos comandosC clusulas e funes a5re5adas da lin5ua5em SQLC os 5erenciadores de *ancos de
dados disponi*ili)am uma sJrie de outras funes para a2udar o usurio na manipulao dos dados= Estas
funes podem ser utili)adas normalmente com as instrues SQL comuns=
ContudoC essas extenses acarretam uma 5rande des,anta5em <uando se pretende desen,ol,er sistemas
multiplataformasC pois estas funes so espec@ficas para cada ser,idor de *anco de dados= Por exemploC
uma funo de con,erso de inteiro para strin5C por exemploC J diferente entre o Oracle e o Sy&ase=
1 Oracle fornece um 5rande con2unto de funes para manipular strin5sC datas e nImeros= Rentre elasC
podemos destacar:
Funes para manipulao de strings
7un()o -ro&:sito
AS'II83: Retor#a o Calor #2mIrico AS'II 1o caracter 3
'HR83: Retor#a o caracter AS'II correspo#1e#te ao i#teiro 3
'(-'A783!J: Retor#a 3 co#cate#a1o com J
I-I7'A&83: Retor#a a stri#g 3 com a primeira letra 1e ca1a palaCra em maiKsc2la e as
resta#tes em mi#Ksc2la 8#ome
prLprio:
LE-G7H83: Retro#a o tama#ho 1a stri#g 3
LE-G7HB83: Retor#a o tama#ho em bJtes 1a stri#g 3
L(MER83: Retor#a a stri#g 3 com to1as as letras em mi#Ksc2la
L7RI983%!J%: Elimi#a caracteres N esB2er1a 1a stri#g 3 e retor#a a stri#g res2lta#te. Se
J #0o >or especi>ica1o! caracteres
em bra#co ser0o remoCi1os. ( Calor 1a stri#g J 8opcio#al: I o co#G2#to 1e
caracteres a ser elimi#a1o
RE&LA'E83!J%!D%: Retor#a a stri#g 3 com to1as as ocorrO#cias 1e J s2bstit2P1as por D. Se D
>or omiti1o! to1as as ocorrO#cias 1e
J ser0o simplesme#te remoCi1as
R7RI983%!J%: Elimi#a caracteres N 1ireita 1a stri#g 3 e retor#a a stri#g res2lta#te. Se
J #0o >or especi>ica1o! caracteres em bra#co ser0o remoCi1os. ( Calor 1a
stri#g J 8opcio#al: I o co#G2#to 1e
caracteres a ser elimi#a1o
S,BS7R83!J%!D%: Retor#a a parte 1a stri#g 3! i#icia#1o com o caracter J. Se D >or
especi>ica1o! a >2#/0o retor#a D caracteres a partir 1e J 8i#cl2siCe:Q
caso co#trErio! a parte retor#a1a Cai
atI o >i#al 1a stri#g 3
,&&ER83: Retor#a a stri#g 3 com to1as as letras em maiKsc2la
$m exemploC de utili)ao das funes de manipulao de stringsC seria a eliminao de todos os espaos
em *ranco <ue tenham sido di5itados N direita dos nomes dos funcionrios:
u&date +,-'I(-ARI(
set -(9E < ;T;*'8-(9E:
GEEK BRASIL http://www.geekbrasil.com.br &
Banco de "ados * 4 5ro6eto de Banco de "ados
Funes para manipulao de nmeros
7un()o -ro&:sito
AS'II83: Retor#a o Calor absol2to 1e 3
'EIL83: Retor#a o me#or i#teiro s2perior o2 ig2al a 3
'(S83: Retor#a o coRse#o 1e 3
'(SH83: Retor#a o coRse#o hiperbLlico 1e 3
ES&83: Retor#a e eleCa1o N potO#cia 1e 3
+L((R83: Retor#a o maior i#teiro i#>erior o2 ig2al a 3
L-83: Retor#a o logaritmo #at2ral 1e 3
L(G83!J: Retor#a o logaritmo 1e base 3 1e J
9()83!J: Retor#a o resto 1e 3 1iCi1i1o por J
&(MER83!J: Retor#a o 3 eleCa1o N potO#cia J
R(,-)83%!J%: Retor#a o 3 arre1o#1a1o J casas N 1ireita 1a casa 1ecimal. ( Calor pa1r0o
1e J! caso seGa omiti1o! I ; 8Dero:
SIG-83: Retor#a o si#al 1e 3 como R se 3 >or #egatiCoQ ; 8Dero: se 3 >or ; 8Dero:Q e
se 3 >or positiCo
SI-83: Retor#a o se#o 1e 3
SI-H83: Retor#a o se#o hiperbLlico 1e 3
S.R783: Retor#a a raiD B2a1ra1a 1e 3
7A-83: Retor#a a ta#ge#te 1e 3
7A-H83: Retor#a a ta#ge#te hiperbLlica 1e 3
7R,-'83%!J%: Retor#a 3 tr2#ca1o para J casas 1ecimais. ( Calor pa1r0o 1e J! caso
omiti1o! I ; 8Dero:
Para exemplificar o uso de funes de manipulao de nImerosC dese2amos eliminar os centa,os dos
preos dos produtosC arredondando todos os preos para cima=
u&date &R(),7(
set &RE'( < C$*L8&RE'(:
Funes para manipulao de datas
7un()o -ro&:sito
A))*9(-7HS83!J: Retor#a a 1ata 3 acresci1a 1e J meses
LAS7*)AT83: Retor#a o Kltimo 1ia 1o mesmo 1a 1ata 3
9(-7HS*BE7MEE-83: Retor#a o #Kmero 1e meses e#tre as 1atas 3 e J
STS)A7E Retor#a a 1ata e hora at2ais 1o sistema
Para exemplificar o uso de funes de manipulao de datasC dese2amos sa*er <uantos meses decorreram
desde a primeira re<uisio do produto \'&'&''&^ atJ a data atual=
select '!1T<0="$T>$$189I-8R.)A7A:!0?0#@T$:
+rom RE.,ISI'A( R!
I7E-S*RE.,ISI'A( IR
GEEK BRASIL http://www.geekbrasil.com.br +'
Banco de "ados * 4 5ro6eto de Banco de "ados
,ere R.'()*RE.,ISI'A( < IR.'()*RE.,ISI'A( and
IR.'()*&R(),7(<6;;;;6
Funes de converso
7un()o -ro&:sito
7(*'HAR83%!J%: 'o#Certe 2ma 1ata o2 2m #Kmero 3 em 2ma stri#g 1e caracteres. A stri#g
J 1e>i#e o >ormato 1e co#Cers0o 1a
1ata o2 #Kmero. E3emplos 1e >ormato s0o 511R99RJJJ6 e 5UUU.UU6
7(*)A7E83%!J%: 'o#Certe a stri#g 3 em 2ma 1ata! 2sa#1o o mo1elo 1e >ormato J
7(*-,9BER83%!J%: 'o#Certe a stri#g 3 em 2m #Kmero! 2sa#1o o mo1elo 1e >ormato J
$m exemplo do uso de funes de con,ersoC seria um comando select <ue retornasse o ,alor numJrico
dos anos em <ue foram reali)adas re<uisies ao esto<ue=
select distinct T!=12'"$;8T!=C<@;8)A7A!6JJJJ6::
+rom RE.,ISI'A(
GEEK BRASIL http://www.geekbrasil.com.br +&
Banco de "ados * 4 5ro6eto de Banco de "ados
'odi+icando o "anco de #ados
6tJ o presente momentoC restrin5imos nossa ateno N consulta ao *anco de dados= 65ora discutiremos as
instrues da SQL para atuali)ao do *ancoC atra,Js dos comandos insert5 delete e update=
Inserindo Linhas INSE!T
Para inserir um dado numa ta*elaC podemos fa)?;lo de duas formas:
L especificando uma linha a ser inseridaC ou se2aC os campos e seus ,aloresM
L escre,endo uma consulta cu2o o resultado se2a um con2unto de linhas a serem inseridas=
6 primeira maneira J mais simplesC pois inserimos uma linha por ,e)C atri*uindo ,alores as colunas da
ta*ela= Aintaxes:
insert into <nome da tabela> | (<C1, C2 ... Cn>) | values (< V1, V2 ... Vn >)
insert into <nome da tabela> <select ... +rom ... ,ere ...>
onde:
L Ci : nome da coluna
L .i : ,alor a ser inserido= Pode ser uma constante ou uma expresso=
1s nomes das colunas podem ser omitidosC se a ordem dos ,alores a serem inseridos corresponder com a
ordem de criao dos mesmos=
Para incluirmos o setor de Compras no nosso *anco de dados exemplo utili)ar@amos a se5uinte instruo:
insert into SE7(R
8'()*SE7(R! -(9E :
values 8@;;! 5'ompras6:
Re,e;se notar <ue ao fa)er uma insero todas as restries 9c'nstraints: de inte5ridade referencial
declaradas sero processadasC de modo a preser,ar a consist?ncia dos dados= #a ta*ela AE/1R h apenas
a restrio de cha,e;primria 9C1R_AE/1R:C <ue no permitir a insero de um setor com o mesmo
cDdi5o= EntretantoC em outras ta*elasC como a 4$#CI1#6RI1C existem restries de cha,e estran5eira=
Esta restrio no permitir <ue um funcionrio se2a inserido num setor inexistenteC ou se2aC <ue o seu
C1R_AE/1R no exista na ta*ela AE/1R=
Pode;se tam*Jm fa)er uma insero atra,Js do resultado de uma consulta= Conse5uimos assim fa)er uma
insero em lote= Ima5inemos um casoC onde a re<uisio de cDdi5o &'&U reali)ada pelo funcionrio &'C
de,e ser extornadaC ou se2aC todos os itens <ue constam como re<uisitados de,ero ser lanados na
de,oluo de cDdi5o U''U com a mesma data da re<uisio= Re,er@amos fa)er os se5uintes inserts:
insert into )EF(L,'A(
select @;;@!
'()*+,-'I(-ARI(!
)A7A
+rom RE.,ISI'A(
,ere '()*RE.,ISI'A( < ;@
insert into I7E-S*)EF(L,'A(
select @;;@!
'()*&R(),7(!
.,A-7I)A)E
+rom I7E-S*RE.,ISI'A(
,ere '()*RE.,ISI'A( < ;@
GEEK BRASIL http://www.geekbrasil.com.br ++
Banco de "ados * 4 5ro6eto de Banco de "ados
#o exemplo dado so*re insert considerou;se <ue todos os ,alores foram dados= PorJm isto no J uma
re5raC pois h caso de colunas <ue aceitam ,alores nulos= Reste modo pode;se numa instruo insert
utili)ar a pala,ra reser,ada null para indicar a insero de um ,alor nulo= Exemplo:
insert into +,-'I(-ARI(S
8'()*+,-'I(-VRI(! '()*SE7(R! -(9E! RG! '&+!
E-)ERE'(! 'I)A)E! ES7A)(! SALARI(:
values 8@!@;;!6WosI 9arti#s6!#2ll!#2ll!#2ll!#2ll!#2ll!X;;:
Com esta instruoC inserimos o funcionrio FosJ Eartins= /odas as colunas <ue poderiam conter ,alores
nulos 9R8C CP4C E#REREC1C CIR6REC EA/6R1:C se5undo suas definies no *anco de dadosC
rece*eram null como conteIdo= 1utra forma de fa)er esta insero seria explicitando apenas os nomes
das colunas <ue rece*eriam ,alores nulos= Resta outra formaC o exemplo acima ficaria do se5uinte modo:
insert into +,-'I(-ARI(S
8'()*+,-'I(-VRI(! '()*SE7(R! -(9E! SALARI(:
values 8@!@;;!6WosI 9arti#s6!X;;:
!emovendo Linhas "ELETE
$ma re<uisio de remoo J expressa da mesma forma <ue uma consulta= Podemos remo,er apenas
linhas inteirasC e no apenas al5uns atri*utos= 6 instruo delete possui a se5uinte sintaxe:
delete +rom <nome da tabela> | ,ere < condi()o de &rocura > |
Ae dese2armos remo,er linhas de di,ersas ta*elasC precisaremos utili)ar um comando delete para cada
uma= 6 condio de procura na clusula 8*ere pode ser to complexa <uanto a do comando select=
Podemos tam*Jm omitir a clusula 8*ereC contudo de,emos ter muito cuidadoC poisC neste casoC todas as
linhas da ta*elas sero exclu@das=
Em se5uida J mostrado um comando delete <ue exclui um item de uma re<uisio:
delete +rom I7E-S*RE.,ISI'A(
,ere '()*RE.,ISI'A( < YX" and
'()*&R(),7( < 5;;;;6
6ssim como na inseroC a remoo de linhas tam*Jm ocasiona o processamento de todas as restries
relati,as a inte5ridade referencial tan5entes N ta*ela <ue est sofrendo a remoo=
#ota;se <ue neste delete no ha,er nenhum pro*lema <uanto as restries declaradasC pois as cha,es
primrias da ta*ela I/E#A_REK$IAIC61 no so cha,e estran5eira em nenhuma outra ta*ela=
PorJmC se tentarmos excluir um funcionrioC poder@amos ter pro*lemasC se no relacionamento entre
4$#CI1#6RI1 e RE.1%$C61 ou REK$IAIC61C a restrio relati,a a cha,e estran5eira
C1R_4$#CI1#6RI1 esti,er confi5urada como restrict 9<ue J o caso do nosso exemplo:= #este casoC a
deleo sD iria se procederC caso o funcionrio a ser exclu@do no ti,esse feito nenhuma re<uisio ou
de,oluo= Ae a re5ra de deleo esti,er setada como cascadeC ao excluir o funcionrio todas as
re<uisies e de,olues seriam eliminadas 2untamente com o funcionrio em <uesto=
#odi$icando Linhas %&"'TE
$tili)amos o comando update5 <uando dese2amos mudar al5uns ,alores em al5umas colunas de uma
ta*ela= Ressalta;se <ue a atuali)ao pode ser feita em apenas uma ta*ela por ,e)= Como no select e
delete5 podemos utili)ar de uma condio de procuraC para selecionar as linhas <ue dese2amos <ue sofram
modificaes= Aintaxe do comando update:
u&date <nome da tabela> set (C1 A V1, C2AV2 ... Cn A Vn) | ,ere <condi()o de &rocura> |
onde:
L Ci : coluna da ta*elaM
GEEK BRASIL http://www.geekbrasil.com.br +-
Banco de "ados * 4 5ro6eto de Banco de "ados
L .i : no,o ,alorC podendo ser uma constanteC ou uma expresso=
Auponha <ue <ueiramos atuali)ar os slarios dos funcionrios do setor +'' em &']= $tili)ar@amos a
se5uinte instruo:
u&date +,-'I(-ARI(
set SALARI( < SALARI( ? .
,ere '()*SE7(R < ";;
6ssim como no comando deleteC a clsula 8*ere tam*Jm pode ser omitida no update= Reste modoC todas
as linhas da ta*ela sofreriam a atuali)ao=
Aupondo <ue dese2emos atuali)ar o salrio de todos os funcionrios em &']C independentemente do setorC
a instruo SQL se resumiria a:
u&date +,-'I(-ARI(
set SALARI( < SALARI( ? .
GEEK BRASIL http://www.geekbrasil.com.br +0
Banco de "ados * 4 5ro6eto de Banco de "ados
*ntrodu()o a ##L 9 Linguagem de #e+ini()o de #ados
Ta(elas )Tables* + Criando, 'lterando e Excluindo
Como 2 citadoC as ta*elas so os *locos *sicos de construo de <ual<uer *anco de dados eC com os
comandos de definio de dados da lin5ua5em AK%C podemos criarC excluir e alterar ta*elas=
Kuando se cria uma ta*ela com AK%C na ,erdadeC so definidas as colunasC com seus tipos e outras
caracter@sticasC <ue cada linha criada na ta*ela arma)enar=Para a definio de uma coluna so
necessrios: um nomeC um tipo e se a coluna permitir o arma)enamento de ,alores nulos=
1 comando para criao de ta*elasC J o C+E0E 0BLE= EisC sua sintaxe:
create table <nome da tabela> ( <nome da coluna 1> <ti&o de dado> | 12LL ou 1!T 12LL |,
..., <nome da coluna n> <ti&o de dado> | 12LL ou 1!T 12LL | )
Como exemplo do comando CRE6/E_/6!%EC citamos o comando para criao da ta*ela de setores:
create table SE7(R
8 '()*SE7(R smalli#t #ot #2ll!
-(9E Carchar8X;: #ot #2ll :
1 padro SQL()2 9tam*Jm conhecido como SQL2: acrescentou ao comando CRE6/E /6!%E al5umas
clusulas para declarao de restries para os campos de ta*elas= Estas clusulas so:
L /+I,0+B CEB
L DE"0.L: <uando um campo for declaradoC J poss@,el especificar o seu ,alor defaultC ou se2aC se
na insero de uma linha este campo no ti,er um ,alor fornecidoC o ,alor default J arma)enado=
Isto J Itil <uando se tem uma 5rande <uantidade 9<uase maioria: de linhas onde uma coluna
assume sempre um mesmo ,alor= Reste modoC somente seria necessrio especificar um ,alor para
esta colunaC numa inseroC <uando este fosse diferente do defaultC ou se2aC em poucos casos=
L CDECC: restrin5e a faixa de ,alores <ue a coluna pode assumir= Restries de chec% so tam*Jm
chamadas de re5ras 9rules: ou re5ras de ,alidao 9*alidati'n rules:C uma ,e) <ue permitem <ue o
prDprio 5erenciador de *ancos de dados ,erifi<ue se o ,alor sendo atri*u@do para a coluna est
dentre os ,alores ,lidos=
L +E"E+ENCES: caso uma coluna se2a definida com RE4ERE#CEAC ou se2aC a coluna J uma
cha,e estran5eiraC <uando um ,alor est para ser atri*u@do para esta colunaC primeiro J ,erificado
se o mesmo ,alor existe na ta*ela e coluna referenciadas=
L .NIQ.E: 5arante <ue ,alores para uma coluna no se repitam dentro da ta*ela= Esta restrio
tam*Jm impe <ue a coluna no possa aceitar ,alores nulos=
Como exemplo da definio de restriesC temos um comando para criao da ta*ela REK$IAI`a1:
create table RE.,ISI'A(
8 '()*RE.,ISI'A( smalli#t primarJ keJ!
'()*+,-'I(-ARI( smalli#t #ot #2ll re>ere#ces +,-'I(-ARI(!
)A7A 1ate 1e>a2lt STS)A7E
check 8)A7A << 7(*)A7E85;R;RUZ;6!611R99RJJJJ6: : :
Re,e;se notar <ue na definio da ta*ela REK$IAIC61 foram utili)adas al5umas funes &uilt(in do
1racleC as <uais de,em ser su*stitu@das caso a ta*ela se2a 5erada em outro 5erenciador de *ancos de
dados=
F com relao Ns re5ras de deleoC a sua definio ,aria de acordo com cada 5erenciador= #o OracleC ela
pode ser declarada apDs a restrio re+erences=
GEEK BRASIL http://www.geekbrasil.com.br +U
Banco de "ados * 4 5ro6eto de Banco de "ados
1utra <uesto a ser ressaltada J <ue <uando a cha,e primria J composta por mais de um campoC esta
de,e ser declarada apDs todos os campos=
.e2amos como ficaria um exemploC acrescentando uma re5ra de deleo e uma cha,e primria com mais
de um campo= Re,e;se considerar <ueC no 1racleC a re5ra de deleo default J a restrita 9restrict::
create table I7E-S*RE.,ISI'A(
8 '()*RE.,ISI'A( smalli#t #ot #2ll re>ere#ces RE.,ISI'A(
on delete cascade!
'()*&R(),7( char8[: #ot #2ll re>ere#ces &R(),7(!
)A7A >loat #ot #2ll :
6 lin5ua5em SQL tam*Jm permite a alterao de componentes de uma ta*ela= 1 comando utili)ado para
este fim J o 6%/ER /6!%E= Aua sintaxe inclui pala,ras;cha,e para adicionar e remo,er colunasC *em
como alterar seus atri*utos de nomeC tipo de dadoC tamanhoC etc= Aintaxe:
alter table <nome da tabela> @## ( <nome da nova coluna> <ti&o de dado> | 12LL ou 1!T 12LL | )
alter table <nome da tabela> #;!- ( <nome da coluna>
alter table <nome da tabela> '!#*7? ( <nome da coluna> <ti&o de dado> | 12LL ou 1!T 12LL | )
ContudoC de,e;se considerar <ue as alteraes de ta*elas 5o)am de al5umas restries em certos
5erenciadores de *ancos de dadosC ,etandoC por exemploC a adio de uma coluna <ue no permita ,alores
nulosC numa ta*ela <ue 2 contJm linhas arma)enadas=
6 RR% tam*Jm dispe de um comando para excluir ta*elas: o RR1P /6!%E= Aintaxe:
dro& table <nome da tabela>
-ises )Vie,s*
$ma ,iso ,*ie-. permite <ue ,oc? associe os resultados de uma consulta a um nomeC <ue ,oc? pode
utili)ar em outras consultasC como se fosse uma ta*ela normal= Kuando ,oc? acessa uma *ie-C a consulta
<ue est definida para esta J executada e os resultados desta tra*alham com uma no,a ta*ela *ase para a
no,a consulta <ue est sendo praticada= Aintaxe:
create vie, <nome da vis)o> as <select ... +rom ... ,ere ...>
Como exemploC poder@amos criar uma ,iso de nome 4$#CI1#6RI1A_.E#R6AC a <ual conteria
apenas os funcionrios do setor de .endas= Eis o comando:
create vie, +,-'I(-ARI(S*FE-)AS as
select ?
+rom +,-'I(-ARI(
,ere '()*SE7(R < ;;
6pDs criada a *ie- 4$#CI1#6RI1A_.E#R6AC caso reali)emos um select V na mesma 9select V from
4$#CI1#6RI1A_.E#R6A:C apenas as linhas dos funcionrios cu2o cDdi5o do setor J i5ual a &''
9.endas: seriam exi*idos como resultado=
Para excluir *ie-sC a RR% dispe do comando RR1P .IEc= Aintaxe:
dro& vie, <nome da vis)o>
.ndices )*nde%es*
1s @ndices so mecanismos <ue permitem <ue o 5erenciador de *ancos de dados acesse um dado mais
rpidosM toda,iaC o mecanismo de @ndice no J padro e nem todos os 5erenciadores o implementam= 1s
sistemas criam uma estrutura interna de dados 9o @ndice:C os <uais so en,ol,idosC <uando um comando
de consulta SQL 9um select: J *aseado na coluna do @ndiceC para <ue a consulta se2a processada mais
rapidamente=
GEEK BRASIL http://www.geekbrasil.com.br +3
Banco de "ados * 4 5ro6eto de Banco de "ados
1 comando para criao de @ndices J o CRE6/E I#REb= Aintaxe:
create inde% <nome do Bndice> on <nome da tabela> (<nome da coluna 1>, ..., <nome da coluna n>)
6 t@tulo de exemploC poder@amos ima5inar <ue ,rias consultas en,ol,endo a ta*ela 4$#CI1#6RI1
*aseiam;se na coluna #1EE= Reste modoC de,er@amos criar um @ndice para esta colunaC de modo <ue as
consultas se processem de forma mais rpida:
create inde% I)S*-(9E*+,-' on +,-'I(-ARI( 8-(9E:
Para a excluso de um @ndiceC o comando J o RR1P I#REb= Aintaxe:
dro& inde% <nome da tabela>.<nome do Bndice>
GEEK BRASIL http://www.geekbrasil.com.br +7

You might also like