Sunteți pe pagina 1din 4

Restricia CHECK Acest tip de constrngeri specific o condiie ce trebuie s fie ndeplinit de datele introduse n coloana (sau coloanele)

asupra creia acioneaz. O astfel de constrngere poate limita valorile care pot fi introduse n cadrul unei coloane. Iat cteva exemple de reguli de validare pentru tabela elevi care pot fi implementate cu ajutorul constrngerilor de tip CHECK: numele i prenumele unui elev trebuie s nceap cu o majuscul restul literelor fiind litere mici nota unui elev nu poate fi mai mare de 10 cmpul bursier poate avea doar valorile 'D' i NULL numrul de absen e nemotivate va fi cel mult egal cu numrul total de absen e !rearea tabelei elevi n aceast situa ie se poate scrie astfel: CREATE TABLE elevi ( nr_matr NUMBER(5) PRIMAR KE ! "n# NUMBER(1$) C%N&TRAINT "n#_'( UNI)UE! n'me *ARCHAR+($0) N%T NULL CHECK n'me,LTRIM(INITCAP(n'me))! #ren'me *ARHAR+($0) N%T NULL CHECK #ren'me,LTRIM(INITCAP(#ren'me)) -'r.ier CHAR(1) CHECK -'r.ier,/D/! n0ta NUMBER(1!+) C%N&TRAINT n0ta_"( CHECK n0ta2,10 t0tal_a-. NUMBER($)! a-._nem0tiv NUMBER($)! CHECK (a-._nem0tiv2,t0tal_a-.) )

Interogari multiple
"n capitolele anterioare am aflat cum putem afia informa ii din ba#a de date$ ns la fiecare rulare a unei comen#i &ELECT am afiat date dintr%o singur tabel. &nul dintre re#ultatele procesului de normali#are este acela c datele sunt memorate$ de cele mai multe ori$ n tabele diferite. 'e aceea$ la afiarea diferitelor rapoarte va trebui s pute i prelua date din mai multe tabele printr%o singur comand ()*. Din fericire SQL ofer faciliti pentru combinarea datelor din mai multe tabele i afiarea lor ntr-un singur raport. astfel de operaie se numete !oin" sau interogare multipl. +e parcursul acestui capitol vom folosi ca exemple tabela Per.0ane a crei c,eie primar este atributul I3Per.0ana$ tabela 4irme a crei c,eie primar este atributul I34irm$ i tabela 50-'ri cu c,eia primar I350-. +resupunem c aceste tabele con in urmtoarele nregistrri: #abelul $$.%.&. -abela Per.0ane $D'()S *+* . 1 5 7 2 9 ; < +,-( Ionescu 3asilescu +opescu /eorgescu 8arinescu Antonescu 0isc,in Olaru ')(+,-( /,eorg,e 3asile Ioan 8aria Angela :lena +arasc,in Angela L .*L$#*#( 0rasov !luj%4apoca 0ucuresti Iasi (ibiu (ibiu 0rasov +loiesti $D/$)11 .2 .6 56 % .6 .2 11 $D0 1 2 . 1 9 5 . % 1

#abelul $$.%.%. -abela 50-'ri #abelul $$.%.2. -abela 4irme $d/irm .6 .2 16 11 +ume (! !risib (A (! (oft!om (! -im-ip 0rasoveanca Localitate (ibiu Alba Iulia -imisoara 0rasov $d0ob & 2 3 % 4 5 +ume =epre#entant 3an#ari 8anager Operator I+rogramator Administrator Administrator retea

"n Oracle exist dou moduri diferite de a scrie joinurile: +rima metod folosete sintaxa specific Oracle. "n acest ca# condi iile de join sunt incluse n clau#a 6HERE. Aceast metod este mai uor de n eles$ ns are de#avantajul c n aceeai clau# 6HERE se includ att condi iile de filtrare a nregistrrilor afiate ct i condi iile de join. A doua variant folosete sintaxa A4(I>I(O$ care este pu in mai greoaie$ ns comen#ile scrise folosind aceast sintax sunt portabile i n alte (/0'%uri care folosesc limbajul ()*. Indiferent de sintaxa folosit exist mai multe moduri de legare a tabelelor i anume: 'rodusul cartezian ? leag fiecare nregistrare dintr%o tabel cu toate nregistrrile din cealalt tabel. (6ui!oin ? sunt legate dou tabele cu ajutorul unei condi ii de egalitate +on(6ui!oin % n acest ca# condi ia de join folosete alt operator dect operatorul de egalitatea Self0oin ? este legat o tabel cu ea nsi$ e folosit de obicei n conjunc ie cu rela iile recursive. uter0oin ? sunt o extensie a e@uijoinului$ cnd pentru unele nregistrri dintr%o tabel nu exist corespondent n cealalt tabel$ i dorim ca aceste nregistrri fr corespondent s fie totui afiate. I.3.1. Produsul cartezian a) Sintaxa Oracle 'up cum am preci#at$ acest tip de legtur ntre dou tabele$ va lega fiecare rnd din prima tabel cu fiecare rnd din cea de a doua tabel. 'e exemplu comanda:

&ELECT #7n'me! #7#ren'me! 87n'me 4R%M #er.0ane #! 8irme 8


3a afia urmtoarele informa ii +rodusul carte#ian ntre tabelele Per.0ane i 4irme +ume Ionescu 3asilescu +opescu /eorgescu 8arinescu Antonescu 0isc,in Olaru Ionescu 3asilescu +opescu /eorgescu 8arinescu Antonescu 0isc,in Olaru 'renume /,eorg,e 3asile Ioan 8aria Angela :lena +arasc,in Angela /,eorg,e 3asile Ioan 8aria Angela :lena +arasc,in Angela +ume (! !risib (A (! !risib (A (! !risib (A (! !risib (A (! !risib (A (! !risib (A (! !risib (A (! !risib (A (! (oft!om (! (oft!om (! (oft!om (! (oft!om (! (oft!om (! (oft!om (! (oft!om (! (oft!om +ume Ionescu 3asilescu +opescu /eorgescu 8arinescu Antonescu 0isc,in Olaru Ionescu 3asilescu +opescu /eorgescu 8arinescu Antonescu 0isc,in 'renume /,eorg,e 3asile Ioan 8aria Angela :lena +arasc,in Angela /,eorg,e 3asile Ioan 8aria Angela :lena +arasc,in +ume (! -im-ip (! -im-ip (! -im-ip (! -im-ip (! -im-ip (! -im-ip (! -im-ip (! -im-ip 0rasoveanca 0rasoveanca 0rasoveanca 0rasoveanca 0rasoveanca 0rasoveanca 0rasoveanca

+ume Olaru

'renume +ume Angela 0rasoveanca

adic se obin 8x4 = 32 nregistrri (tabela persoane conine 8 nregistrri, tabela firme 4 nregistrri) 'e remarcat c nota ia #7n'me$ #7#ren'me$ 87n'me$ precum i literele # i 8 care urmea# dup numele tabelelor din clau#a 4R%M. (punem c am definit un alias al fiecrei tabele. Am fost nevoi i s folosim acest alias$ deoarece n ambele tabele exist o coloan cu numele n'me i dac nu prefa m numele acestei coloane cu aliasul tabelei se va genera o ambiguitate pe care serverul ba#ei de date nu va ti s o re#olve. *liasul tabelei este obligatoriu s-l folosim c7nd dou tabele conin coloane cu acelai nume . "n exemplul anterior coloana prenume nu este obligatoriu s o prefa m cu aliasul coloanei$ astfel comanda anterioar poate fi scris i astfel:

&ELECT #7n'me! #ren'me! 87n'me

4R%M #er.0ane #! 8irme 8

Aadar$ produsul carte#ian apare atunci cnd nu este preci#at nici o condi ie privind modul de legare al celor dou tabele. b) Sintaxa ANSI +entru a ob ine produsul carte#ian$ n sintaxa A4(I vom folosi clau#a CR%&& 5%IN n cadrul clau#ei 4R%M ca n exemplul urmtor.

&ELECT #7n'me! #7#ren'me! 87n'me 4R%M #er.0ane # CR%&& 5%IN 8irme 8


=e#ultatul ob inut va coincide cu cel ob inut anterior. II.3.2. Equijoin Oare cum procedm dac dorim s afim pentru fiecare persoan$ numele firmei la care lucrea#A ( vedem de exemplu cum aflm numele firmei la care lucrea# Ionescu /,eorg,e. 4e uitm n tabela #er.0ane$ la valoarea din coloana I34irm. Aceast valoare este ++. Apoi$ n tabela 8irme cutm firma avnd codul ++$ i prelum numele acestei firme din coloana n'me. Acest nume este 0rasoveanca. Aadar Ionescu /,eorg,e lucrea# la firma 0rasoveanca. 'eci a trebuit ca 8aloarea din coloana I34irm din tabela Per.0ane s coincid cu 8aloarea coloanei I34irm din tabela /irme. a) Sintaxa Oracle !um reali#m acest lucru folosind ()*A (implu. 3om preci#a condi ia de egalitate dintre coloanele I34irm din cele dou tabele n clau#a 6HERE ca mai jos:

&ELECT #7n'me! #ren'me! 87n'me 4R%M #er.0ane #! 8irme 8 6HERE #7i38irm , 87i38irm
#abelul $$.%.5. :@uijoin ntre tabelele Per.0ane i 4irme +ume Ionescu 3asilescu +opescu Antonescu 0isc,in Olaru 'renume /,eorg,e 3asile Ioan :lena +arasc,in Angela +ume 0rasoveanca (! (oft!om (! !risib (A (! !risib (A (! (oft!om 0rasoveanca

/igura $$.%.&. :@uijoin

0inen eles c n condi ia de e@uijoin pot fi preci#ate mai multe condi ii. 'ac de exemplu tabelele elevi i n0te ar con ine urmtoarele coloane: Elevi (9n'me! 9#ren'me! :a3re.a) N0te(9n'me! 9#ren'me! 93i."i#lina! 93ata! :n0ta) atunci pentru a afia toate notele unui elev vom folosi comanda:

&ELECT a7n'me! a7#ren'me! -73i."i#lina! -73ata! -7n0ta 4R%M elevi a! n0te 6HERE a7n'me,-7n'me AND a7#ren'me,-7#ren'me

b) Sintaxa ANSI "n ca#ul sintaxei A4(I lucrurile se complic uor. "n principal e@uijoinul se reali#ea# folosind op iunea NATURAL 5%IN n cadrul clau#ei 8r0m astfel:

&ELECT n'me! #ren'me! n'me 4R%M #er.0ane NATURAL 5%IN 8irme


"ns dac rulm aceast comand vom fi surprini c ea nu afiea# nici o linie. 'e ceA +entru c NATURAL 5%IN%ul leag cele dou tabele pe toate coloanele cu nume comun din cele dou tabele. Adic$ comanda anterioar este ec,ivalent cu urmtoarea comand scris folosind sintaxa Oracle: &ELECT #7n'me! #ren'me! 87n'me 4R%M #er.0ane #! 8irme 8 6HERE #7i38irm , 87i38irm AND #7n'me,87n'me ori nu are nici un sens s punem condi ia ca numele firmei B 87n'meC s coincid cu numele persoanei B#7n'meC. Reg li de folosire a opi nii NATURAL 5%IN! tabelele sunt legate pe toate coloanele cu nume comun coloanele cu nume comun trebuie s aib acelai tip n clau#a &ELECT coloanele comune celor dou tabele 4& vor fi prefa ate de aliasul tabelei. +entru a lega dou tabele folosind sintaxa A4(I dar condi ia de egalitate s fie pus doar pe anumite coloane Bnu pe toate coloanele cu nume comun ci doar pe o parte din acesteaC se 8a folosi n loc de NATURAL 5%IN clauza 5%IN" iar coloanele pe care se face joinul se preci#ea# n op iunea U&IN;. Astfel comanda pentru afiarea firmelor la care lucrea# fiecare angajat se scrie astfel:

&ELECT #7n'me! #ren'me! 87n'me 4R%M #er.0ane # 5%IN 8irme 8 U&IN; (I34irm)
=estric ii la folosirea clau#ei 5%IN cu clau#a U&IN;: n clau#a U&IN; se trec n parante#$ separate prin virgul$ numele coloanelor pe care se va face joinul coloanele din clau#a U&IN; trebuie s aib acelai tip n cele dou tabele 'ac n cele dou tabele nu e9ist coloane cu acelai nume $ sau coloanele cu nume comun au tipuri diferite n cele dou tabele$ se va folosi "la'<a 5%IN =n "0n>'n"?ie "' %N. "n clau#a O4 pe poate trece orice condi ie de join ntre cele dou tabele.

&ELECT #7n'me! #ren'me! 87n'me 4R%M #er.0ane # 5%IN 8irme 8 %N (#7I34irm,87I34irm)


Re" ltat l obin t este acela#i c cel din tabel l $$%3%&%