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:
+ume Olaru
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:
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! #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
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 #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.