Vous êtes sur la page 1sur 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
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto 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 @Astem RB no la*oratCrio de
pes<uisa da I!D em @an Eose. Inicialmente foi chamada de @e<uel. Ela sur5iu com o intuito de fornecer
ao FusurioG 9ou desen,ol,edor: uma interface mais ami5,el com os *ancos de dados. 1*te,e 5rande
sucessoB sendo <ue a maioria dos 5erenciadores de *ancos de dados atuais a utili)am.
Em*ora existam inHmeras ,erses do SQLB e cada produto utili)a umaB pode;se di)er <ue as diferenas
che5am a ser secundriasB pois o nHcleoB ou se2aB os principais comandos mantIm o mesmo padro. Em
&83B o 6merican #ational @tandart Intitute 96#@I: pu*licou um primeiro padro SQLB e 5randes
esforos ,em sendo tomados para <ue o padro 6#@I se2a cada ,e) mais o*edecido. 6 primeira 5rande
re,iso do padro @J% foi completa em &+B rece*endo a denominao de SQL2.ContudoB uma no,a
reformulaoB 2 chamada de SQL3B <ue incluir tam*Im o suporte a o*2etosB 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 I
uma lin5ua5em de consultaB entretantoB o seu propCsito inicial foi ampliado e ela permite uma interao
completa com o *ancoB desde a atuali)ao de dadosB criao de ta*elas atI a administrao da *ase de
dados.
Podemos di,idir a lin5ua5em em al5uns mCdulos. @o eles:
K "ata de3inition language +""L, 9%in5ua5em de definio de dados:: 6 SQL fornece comandos
para definioB modificao e remoo de ta*elasB criao de ?ndicesB definio de ,ises. Inclui
tam*Im comandos para especificao de direitos de acessos a ta*elas e ,ises.
K *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*Im comandos para inserirB remo,er e modificar linhas
num *anco de dados.
K *ntegrit7 9Inte5ridade:: 6 SQL possui comandos para se especificar restries de inte5ridadeB como
cha,es primrias e cha,es estran5eiras.
K Transaction control 9Controle de /ransaes:: 6 SQL inclui comandos para especificao de
in?cio e fim de transaesB ,isando a inte5ridade dos dados no momento em <ue ocorrem
atuali)aes.
6 lin5ua5em SQL pode ser utili)ada de duas maneiras diferentes:
K Interati,amente atra,Is de um pro5rama <ue fa) a interface com o *anco de dados. Por exemploB
utili)ando o SQLPlus do Oracle. Ele se encarre5a de manter a conexo com o *anco e o usurio
entra com as instrues SQLB rece*endo as respostas imediatamenteL ou
K Em*utida numa aplicao utili)ando uma lin5ua5em de pro5ramao comumB como PascalB CB
Centura BuilderB Delphi ou Visual BasicB etc.
#esta apostilaB particularmenteB daremos >nfase M 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 FNG 9menor: e FOG 9maior: indicam <ue de,emos su*stituir a frase de indicao por uma
string ,lida para o comando SQL. $tili)ando o exemploB poder?amos su*stituir Nnome da ta*elaO por
4$#CI1#6RI1.
-
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
Juando encontrarmos uma lista do tipo: C&BC+ ... CnB isto indica <ue de,e;se trocar esta se<P>ncia
sim*Clica por uma se<P>ncia de colunas ou ,aloresB dependendo do caso. C&B C+ ... CnB se5uindo o
exemploB poderia ser trocada pelas colunas da ta*ela 4$#CI1#6RI1B ou se2aB C1QR4$#CI1#6RI1B
#1DEB R8B etc.
!locos de comandos limitados pelo s?m*olo FSG 9pipe: so opcionaisB ou se2aB podem ser omitidos sem
in,alidar a expresso. #este casoB a se<P>ncia C&B C+ ... Cn pode ser omitida por estar entre pipes: S 9NC&B
C+ ... CnO: S .
6s outras pala,ras <ue no se encontram entre FN OG ou entre FS SG so o*ri5atCrias 9pala,ras cha,es :. 6s
pala,ras insertB into e )aluesB neste casoB so pala,ras;cha,es.
Tabelas, Colunas e Linas
#os *ancos de dados relacionaisB os dados so arma)enados em relaes ou ta*elas. $m exemplo de
ta*ela poderia conter os dados *sicos dos setores de uma empresaB como seu CCdi5o e seu #ome.
/a*ela de @etores
CCdi5o e #omeB <ue no Dodelo Entidade;Relacionamento 9DER: nCs chamamos de atri*utosB a<ui so
denominados colunas.
$ma linha I a denominao dada a cada instTncia arma)enada na ta*ela de @etoresB ou se2aB 9&''B
.endas: constitui uma linha ou re5istro.
Qa mesma forma <ue os dados so arma)enadosB o resultado de um comando de consulta @J%B tam*Im I
o*tido so* a forma de ta*elasB ou se2aB 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 FControle de Esto<ueG mostrado a se5uir atra,Is do seu Pro2eto Conceitual 9Qia5rama
de Entidades e Relacionamentos: e correspondente dia5rama de ta*elas.
0
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
! "anco de #ados $%em&lo
/odos os exemplos desta apostila esto *aseados num *ancos de dados exemploB <ue se prope a
arma)enarB simplificadamenteB os dados de um controle de esto<ue.
6 se5uirB temos o seu Dodelo de Entidade;Relacionamento 9DER:B se5uido pelo seu Qia5rama de
/a*elas 9ou Qia5rama Relacional:.
U
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
3
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
Linguagem de 'ani&ula()o de #ados *nterativa (#'L)
Como citado anteriormenteB esta poro da lin5ua5em SQL cuida de fornecer aos usurios comandos e
funes para a recuperao de informaesB *em como a atuali)ao destas no *anco de dados.
6 instruo utili)ada para consultas na *ase de dados I a selectB en<uanto para atuali)aes so utili)adas
as instrues insertB para insero de linhasB deleteB para remoo de linhasB e updateB para alteraes nas
linhas.
SELECT
6 estrutura *sica da instruo de consulta select consiste em tr>s clusulas:
K select: = usada para listar os atri*utos dese2ados no resultado da consultaB ou se2aB as colunas
re<uisitadas como respostas.Esta listaB alIm de nomes de colunasB pode conter:
K um asterisco 9V:B indicando <ue todas as colunas de,em ser retornadasL
K expressesL
K constantesL
K funesL
K <ual<uer com*inao destesB conectadas por operadores aritmIticos e par>nteses.
K -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.
K 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 < A1, A2, ..., An >
+rom < R1, R2, ..., Rn >
| ,ere P |
onde:
K 6i : representa uma coluna 9atri*uto: de uma ta*ela RiB uma expressoB constante ou funoL
K Ri : representa uma ta*elaL
K P : uma condio de procura <ue utili)a os atri*utos de R&B ...B Rn.
6 clusula 8*ere pode ser omitidaL neste casoB o predicado I tido como sempre ,erdadeiro e todas as
linhas sero retornadas.
6 lista de colunas na clusula select 96&B ..B 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: FJuais os cCdi5os de todos os
funcionrios <ue fi)eram al5uma re<uisio ao esto<ue WGL a instruo correspondente ser:
select COD_FUNCONARO
+rom REQUSCAO
Eliminao de linhas duplicadas
#o exemplo anteriorB caso um funcionrio ti,esse feito mais de uma re<uisioB o cCdi5o dele teria
aparecido mais de uma ,e) na resposta dada pelo 5erenciador de *anco de dados. EntretantoB a eliminao
de linhas repetidas ou duplicadas I poss?,el utili)ando a pala,ra;cha,e distinct depois de select. Ento
podemos reescre,er a consulta anterior da se5uinte maneira:
7
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
select distinct COD_FUNCONARO
+rom REQUSCAO
#ota;se <ue I 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 I o padroB o uso pala,ra;cha,e all pode ser
omitido. 6*aixo se5ue um exemplo utili)ando all:
select all COD_FUNCONARO
+rom REQUSCAO
Constantes e Expresses
Como citado anteriormenteB a lista da clusula select tam*Im pode conter constantes e expresses.
Exemplo utili;ando constante:
select COD_REQUSCAO, 'datada de', DATA
+rom REQUSCAO
6s constantes utili)adas na clusula selectB alIm de stringsB podem ser de <uais<uer outros tiposB tais
como nHmerosB datasB etc.
Exemplo utili;ando expresso:
select COD_REQUSCAO, ( QTDE / QTDE_MNMA ) / 100
+rom PRODUTO
$ma expresso pode conter uma com*inao de par>nteses e das <uatro operaes aritmIticas *sicas:
K adio 9X:
K su*trao 9;:
K multiplicao 9V:
K di,iso 9Y:
Condies de Procura
$ma condio de procura na clusula 8*ere <ualifica o escopo de um consultaB pois especifica as
condies particulares <ue de,em ser encontradas. 6 clusula 8*ere pode ser usada nas instrues selectB
deleteB update.
Cada condio de procura contIm um ou mais predicados conectados por operadores lC5icos orB andB e
notB conforme o exemplo:
,ere (not -1 and -2) and -. or -/
onde: Pi so predicados da clusula 8*ere.
6 se5uinte ordem de preced>ncia I utili)ada ao a,aliar uma expresso numa condio:
&. Primeiro so analisados as expresses dentro de par>ntesesL
+. 1 operador not I analisado antes do andL
-. 0nd antes do orL
0. 1peradores do mesmo n?,el de preced>ncia so analisados da es<uerda para a direita.
$tili)ando a re5ra de preced>nciaB a ordem de a,aliao dos predicadosB do exemplo anteriorB ser:
&. R& Z not P&
8
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto 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 operadoresB expressesB e constantes para especificar a condio a ser a,aliada.
1s se5uintes tipos de predicados sero discutidos:
K Relacionais
K BETWEE
K !LL
K L"#E
K E$"STS
K "
Predicados Relacionais
1s predicados relacionais so a<ueles <ue relacionam duas expresses se5undo um operador. 1s
se5uintes operadores so suportados:
!&erador 0igni+icado
= gual
!= Diferente
<> Diferente
> Maior
!> No maior (menor ou igual )
< Menor
!< No menor (maior ou igual )
>= Maior ou igual
<= Menor ou igual
$m predicado relacional se5ue a se5uinte sintaxe: <expresso= <operador= <expresso=.
%o5o a*aixo encontra;se um exemplo utili)ando operadores relacionais. #este exemploB <ueremos
o*ter todos os dados dos funcionrios cu2os salrios so maiores ou i5uais a R[ &.'''B'''.
select *
+rom FUNCONARO
,ere SALARO >= 1000
%em*re <ue o uso do asterisco 9V: na clusula select indica o dese2o de <ue todas as colunas se2am
retornadas.
Predicado Between
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:

4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados


select DESCRCAO
+rom PRODUTO
,ere PRECO bet,een 50 and 100
#este exemploB recuperamos todas as descries de produtosB cu2os seus preos esto entre R[
U'B'' e R[ &''B''.
Predicado NULL
1 predicado N.LL testa ,alores nulos. .erificaB por exemploB se colunas no contIm 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 faltandoB
utili)ar?amos a se5uinte instruo:
select COD_FUNCONARO,
NOME
+rom FUNCONARO
,ere ENDERECO is 12LL
= poss?,el utili)ar o operador not 2untamente com a pala,ra;cha,e is 9is not N.LL: paraB por
exemploB montar condies de colunas <ue no possuem ,alores nulos.
Predicado LKE
1 predicado %I(E procura por strin5s <ue se encontram dentro de um determinado padro. 1
predicado %I(E sC pode ser usado com tipos de dados C76R e .6RC76R.
6 sintaxe para o predicado I 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 corin5asB permitindo a procura de su*strin5s. 1s
dois caracteres corin5as existentes so o s?m*olo porcenta5em \]^ e o undescore \R^.
% Equivale a zero ou mais caracteres
_ Equivale a um caracter qualquer
1s exemplos a*aixos mostram a utili)ao do predicado %I(E:
K .erificar todos os funcionrios <ue possuem F@il,aG como Hltimo so*renome.
select *
+rom FUNCONARO
,ere NOME li3e '%Silva'
K Retornar todos os cCdi5os das re<uisies dos produtos <ue os cCdi5os comecem com \'&^.
select COD_REQUSCAO
+rom TENS_REQUSCAO
,ere COD_PRODUTO li3e '01%'
K .erificar todos os produtos onde na descrio aparece a pala,ra \couro^.
&'
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
select *
+rom PRODUTO
,ere DESCRCAO li3e '%couro%'
K Retornar todos os funcionrios cu2o o nome possui uma das preposies: deB do ou da.
select *
+rom FUNCONARO
,ere NOME li3e '% d_ %'
Predicado Exists
= utili)ado para testar se o con2unto de linhas resultantes de uma consulta I ,a)io. @intaxe:
| 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 istoB utili)amos a
se5uinte lC5ica: para cada funcionrio em 4$#CI1#6RI1B pes<uisamos em REJ$I@IC61 se ele
re<uisitou al5o.
select NOME
+rom FUNCONARO
,ere e%ists
( select *
+rom REQUSCAO
,ere FUNCONARO.COD_FUNCONARO =
REQUSCAO.COD_FUNCONARO )
Predicado N
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. @intaxe:
<e%&ress)o> | not | in < subselect >
ou
<e%&ress)o> | not | in < lista de valores >
1s se5uintes exemplos demonstram o uso do predicado in:
K @elecionar todos os dados dos funcionrios <ue no possuem os cCdi5os: &&B +' e +&.
select *
+rom FUNCONARO
,ere COD_FUNCONARO not in (11,20,21)
K @elecionar todas as re<uisies reali)adas por funcionrios <ue rece*em salrios superiores a
R[ &'''B''.
select *
+rom REQUSCAO
,ere COD_FUNCONARO in
( select COD_FUNCONARO
+rom FUNCONARO
,ere SALARO > 1000)
&&
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
Utilizando mais de uma tabela na clusula from
#os exemplos <ue discutimos atI o presente momentoB sC utili)amos uma ta*ela na clusula -romB ou
se2aB pes<uisamos apenas em uma ta*ela indi,idualmente. EntretantoB na maioria dos casosB precisaremos
com*inar e recuperar dados de di,ersas ta*elas simultaneamente. Para conse5uirmos istoB de,emos
relacionar na clusula -rom todas as ta*elas necessrias.
Caso fosse necessrio selecionarB por exemploB todos os funcionrios 9cCdi5o e nome: e seus respecti,os
setores 9cCdi5o e nome: seria preciso extrair dados de duas ta*elas: 4$#CI1#6RI1@ e @E/1RE@B pois
o cCdi5oB nome e cCdi5o do setor do funcionrio poderia ser extra?do da ta*ela 4$#CI1#_RI1@B mas o
nome do setor apenas da ta*ela setor. Qesta maneira a instruo seria a se5uinte:
select COD_FUNCONARO,
FUNCONARO.NOME,
FUNCONARO.COD_SETOR,
SETOR.NOME
+rom FUNCONARO,
SETOR
,ere FUNCONARO.COD_SETOR = SETOR.COD_SETOR
6 lin5ua5em utili)a;se de um mItodo chamado produto cartesiano para resol,er esta <uesto. 1 produto
cartesiano de ta*elasB 5era uma no,a ta*ela auxiliar contendo todas as colunas de todas as ta*elas listadas
na clusula -romB relacionando cada linha de uma ta*ela com todas as outras da se5unda ta*elaB e assim
por dianteB 5erando uma 5rande ta*ela <ue possui todas as com*inaes de linhas posss?,eis.
Para discutirmos melhor este mItodo ima5inemos <ue as nossas ta*elas 4$#CI1#6RI1 e @E/1R
ti,essem os se5uintes dados:
".NCI>N0+I>:
C>D?".NCI>N0+I> N>,E C>D?SE>+ >utras Colunas
&' 6ndrI Pires &'' nononononononononon
&& Ro*erto 6)e,edo &'' nononononononononon
+' Carla Campos +'' nononononononononon
-' Cle*er !arros -'' nononononononononon
6 coluna F1utras ColunasG est representando todas as demais colunas 9R8B CP4B E#QEREC1B
CIQ6QEB E@/6Q1B @6%6RI1: da ta*elaB apenas para simplificar a demonstrao.
SE>+:
C>D?SE>+ N>,E
&'' .endas
+'' PCP
-'' Produo
6plicando o produto cartesiano entre 4$#CI1#6RI1 e @E/1R a ta*ela auxiliar resultante
4$#CI1#6RI1;@E/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
&+
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto 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
.erificamosB entoB <ue a ta*ela 5erada possui todas as colunas de 4$#CI1#6RI1 adicionadas Ms
colunas de @E/1R. #ote <ue para o atri*utos C1QR@E/1R e #1DE foram necessrios <ualificadoresB
representados pelo nome da ta*elaB para no causar am*i5Pidades. @empre <ue colunas com nomes
id>nticos existirem ser necessrio inserir os nomes das ta*elas M frente dos nomes das colunasB para fa)er
a distino.
6 ta*ela resultante ficou com &+ linhasB resultado do produto entre o nHmero de linhas da ta*ela
4$#CI1#6RI1 90 linhas: e a ta*ela @E/1R 9- linhas :. #o entantoB dentre estas linhasB ,rias no t>m
sentido prticoB pois 4$#CI1#6RI1.C1QR@E/1R I diferente de @E/1R.C1QR@E/1R. Qeste modoB
sempre <ue utili)armos ,rias ta*elas numa clusula -romB ou se2aB utili)armos produto cartesianoB
de,emos fa)er o <ue a l5e*ra relacional chama de li5ao naturalB eliminando essas linhas. #o caso a
restrio foi feita atra,Is do predicado F"here 4$#CI1#6RI1.C1QR@E/1R Z
@E/1R.C1QR@E/1RG.
Chaves
6ntes de discutirmos o <ue ,em a ser a li5ao naturalB de,emos discutir o conceito de cha,es 9%eys:.
#um *anco de dados relacionalB existem dois tipos de cha,es:
C*a)e /rim@ria 2%rimar7 8e73
$ma cha,e primria I 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
DER.Por exemploB na ta*ela @E/1RB o cCdi5o 9C1QR@E/1R: identifica unicamente cada linha.
Qeste modoB uma cha,e primria I um ,alor <ue no pode se repetir dentro de uma mesma ta*ela.
C*a)e Estrangeira 23oreign 8e73
$ma cha,e estran5eira I uma ou mais colunas numa ta*ela <ue so cha,es primrias em outra
ta*elaB o <ue si5nifica <ue <ual<uer ,alor para uma coluna <ue I cha,e estran5eira de,e
corresponder a um ,alor existente na outra ta*ela onde a coluna I cha,e primria.#a lin5ua5em dos
sistemas 5erenciadores de *anco de dadosB isto I conhecido como integridade re-erencial. Por
exemploB temos o cCdi5o do setor 9C1QR@E/1R: na ta*ela 4$#CI1#6RI1 <ue I uma cha,e
estran5eira para o campo de mesmo nome na ta*ela @E/1R onde este I cha,e primria.
Qecorrente do conceito de cha,e estran5eiraB tam*Im 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:
K +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 exemploB I o <ue acontece
nas ta*elas @E/1R e 4$#CI1#6RI1B onde um setor somente pode ser remo,ido caso no
exista nenhum funcionrio pertencente M<uele setorL
K Em Cascata 2cascade3: este re5ra determina <ue a excluso de uma linha numa ta*ela
disparaB automaticamente 9em cascata:B a remoo de todas as linhas <ue referencia,am o
seu ,alor como cha,e estran5eira na outra ta*ela. #o exemploB I o <ue ocorre entre as
ta*elas REJ$I@I`a1 e I/E#@RREJ$I@I`a1B onde a remoo de uma re<uisio
ocasiona a remoo automtica de todos os seus itensB ou se2aB a remoo de todas as linhas
da ta*ela I/E#@RREJ$I@I`a1 <ue referencia,am a re<uisio exclu?da.
ContudoB de,e;se ressaltar <ue a re5ra de deleo I definida para cada relao entre duas ta*elas
separadamente. Qeste modoB I poss?,el a ocorr>ncia de casos onde uma cha,e primria I
referenciada como cha,e estran5eira de re5ra restrict por uma ta*elaB e como re5ra cascade por
&-
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
outra. = o <ue ocorre com a ta*ela PR1Q$/1 do nosso exemplo. $m produto somente poder ser
remo,ido se no existirem nenhuma linhas nas ta*elas I/E#@RQE.1%$`a1 e
I/E#@RREJ$I@I`a1 <ue o referenciem e tam*Im na ta*ela C1DP1@I`a1 caso ele aparece
como componente de outro produto. EntretantoB caso o produto aparea somente como compostoB
ele poder ser normalmente exclu?do e todas as suas composies 9linhas <ue o referenciam como
composto na ta*ela C1DP1@I`a1: tam*Im sero remo,idas automaticamente.
Variveis Tuplas
@J% empresta a noo de ,ar,eis tuplas do Clculo Relacional de tuplas. $ma ,ari,el /upla em @J%
de,e ser associada a uma relao particularB definida na clusula -rom. Para ilustrarB ,amos reescre,er
uma das consultas anteriores utili)ando esse no,o conceito. 6 consulta Fselecionar todos os funcionrios
9cCdi5o e nome: e seus respecti,os setores 9cCdi5o e nome:GB utili)ando ,ari,eis tuplas ficaria assim:
select T.COD_FUNCONARO, T.FUNCONARO_NOME,
S.COD_SETOR, S.NOME
+rom FUNCONARO T, SETOR S
,ere T.COD_SETOR = S.COD_SETOR
.ar,eis /uplas so particularmente importantes <uando <ueremos comparar duas tuplas numa mesma
relaoB o <ue no seria poss?,el simplesmente com a aplicao do produto cartesiano. Por exemploB a
consulta Fselecionar todos os funcionrios <ue tra*alham no mesmo setor <ue o funcionrio de cCdi5o
+'GB resultaria na se5uinte sentena @J%:
select S.COD_FUNCONARO
+rom FUNCONARO T,S
,ere T.COD_FUNCONARO = 20 and
T.COD_SETOR = S.COD_SETOR
#ote <ue a ,ari,el / foi utili)ada para locali)ar a tupla relati,a ao funcionrio de cCdi5o +' e seu
respecti,o setorB ao passo <ue a ,ari,el @ foi utili)ada para locali)ar todos os funcionrios <ue tra*alham
neste setor. 6 ,ari,el @ selecionar inclusi,e o prCprio funcionrio de cCdi5o +'.
Operaes de Conjuntos
6 l5e*ra relacionalB na <ual a SQL se *aseiaB inclui as operaes union5 intersect e minus5 para 2unes
de con2untos. EntretantoB apenas a instruo union foi inclu?da no padro 6#@I da lin5ua5em SQL. Isto
no che5a a ser um pro*lemaB 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 unionB ,amos considerar <ue a se5uinte consulta se2a
re<uisitada: fornea todos os cCdi5os dos funcionrios <ue pro,ocaram <ual<uer mo,imentao no
esto<ueB ou se2aB uma re<uisio ou uma de,oluo.
Para recuperarmos os funcionrios <ue re<uisitaram produtosB utili)ar?amos a se5uinte instruo:
select COD_FUNCONARO
+rom REQUSCAO
Para a<ueles <ue de,ol,eram al5um produto:
select COD_FUNCONARO
+rom DEVOLUCAO
65ora para fa)ermos a unio destes dois con2untos de ,aloresB utili)amos o operador union. 6ssim a
instruo resultante I:
&0
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
select COD_FUNCONARO
+rom REQUSCAO
union
select COD_FUNCONARO
+rom DEVOLUCAO
@e a consulta fosse os cCdi5os dos funcionrios <ue participaram de uma re<uisio e de uma de,oluoB
ter?amos:
select COD_FUNCONARO
+rom REQUSCAO
intersect
select COD_FUNCONARO
+rom DEVOLUCAO
1 mesmo resultado o*ter?amos com a se5uinte sentena:
select COD_FUNCONARO
+rom REQUSCAO
,ere COD_FUNCONARO in
(select COD_FUNCONARO
+rom DEVOLUCAO)
@e a consulta fosse para o*ter os cCdi5os dos funcionrios <ue participaram de al5uma re<uisioB mas
no participaram de nenhuma de,oluoB ter?amos:
select COD_FUNCONARO
+rom REQUSCAO
minus
select COD_FUNCONARO
+rom DEVOLUCAO
1 mesmo resultado o*ter?amos com a se5uinte sentena:
select COD_FUNCONARO
+rom REQUSCAO
,ere COD_FUNCONARO not in
(select COD_FUNCONARO
+rom DEVOLUCAO)
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 inB respecti,amente.
= importante ressaltar <ue o operador union trata as ta*elas como con2untosB e pela re5ra de unio de
con2untosB ,alores duplicados so descartados. 6ssimB se um funcionrio re<uisitou e de,ol,eu al5um
produtoB ele aparecer apenas uma ,e) na lista resultante. Caso se2a necessrio manter as duplicaesB
de,e;se utili)ar o operador union all ao in,Is de union.
&U
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
Exibindo Resultados Ordenados
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*Itica todos os funcionrios do setor &''B
escre,emos:
select F.NOME, COD_FUNCONARO
+rom FUNCONARO F,
SETOR S
,ere F.COD_SETOR = S.COD_SETOR and
S.COD_SETOR = 100
order b5 F.NOME
Como padroB SQL lista itens na ordem ascendente. Para especificar a ordem de classificaoB podemos
especificar desc para descendente ou asc para ascendente. 6lIm do maisB a ordenao pode ser feita por
mHltiplos atri*utosB *astandoB para isto list;los na clusula order 1A. @uponha <ue fosse necessrio 5erar
uma lista contendo as re<uisies reali)adas em ordem descendenteB ou se2aB primeiro pelos mais
recentes. Para as re<uisies reali)adas no mesmo momentoB ordenamos em ordem ascendente pelo
nHmero da re<uisio. #este caso o comando SQL seria:
select *
+rom REQUSCAO
order b5 data desc, COD_REQUSCAO asc
Para atender a clusula order 1AB SQL precisa executar uma classificao. $ma ,e) <ue uma
classificao de um 5rande nHmero de linhas pode ser custosoB de,e;se utili);la apenas <uando
necessrio.
Funes de agregao
SQL oferece a possi*ilidade de computar funes em 5rupos de linhas usando a clusula group 1A. 1s
atri*utosB 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:
K mIdia: a)g
K m?nimo: min
K mximo: max
K total: sum
K contar: count
6s operaesB como a a)gB so chamadas funes de a5re5aoB por<ue operam em a5re5aes de linhas.
1 resultado de uma funo de a5re5ao I um ,alor Hnico. Para ilustrarB considere a consulta F@elecione
o salrio mIdio em cada setor da empresaG. 6 instruo ficaria assim:
select COD_SETOR,
avg (SALARO)
+rom FUNCONARO
grou& b5 COD_SETOR
&3
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
4unes de 65re5ao e seus resultados
Qe,e;se notar <ue as funes @$D e 6.8 somente aceitam expresses numIricas como ar5umentosB
uma ,e) <ue elas calculam a soma e a mIdia de ,aloresB respecti,amente. 6s demais 9C1$#/B D6b e
DI#: aceitam <ual<uer tipo de dado na expresso como parTmetro.
6 principal particularidade a ser ressaltada I com relao M funo C1$#/. C1$#/9expresso: e
C1$#/9V: so sutilmente diferentesB uma ,e) <ue C1$#/9expresso: no conta as linhas nulas e
C1$#/9V: reali)a a conta5em de todas as linhasB se2am elas nulas ou no.
1utra <uesto a ser ressaltada com relao M utili)ao da clusula group 1A I <ue a lista de ,alores da
clusula select somente aceita funes de a5re5aoB constantes e expresses com*inando;asB alIm dos
campos listados na clusula group 1A. /al restrio I e,identeB uma ,e) <ue a incluso de outros campos
na lista do select seria totalmente sem sentido e imposs?,el de ser retornada.
PorImB podemos tam*Im usar as funes de a5re5ao sem a clusula group 1A. #este caso a ta*ela
inteira I tratada como um Hnico 5rupo. $ma consultaB para contar o nHmero de funcionrios da sua
empresaB pode ser expressa da se5uinte maneira:
select count (* )
+rom FUNCONARO
A Clusula HAVNG
Em certas situaesB I necessrio definir uma condio <ue se apli<ue a 5ruposB ao in,Is de linhas.
Ima5ine se esti,Issemos interessados em sa*er o salrio mIdio apenas da<ueles setoresB cu2o salrio
mIdio se2a maior <ue R[ &&''B''. Esta condio no se aplica a linhas simplesB mas sim a cada 5rupo
constru?do com a clusula group 1A. Qeste modoB 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 5ruposB para <ue funes de a5re5ao possam ser usadas.
Expressamos esta consulta SQL assim:
select COD_SETOR,
avg (SALARO)
+rom FUNCONARO
grou& b5 COD_SETOR
aving avg (SALARO) > 1100
@e uma clusula 8*ere e uma clusula *a)ing aparecerem numa mesma consultaB o predicado na
clusula 8*ere I aplicado primeiro. 6s linhas <ue satisfa)em a condio da clusula 8*ere so ento
a5rupadas pela clusula group 1A. Em se5uidaB o predicado da clusula *a)ing I aplicado a cada 5rupo.
Ilustrando a utili)ao de 8*ere e *a)ing na mesma instruoB faremos a se5uinte consulta: cCdi5o do
produto e <uantidade total re<uisitadaB para os produtos <ue possuem <uantidade total re<uisitada maior
<ue &'.
select COD_PRODUTO,
sum (QTDE )
&7
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
+rom REQUSCAO R,
TENS_REQUSCAO
,ere R.COD_REQUSCAO = .COD_REQUSCAO
grou& b5 COD_PRODUTO
aving sum (QTDE) > 100
Consultas Complexas
@J% permite <ue al5uns consultas mais ela*oradas possam ser feitasB utili)ando apenas ,ari,eis tuplas
sem as funes de a5re5ao. Por exemploB uma sentena em @J% para de,ol,er todos os setores <ue t>m
mais <ue &U funcionrios alocadosB seria:
select distinct S.NOME
+rom SETOR S
,ere ( select count(6)
+rom FUNCONARO T
,ere T.COD_SETOR = S.COD_SETOR) > 15
&8
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
7un(8es "uilt9in
6lIm dos comandosB clusulas e funes a5re5adas da lin5ua5em SQLB os 5erenciadores de *ancos de
dados disponi*ili)am uma sIrie de outras funes para a2udar o usurio na manipulao dos dados. Estas
funes podem ser utili)adas normalmente com as instrues SQL comuns.
ContudoB essas extenses acarretam uma 5rande des,anta5em <uando se pretende desen,ol,er sistemas
multiplataformasB pois estas funes so espec?ficas para cada ser,idor de *anco de dados. Por exemploB
uma funo de con,erso de inteiro para strin5B por exemploB I diferente entre o Oracle e o Sy&ase.
1 Oracle fornece um 5rande con2unto de funes para manipular strin5sB datas e nHmeros. Qentre elasB
podemos destacar:
Funes para manipulao de strings
7un()o -ro&:sito
ASC(x) Retorna o valor numrico ASC do caracter x
CHR(x) Retorna o caracter ASC correspondente ao inteiro x
CONCAT(x,y) Retorna x concatenado com y
NTCAP(x) Retorna a string x com a primeira letra de cada palavra em maiscula e as
restantes em minscula (nome
prprio)
LENGTH(x) Retrona o tamanho da string x
LENGTHB(x) Retorna o tamanho em bytes da string x
LOWER(x) Retorna a string x com todas as letras em minscula
LTRM(x|,y|) Elimina caracteres esquerda da string x e retorna a string resultante. Se
y no for especificado, caracteres
em branco sero removidos. O valor da string y (opcional) o conjunto de
caracteres a ser eliminado
REPLACE(x,y|,z|) Retorna a string x com todas as ocorrncias de y substitudas por z. Se z
for omitido, todas as ocorrncias de
y sero simplesmente removidas
RTRM(x|,y|) Elimina caracteres direita da string x e retorna a string resultante. Se
y no for especificado, caracteres em branco sero removidos. O valor da
string y (opcional) o conjunto de
caracteres a ser eliminado
SUBSTR(x,y|,z|) Retorna a parte da string x, iniciando com o caracter y. Se z for
especificado, a funo retorna z caracteres a partir de y (inclusive);
caso contrrio, a parte retornada vai
at o final da string x
UPPER(x) Retorna a string x com todas as letras em maiscula
$m exemploB de utili)ao das funes de manipulao de stringsB seria a eliminao de todos os espaos
em *ranco <ue tenham sido di5itados M direita dos nomes dos funcionrios:
u&date FUNCONARO
set NOME = ;T;*'(NOME)
&
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
Funes para manipulao de nmeros
7un()o -ro&:sito
ASC(x) Retorna o valor absoluto de x
CEL(x) Retorna o menor inteiro superior ou igual a x
COS(x) Retorna o co-seno de x
COSH(x) Retorna o co-seno hiperblico de x
EXP(x) Retorna e elevado potncia de x
FLOOR(x) Retorna o maior inteiro inferior ou igual a x
LN(x) Retorna o logaritmo natural de x
LOG(x,y) Retorna o logaritmo de base x de y
MOD(x,y) Retorna o resto de x dividido por y
POWER(x,y) Retorna o x elevado potncia y
ROUND(x|,y|) Retorna o x arredondado y casas direita da casa decimal. O valor padro
de y, caso seja omitido, 0 (zero)
SGN(x) Retorna o sinal de x como -1 se x for negativo; 0 (zero) se x for 0 (zero); e
1 se x for positivo
SN(x) Retorna o seno de x
SNH(x) Retorna o seno hiperblico de x
SQRT(x) Retorna a raiz quadrada de x
TAN(x) Retorna a tangente de x
TANH(x) Retorna a tangente hiperblica de x
TRUNC(x|,y|) Retorna x truncado para y casas decimais. O valor padro de y, caso
omitido, 0 (zero)
Para exemplificar o uso de funes de manipulao de nHmerosB dese2amos eliminar os centa,os dos
preos dos produtosB arredondando todos os preos para cima.
u&date PRODUTO
set PRECO = C$*L(PRECO)
Funes para manipulao de datas
7un()o -ro&:sito
ADD_MONTHS(x,y) Retorna a data x acrescida de y meses
LAST_DAY(x) Retorna o ltimo dia do mesmo da data x
MONTHS_BETWEEN(x) Retorna o nmero de meses entre as datas x e y
SYSDATE Retorna a data e hora atuais do sistema
Para exemplificar o uso de funes de manipulao de datasB dese2amos sa*er <uantos meses decorreram
desde a primeira re<uisio do produto \'&'&''&^ atI a data atual.
select '!1T<0="$T>$$1(MN(R.DATA),0?0#@T$)
+rom REQUSCAO R,
TENS_REQUSCAO R
+'
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
,ere R.COD_REQUSCAO = R.COD_REQUSCAO and
R.COD_PRODUTO='0101001'
Funes de converso
7un()o -ro&:sito
TO_CHAR(x|,y|) Converte uma data ou um nmero x em uma string de caracteres. A string
y define o formato de converso da
data ou nmero. Exemplos de formato so 'dd-MM-yyy' e '999.99'
TO_DATE(x|,y|) Converte a string x em uma data, usando o modelo de formato y
TO_NUMBER(x|,y|) Converte a string x em um nmero, usando o modelo de formato y
$m exemplo do uso de funes de con,ersoB seria um comando select <ue retornasse o ,alor numIrico
dos anos em <ue foram reali)adas re<uisies ao esto<ue.
select distinct T!=12'"$;(T!=C<@;(DATA,'yyyy'))
+rom REQUSCAO
+&
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
'odi+icando o "anco de #ados
6tI o presente momentoB restrin5imos nossa ateno M consulta ao *anco de dados. 65ora discutiremos as
instrues da SQL para atuali)ao do *ancoB atra,Is dos comandos insert5 delete e update.
Inserindo Linhas INSE!T
Para inserir um dado numa ta*elaB podemos fa)>;lo de duas formas:
K especificando uma linha a ser inseridaB ou se2aB os campos e seus ,aloresL
K escre,endo uma consulta cu2o o resultado se2a um con2unto de linhas a serem inseridas.
6 primeira maneira I mais simplesB pois inserimos uma linha por ,e)B atri*uindo ,alores as colunas da
ta*ela. @intaxes:
insert into <nome da tabela> | (<C1, C2 ... Cn>) | values (< V1, V2 ... Vn >)
insert into <nome da tabela> <select ... +rom ... ,ere ...>
onde:
K Ci : nome da coluna
K .i : ,alor a ser inserido. Pode ser uma constante ou uma expresso.
1s nomes das colunas podem ser omitidosB 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 SETOR
(COD_SETOR, NOME )
values (500, 'Compras')
Qe,e;se notar <ue ao fa)er uma insero todas as restries 9c'nstraints: de inte5ridade referencial
declaradas sero processadasB de modo a preser,ar a consist>ncia dos dados. #a ta*ela @E/1R h apenas
a restrio de cha,e;primria 9C1QR@E/1R:B <ue no permitir a insero de um setor com o mesmo
cCdi5o. EntretantoB em outras ta*elasB como a 4$#CI1#6RI1B existem restries de cha,e estran5eira.
Esta restrio no permitir <ue um funcionrio se2a inserido num setor inexistenteB ou se2aB <ue o seu
C1QR@E/1R no exista na ta*ela @E/1R.
Pode;se tam*Im fa)er uma insero atra,Is do resultado de uma consulta. Conse5uimos assim fa)er uma
insero em lote. Ima5inemos um casoB onde a re<uisio de cCdi5o &'&U reali)ada pelo funcionrio &'B
de,e ser extornadaB ou se2aB todos os itens <ue constam como re<uisitados de,ero ser lanados na
de,oluo de cCdi5o U''U com a mesma data da re<uisio. Qe,er?amos fa)er os se5uintes inserts:
insert into DEVOLUCAO
select 5005,
COD_FUNCONARO,
DATA
+rom REQUSCAO
,ere COD_REQUSCAO = 1015
insert into TENS_DEVOLUCAO
select 5005,
COD_PRODUTO,
QUANTDADE
+rom TENS_REQUSCAO
,ere COD_REQUSCAO = 1015
++
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
#o exemplo dado so*re insert considerou;se <ue todos os ,alores foram dados. PorIm isto no I uma
re5raB pois h caso de colunas <ue aceitam ,alores nulos. Qeste 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 FUNCONAROS
(COD_FUNCONRO, COD_SETOR, NOME, RG, CPF,
ENDERECO, CDADE, ESTADO, SALARO)
values (51,500,'Jos Martins',null,null,null,null,null,1300)
Com esta instruoB inserimos o funcionrio EosI Dartins. /odas as colunas <ue poderiam conter ,alores
nulos 9R8B CP4B E#QEREC1B CIQ6QEB E@/6Q1:B se5undo suas definies no *anco de dadosB
rece*eram null como conteHdo. 1utra forma de fa)er esta insero seria explicitando apenas os nomes
das colunas <ue rece*eriam ,alores nulos. Qesta outra formaB o exemplo acima ficaria do se5uinte modo:
insert into FUNCONAROS
(COD_FUNCONRO, COD_SETOR, NOME, SALARO)
values (51,500,'Jos Martins',1300)
!emovendo Linhas "ELETE
$ma re<uisio de remoo I expressa da mesma forma <ue uma consulta. Podemos remo,er apenas
linhas inteirasB e no apenas al5uns atri*utos. 6 instruo delete possui a se5uinte sintaxe:
delete +rom <nome da tabela> | ,ere < condi()o de &rocura > |
@e dese2armos remo,er linhas de di,ersas ta*elasB 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*Im omitir a clusula 8*ereB contudo de,emos ter muito cuidadoB poisB neste casoB todas as
linhas da ta*elas sero exclu?das.
Em se5uida I mostrado um comando delete <ue exclui um item de uma re<uisio:
delete +rom TENS_REQUSCAO
,ere COD_REQUSCAO = 432 and
COD_PRODUTO = '0101001'
6ssim como na inseroB a remoo de linhas tam*Im ocasiona o processamento de todas as restries
relati,as a inte5ridade referencial tan5entes M ta*ela <ue est sofrendo a remoo.
#ota;se <ue neste delete no ha,er nenhum pro*lema <uanto as restries declaradasB pois as cha,es
primrias da ta*ela I/E#@RREJ$I@IC61 no so cha,e estran5eira em nenhuma outra ta*ela.
PorImB se tentarmos excluir um funcionrioB poder?amos ter pro*lemasB se no relacionamento entre
4$#CI1#6RI1 e QE.1%$C61 ou REJ$I@IC61B a restrio relati,a a cha,e estran5eira
C1QR4$#CI1#6RI1 esti,er confi5urada como restrict 9<ue I o caso do nosso exemplo:. #este casoB a
deleo sC iria se procederB caso o funcionrio a ser exclu?do no ti,esse feito nenhuma re<uisio ou
de,oluo. @e a re5ra de deleo esti,er setada como cascadeB 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 procuraB para selecionar as linhas <ue dese2amos <ue sofram
modificaes. @intaxe do comando update:
u&date <nome da tabela> set (C1 A V1, C2AV2 ... Cn A Vn) | ,ere <condi()o de &rocura> |
onde:
K Ci : coluna da ta*elaL
+-
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
K .i : no,o ,alorB podendo ser uma constanteB ou uma expresso.
@uponha <ue <ueiramos atuali)ar os slarios dos funcionrios do setor +'' em &']. $tili)ar?amos a
se5uinte instruo:
u&date FUNCONARO
set SALARO = SALARO * 1.1
,ere COD_SETOR = 200
6ssim como no comando deleteB a clsula 8*ere tam*Im pode ser omitida no update. Qeste modoB
todas as linhas da ta*ela sofreriam a atuali)ao.
@upondo <ue dese2emos atuali)ar o salrio de todos os funcionrios em &']B independentemente do
setorB a instruo SQL se resumiria a:
u&date FUNCONARO
set SALARO = SALARO * 1.1
+0
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto 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 citadoB as ta*elas so os *locos *sicos de construo de <ual<uer *anco de dados eB com os
comandos de definio de dados da lin5ua5em @J%B podemos criarB excluir e alterar ta*elas.
Juando se cria uma ta*ela com @J%B na ,erdadeB so definidas as colunasB com seus tipos e outras
caracter?sticasB <ue cada linha criada na ta*ela arma)enar.Para a definio de uma coluna so
necessrios: um nomeB um tipo e se a coluna permitir o arma)enamento de ,alores nulos.
1 comando para criao de ta*elasB I o C+E0E 0BLE. EisB 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/ER/6!%EB citamos o comando para criao da ta*ela de setores:
create table SETOR
( COD_SETOR smallint not null,
NOME varchar(30) not null )
1 padro SQL()2 9tam*Im 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:
K /+I,0+B CEB
K DE"0.L: <uando um campo for declaradoB I poss?,el especificar o seu ,alor defaultB ou se2aB se
na insero de uma linha este campo no ti,er um ,alor fornecidoB o ,alor default I arma)enado.
Isto I Htil <uando se tem uma 5rande <uantidade 9<uase maioria: de linhas onde uma coluna
assume sempre um mesmo ,alor. Qeste modoB somente seria necessrio especificar um ,alor para
esta colunaB numa inseroB <uando este fosse diferente do defaultB ou se2aB em poucos casos.
K CDECC: restrin5e a faixa de ,alores <ue a coluna pode assumir. Restries de chec% so tam*Im
chamadas de re5ras 9rules: ou re5ras de ,alidao 9*alidati'n rules:B uma ,e) <ue permitem <ue o
prCprio 5erenciador de *ancos de dados ,erifi<ue se o ,alor sendo atri*u?do para a coluna est
dentre os ,alores ,lidos.
K +E"E+ENCES: caso uma coluna se2a definida com RE4ERE#CE@B ou se2aB a coluna I uma
cha,e estran5eiraB <uando um ,alor est para ser atri*u?do para esta colunaB primeiro I ,erificado
se o mesmo ,alor existe na ta*ela e coluna referenciadas.
K .NIQ.E: 5arante <ue ,alores para uma coluna no se repitam dentro da ta*ela. Esta restrio
tam*Im impe <ue a coluna no possa aceitar ,alores nulos.
Como exemplo da definio de restriesB temos um comando para criao da ta*ela REJ$I@I`a1:
create table REQUSCAO
( COD_REQUSCAO smallint primary key,
COD_FUNCONARO smallint not null references FUNCONARO,
DATA date default SYSDATE
check (DATA <= TO_DATE('01-01-1980','dd-MM-yyyy') ) )
Qe,e;se notar <ue na definio da ta*ela REJ$I@IC61 foram utili)adas al5umas funes &uilt(in do
1racleB as <uais de,em ser su*stitu?das caso a ta*ela se2a 5erada em outro 5erenciador de *ancos de
dados.
E com relao Ms re5ras de deleoB a sua definio ,aria de acordo com cada 5erenciador. #o OracleB
ela pode ser declarada apCs a restrio re+erences.
+U
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
1utra <uesto a ser ressaltada I <ue <uando a cha,e primria I composta por mais de um campoB esta
de,e ser declarada apCs todos os campos.
.e2amos como ficaria um exemploB acrescentando uma re5ra de deleo e uma cha,e primria com mais
de um campo. Qe,e;se considerar <ueB no 1racleB a re5ra de deleo default I a restrita 9restrict::
create table TENS_REQUSCAO
( COD_REQUSCAO smallint not null references REQUSCAO
on delete cascade,
COD_PRODUTO char(7) not null references PRODUTO,
DATA float not null )
6 lin5ua5em SQL tam*Im permite a alterao de componentes de uma ta*ela. 1 comando utili)ado para
este fim I o 6%/ER /6!%E. @ua sintaxe inclui pala,ras;cha,e para adicionar e remo,er colunasB *em
como alterar seus atri*utos de nomeB tipo de dadoB tamanhoB etc. @intaxe:
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 | )
ContudoB de,e;se considerar <ue as alteraes de ta*elas 5o)am de al5umas restries em certos
5erenciadores de *ancos de dadosB ,etandoB por exemploB a adio de uma coluna <ue no permita ,alores
nulosB numa ta*ela <ue 2 contIm linhas arma)enadas.
6 QQ% tam*Im dispe de um comando para excluir ta*elas: o QR1P /6!%E. @intaxe:
dro& table <nome da tabela>
-ises )Vie,s*
$ma ,iso ,*ie-. permite <ue ,oc> associe os resultados de uma consulta a um nomeB <ue ,oc> pode
utili)ar em outras consultasB como se fosse uma ta*ela normal. Juando ,oc> acessa uma *ie-B a consulta
<ue est definida para esta I executada e os resultados desta tra*alham com uma no,a ta*ela *ase para a
no,a consulta <ue est sendo praticada. @intaxe:
create vie, <nome da vis)o> as <select ... +rom ... ,ere ...>
Como exemploB poder?amos criar uma ,iso de nome 4$#CI1#6RI1@R.E#Q6@B a <ual conteria
apenas os funcionrios do setor de .endas. Eis o comando:
create vie, FUNCONAROS_VENDAS as
select *
+rom FUNCONARO
,ere COD_SETOR = 100
6pCs criada a *ie- 4$#CI1#6RI1@R.E#Q6@B caso reali)emos um select V na mesma 9select V from
4$#CI1#6RI1@R.E#Q6@:B apenas as linhas dos funcionrios cu2o cCdi5o do setor I i5ual a &''
9.endas: seriam exi*idos como resultado.
Para excluir *ie-sB a QQ% dispe do comando QR1P .IEc. @intaxe:
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
rpidosL toda,iaB o mecanismo de ?ndice no I padro e nem todos os 5erenciadores o implementam. 1s
sistemas criam uma estrutura interna de dados 9o ?ndice:B os <uais so en,ol,idosB <uando um comando
de consulta SQL 9um select: I *aseado na coluna do ?ndiceB para <ue a consulta se2a processada mais
rapidamente.
+3
4uc0Cam%inas 5 Banco de "ados * 5 4ro6eto de Banco de "ados
1 comando para criao de ?ndices I o CRE6/E I#QEb. @intaxe:
create inde% <nome do Bndice> on <nome da tabela> (<nome da coluna 1>, ..., <nome da coluna n>)
6 t?tulo de exemploB poder?amos ima5inar <ue ,rias consultas en,ol,endo a ta*ela 4$#CI1#6RI1
*aseiam;se na coluna #1DE. Qeste modoB de,er?amos criar um ?ndice para esta colunaB de modo <ue as
consultas se processem de forma mais rpida:
create inde% DX_NOME_FUNC on FUNCONARO (NOME)
Para a excluso de um ?ndiceB o comando I o QR1P I#QEb. @intaxe:
dro& inde% <nome da tabela>.<nome do Bndice>
+7

Vous aimerez peut-être aussi