Documente Academic
Documente Profesional
Documente Cultură
0ine nu are o asemenea interfa# grafic, este nevoit s scrie comanda '() pentru crearea unei tabele+ create table ani_universitari ( pk_an_universitar number, cod_an_universitar varchar2(15), descriere_an_universitar varchar2(50) ); &ac am greit ceva, putem terge tabela 2 drop table ani_universitari;) i apoi crea din nou, %n forma corect. 'au, mai avem varianta de modificare a tabelei direct, prin comanda '() "alter table" : ALTER TABLE ani_universitari (50)); 9"ist comenzi pentru adugare de coloane, tergere, modificare tip, modificare nume coloane. 0omanda &9'0R:89 face o descriere a coloanelor unui tabel cu tipurile aferente. modificare coloan+ o o alter table studenti modif/ 2nume1stud not null34 alter table studenti modif/ 2nr1matricol number34 MODIFY ( DESCRIERE_AN_UNIVERSITAR VARCHAR2
Char2n3+ tot iruri de caractere, dar de lungime fi", ma"im 5777 de octe#i. Long raw+ iruri de caractere de pn la 5 <8 Numere: Number2p,s3+ un numr cu p cifre din care s la partea zecimal
Date calendari tice: Date+ o dat calendaristic ce poate con#ine orice dat %n perioada =>;5 %.e.n ? @@@@. Aceste date se pstreaz %n baz sub forma unor numere cu virgul, o unitate reprezentnd o zi. !ime tamp2s3+ tot o dat calendaristic, dar memeoreaz i frac#iuni de secund. *umarul s reprezint cte zecimale se pstreaz dintr-o secund 2implicit se ptreaz 6 zecimale, ma"im sunt @ zecimale3. "biecte mari: 8lob 2b/nar/ large objects3+ pentru obiecte foarte mari de date 2cum ar fi imagini, obiecte binare3. :n acest cmp se pot stoca pn la = <8 de date binare, fr nici o formatare prealabil 2ele sunt tratate ca un ir de octe#i oarecare3.
2. Con tr#ngeri
1.4 Con!tr"n#eri de tip $ri%ar& 'e& ($')
0onstrngerile reprezint un set de reguli pe care noi le definim i apoi baza de date se asigur c sunt respectate. &efinim o constrngere de tip "primar/ ,e/" pe o coloan i baza are grij ca niciodat s nu se repete o valoare pe acea coloan. 8azele de tip Aracle con#in un obiect numit "'eBuence" care este un generator de numere cresctoare unice. Adat definit, obiectul ne furnizeaz la apel un numar mai mare dect cel furnizat anterior. *imeni nu poate da secven#a %napoi, deci nu este posibil s se repete un numr de mai multe ori. Prin urmare, completarea unei coloane de tip "primar/ ,e/" 2p,3 se face cu ajutorul secven#elor. 0omanda '() de adugare a unei constrngeri de tip "primar/ ,e/" este urmtoarea+ alter table studenti add !nstraint studenti_"# "ri$ar% #e% ("#_student);
0rearea unei secven#e se face prin comanda+ create seBuence seB1p,1stud increment b/ ; start Cit$ 5; minvalue ;7 ma"value @@@@@@@@@@ noc/cle noorder 4
&aca vreau s creez o constrngere de unicitate dar datele e"istente %n tabel nu respect condi#ia impus de constrngere, se folosete clauza *AEA):&A-9 2baza deja este pornit, avem date, dar s-a constatat la un moment dat c unele date nu sunt corecte. *u putem terge datele, dar din acest moment definim constrngerea care s nu mai permit introducerea de noi date greite3+ alter table studenti add !nstraint studenti_u# uni'ue("#_stud( nu$e_stud) enable n!validate; A8'9REA-:9+ novalidate merge numai daca s-a creat un inde" pe acele coloane+ reate inde) ind_studenti !n studenti("#_stud( nu$e_stud);
Alte comenzi utile+ 'tergerea inde"+ dr!" inde) ind_studenti; 'tergere constrngere+ alter table studenti dr!" !nstraint studenti_u#;
9nableFdisable constrngere+ o o alter table enable (n!validate) !nstraint studenti_u#; alter table disable !nstraint studenti_u#; (asta *a e aut!$at n!validate)
&ar nu vreau s vd toate coloanele, nu m intereseaz p,-ul studentului, sau alt p,, vreau s tiu numele i prenumele studentului+ select nume_student, prenume_student from studenti; 'unt prea mul#i, nu vreau s vd to#i studen#ii care au trecut prin facultate, vreau s vd numai studen#ii care sunt la litera M8M+ select nume_student, prenume_student from studenti where nume_student like 'B%';
&in cele prezentate pn acum putem re#ine sinta"a de baz a instruc#iunii '9)90-+ !ele*t nu$e_ !l!ane ro% nu$e_tabel 1.ere !ndi4ii de sele 4ie5
&up cuvntul "select" se introduc numele coloanelor din tabela care vrem sa fie afiate. &ac sunt mai multe coloane, se despart prin virgul, dup ultima coloan nu se pune virgul. &orim toate coloanele din tabelN punem direct O 2select O3. Jrmeaz clauza "from" dup care punem numele tabelei din care e"tragem acele informa#ii. *u dorim toate liniile din tabelN atunci trebuie s adugm clauza "C$ere" unde introducem condi#iile pe care trebuie s le %ndeplineasc liniile din tabel ce se doresc afiate.
:n felul acesta pot trece date dintr-o baz %n alta, sau pot face un select care s afieze datele cumulate din cele dou baze 2folosim clauza Jnion3+ !ele*t studenti5nu$e_student 77 - -77 studenti5"renu$e_student 8Nu$e "renu$e student8( -ba9a db:- 8ba9a de !ri&ine8 ro% studenti union !ele*t studenti5nu$e_student 77 - -77 studenti5"renu$e_student 8Nu$e "renu$e student8( -ba9a db2- 8ba9a de !ri&ine8 ro% studenti6db2_lin# order b& 8ba9a de !ri&ine8 de!* ;
where st.pk_student = stg.pk_student and stg.pk_grupa = g.pk_grupa and stg.pk_an_universitar = au.pk_an_universitar order by au.cod_an_universitar, g.cod_grupa; :nstruc#iunea select permite e"tragerea informa#iilor din mai multe tabele simultan. Pot vizualiza att numele studentului, ct i specializarea acestuia, c$iar dac cele dou informa#ii sunt %n tabele diferite. :mportant este s e"iste o legtur %ntre cele dou tabele astfel %nct unei linii dintr-o tabel s-i corespund una sau mai multe linii din cealalt tabel. 0nd fraza select lucreaz cu dou tabele 2sau mai multe3, %ntotdeauna trebuie s e"iste clauza C$ere %n care se specific legtura %ntre tabele. :n selectul de mai sus legtura dintre tabela student si tabela student1grupe se realizeaz prin coloana "p,1student" comun celor dou tabele , %n timp ce mai departe se merge pe legtura "p,1an1universitar" pentru a lega anul universitar de selectul nostru. 0e se %ntmpl dac uit pur i simplu s pun %n clauza "C$ere" legtura dintre tabeleN Atunci e grav, se umple ecranul cu zeci de rnduri fr nici o noim. Iraza select face produsul cartezian %ntre cele dou tabele i afieaz rezultatul Concluzie: s nu uitm niciodat s punem %n clauza "C$ere" condi#ia de legtur dintre tabele atunci cnd selectm coloane din mai multe tabele simultan. !ema+ s se construiasc un select care s afieze to#i studentii din facultate, %mpreun cu grupa, disciplinele i notele ob#inute la e"amene+ select st.nume_student, st.prenume_student, g.cod_grupa, d.cod_disciplina, n.nota, au.cod_an_universitar from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note n, discipline d where st.pk_student = stg.pk_student and stg.pk_grupa = g.pk_grupa and stg.pk_an_universitar = au.pk_an_universitar and stg.pk_student_grupa = n.pk_student_grupa and n.pk_disciplina = d.pk_disciplina order by nume_student,au.cod_an_universitar, g.cod_grupa
0lauza C$ere este cea care ne ajut s sortm aceste linii i s scoatem numai informa#ia de care avem nevoie. :n aceast clauz sunt scrise e"presii logice ce returneaz doar dou valori+ valoarea "adevrat" 2true3 sau valoarea "fals" 2false3. 9"presiile logice sunt construite cu ajutorul operatorilor de compara#ie+ Aperator Q R RQ S SQ SR TQ 9"plica#ie 9gal cu .ai mare dect .ai mare sau egal .ai mic dect .ai mic sau egal &iferit de
9"emple+ ;. ' se listeze to#i studen#ii care au note mai mari de P+ select st.nume_student, st.prenume_student, g.cod_grupa, d.cod_disciplina, n.nota, au.cod_an_universitar from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note n, discipline d where st.pk_student = stg.pk_student and stg.pk_grupa = g.pk_grupa and stg.pk_an_universitar = au.pk_an_universitar and stg.pk_student_grupa = n.pk_student_grupa and n.pk_disciplina = d.pk_disciplina and n.nota ! order by nume_student,au.cod_an_universitar, g.cod_grupa ;
1.1'.2
0lauza "C$ere" poate con#ine mai multe fraze care %mpreun s construiasc valoarea de adevr final. Irazele sunt legate prin trei termeni c$eie+ "and" + returneaz "true" numai dac toate frazele din compozi#ie sunt "true" "or" + returneaza "true" dac cel pu#in o fraz este "true". "not" + inverseaz valoarea de adevr a frazei la care se aplic ;. Afieaz studen#ii care au ob#inut la disciplina .9 nota > i nota P+ select st.nume_student, st.prenume_student, g.cod_grupa, d.cod_disciplina, n.nota, au.cod_an_universitar from studenti st, grupe g, studenti_grupe stg, ani_universitari au, note n, discipline d where st.pk_student = stg.pk_student and stg.pk_grupa = g.pk_grupa
+,emple+
stg.pk_an_universitar = au.pk_an_universitar stg.pk_student_grupa = n.pk_student_grupa n.pk_disciplina = d.pk_disciplina d.cod_disciplina = '"#' (n.nota=$ or n.nota=! ) S nu uitm s punem parantezele rotunde
order by nume_student ;
1.1'.-
"peratorul .between.
Acest operator stabilete un interval %n care se afl informa#ia selectat+ 9"emplu+ afieaz studen#ii cu notele cuprinse %n intervalul K6, PL+ and n.nota between 5 and !
1.1'./
"peratorul .in.
'tabilete o list de valori %n care se afl informa#ia selectat+ 9"+ afieaz studen#ii cu notele incluse %n mul#imea U V, =, W, PX + and n.nota in (%,&,!)
1.1'.0
"peratorul .li&e.
9ste operatorul care ne scoate din %ncurctur cnd nu tim ce cutm, ci doar bnuim. &ac nu tiu numele complet al unui student, ci doar cteva caractere, atunci folosesc clauza li,e pentru filtrarea liniilor. ;. 9"+ caut studen#ii de la litera A+ select ' from studenti where studenti.nume_student like '(%';
5. -oate fetele din facultate 2prenumele se termina cu litera MaM sau MAM3 select ' from studenti where (prenume_student like '%a' or prenume_student like '%(');
0a s nu cutm %n zadar, utilizm func#ia .upper. ce transform toate literele %n majuscule + select st.nume_student, st.prenume_student, upper(st.prenume_student) from studenti st where upper(prenume_student) like '%(';
V. . mai pot juca cu operatorul "li,e"4 vreau to#i studentii care au %n componen#a numelui irul de caractere "ut"+ select st.nume_student, st.prenume_student, upper(st.prenume_student) from studenti st where upper(prenume_student) like '%)*%';
1.1'.1
clauza "distinct"+
Clauza di tinct
&aca vreau s afiez doar liniile distincte, ce nu repet informa#ia afiat de alte linii, folosesc select distinct st.nume_student, st.prenume_student, g.cod_grupa from studenti st, grupe g, studenti_grupe stg where st.pk_student = stg.pk_student and stg.pk_grupa = g.pk_grupa order by nume_student, g.cod_grupa ; &irectiva "distinct" %nltur informa#ia care se repet %n rezultatul frazei select. :n acest fel, studen#ii vor fi afia#i o singur dat, indiferent de numrul de %nregistrri gsite %n tabela studenti.
1.1'.2
"peratorul .i null.
A valoare nul e o valoare care nu e disponibil, neatribuit, necunoscut i neaplicabil. Adic, oriunde folosim null %ntr-o e"presie, toat e"presia devine null 2false3. *u pot folosi e"presii de tipul Qnull, sau SRnull. &e e"emplu, m intereseaz studen#ii ce nu au numr matricol select ' from studenti where nr_matricol is null;
'i viceversa, vrem s vedem studen#ii care au numr matricol+ select ' from studenti where nr_matricol is not null;
decode(d.cod_disciplina, '+B', decode(n.nota, 10, 10, n.nota ,1), '"#',n.nota - 1, n.nota) .ota_"odi/icata, ast.cod_an_studiu, au.cod_an_universitar from studenti_grupe stg, studenti st, ani_universitari au, grupe g, speciali0ari s, discipline d, ani_studiu ast, note n where stg.pk_student = st.pk_student and stg.pk_an_universitar = au.pk_an_universitar and stg.pk_grupa = g.pk_grupa and g.pk_speciali0are = s.pk_speciali0are and s.pk_speciali0are = d.pk_speciali0are -and g.cod_grupa = '6303' and g.pk_an_studiu = d.pk_an_studiu and g.pk_an_studiu = ast.pk_an_studiu and n.pk_student_grupa = stg.pk_student_grupa and n.pk_disciplina = d.pk_disciplina order by d.cod_disciplina ;
Aceste func#ii nu se aplic unei singure linii, ele calculeaz informa#ii caracteristice unui grup de rnduri+ ma", min, avg, count2O3, sum. select max(nota),round(avg(nota),1), min(nota), sum(nota), count('), round(sum(nota)2count('),1) from note;
:n e"emplul de mai sus am e"tras cteva informa#ii globale ale tabelei "note"+ ma"2nota1finala3 + calculeaz cea mai mare valoare din coloana "nota1finala". 0$iar dac sunt mai multe note de @, func#ia ma" returneaz o singur valoare min2nota1finala3 + returneaz cea mai mica valoare din coloana "nota1finala"4 avg 2nota1finala3+ calculeaz media aritmetic a notelor ob#inute de studen#i4 sum2nota1finala3 + calculeaz suma tuturor notelor4 count2O3 + returneaz numarul de linii din tabela sit1final.
Jn avantaj al acestor func#ii e c nu prea sunt %ncurcate de valoarea null gsit pe anumite linii. Acea linie care are valoarea null este ignorat pur i simplu %n calcularea valorilor cumulate.
Iunc#iile min, ma" pot fi folosite i pentru coloane care nu sunt %n mod necesar de tip numeric. Aceste func#ii au sens i pentru iruri de caractere sau date calendaristice+ elect min2nume1student3, ma,2nume1student3 4rom studenti 4
Afiseaza primul student %n ordinea alfabetic din grupul selectat. &ac vreau s vd cte caractere are cel mai mic nume 2fr prenume3 scriu urmtorul select+ elect min2length2 ub tr2nume1student,;,in tr2nume1student,M M3-;333 4rom studenti4
1.12.2
. intereseaz de e"emplu s tiu care a fost media pentru disciplina .9, media pentru A9, min, ma" pe aceste discipline s pot face compara#ii, s trag eventual semnale de alarm %n caz c apar nite situa#ii catastrofale. ' afim notele ob#inute pe discipline+ select d.cod_disciplina, n.nota from discipline d, note n where n.pk_disciplina = d.pk_disciplina order by d.cod_disciplina ; ' calculm media notelor la fiecare disciplin+ select d.cod_disciplina, round(avg(n.nota),1) from discipline d, note n where n.pk_disciplina = d.pk_disciplina group by d.cod_disciplina order by d.cod_disciplina ; *u pot folosi func#iile de grup %n clauza C$ere. Pentru a face filtrri cu ajutorul func#iilor de grup folosim clauza .having.: select d.cod_disciplina, round(avg(n.nota),1) from discipline d, note n where n.pk_disciplina = d.pk_disciplina group by d.cod_disciplina having round(avg(n.nota),1) 3 ! order by d.cod_disciplina ; Iunc#iile de grup sunt foarte utile cnd sunt necesare statistici i rapoarte finale. 0u ajutorul lor putem sintetiza informa#ia care s reflecte aspecte globale ale tabelelor.
6n truc(iuni D7L
1.13 Co%anda I-0ERT
:ntroducerea datelor %n baz se face cu ajutorul comenzii :*'9RAm vzut c formatul acestei comenzi este de forma+ INSERT INT; nu$e_tabel (nu$e_ !l!ana_2( nu$e_ !l!ana_,(5555(nu$e_ !l!ana_n) VA<UES (val_2( val_,( 55555( val_n); 0a s introducem un student %n tabela studenti, avem mai multe variante+ insert into studenti(nume_student, prenume_student, nr_matricol) values('+onescu','4avel', 11$5);
insert into studenti values(null,'+onescu','4avel', 11$5); :n al doilea caz nu am mai specificat numele coloanelor, ceea ce %nseamn c le completm pe toate 8inen#eles, nu pot pune *J)) peste tot unde nu tiu valoarea coloanei. insert into studenti values(null, null,'4avel', 11$5); deoarece se sesizeaz constrngerile definite pe tabela "studenti". Aceste constrngeri trebuie definite c$iar la %nceput, %nainte de introducerea datelor, tocmai ca s m protejeze %mpotriva datelor incoerente.
1.13.1.1
Iunc#ia "s/sdate"+ sistemul propune automat ziua curent pentru coloana "data" din tabela "note". insert into note(pk_student_grupa, pk_disciplina, nota, data) values(1&,1,5,sysdate);
1.13.1.2
alt tabel.
Anumite valori introduse de insert pot fi aduse %n momentul e"ecu#iei prin comanda select dintr-un
A!+N!6++ comanda delete nu terge doar o valoare dintr-o coloan pe o anumit linie, aceast comand lucreaz pe linii, ea terge toat linia. Rmne valabil discu#ia pentru clauza "C$ere" de la comanda "update"+ dac clauza "C$ere" este uitat sau greit scris, atunci dezastrul este mai mare dect la comanda "update". :n acest caz se terg toate liniile din tabel, sau, %ntr-un caz mai fericit, mult mai multe dect am fi dorit. Ereau s terg toate liniile din tabel+ delete 4rom note4
0omanda delete terge liniile din tabel, dar nu i tabelul ca obiect al bazei de date. Abiectul se terge prin comanda &&) 2&ata &efinition )anguage3 "drop"+ drop table note4
0omanda &&) "drop" terge complet tabela i nu se mai poate recupera nimic. &ac de la delete se mai pot recupera datele 2%n anumite condi#ii 3, dup drop nu se mai poate face nimic.
1.10.1
Stergerea 8n ca cad9
Presupunem c vrem s tergem un student din baza de date+ Aceast constngere nu permite tergerea unei linii din tabela "student: dac e"ist linii aferente %n tabela "studenti1grupe" 2nu pot terge studentul dac el este %nscris %n diverse grupe, are note, etc. -oate aceste informa#ii ar rmne suspendate %n aer dac s-ar terge studentul3. 0um se poate rezolva problemaN .ergem mai %nti %n tabelele copil 2note, studenti1grupe3 i tergem toate liniile ataate de studentul ce trebuie ters i la urm tergem studentul+ delete from note where pk_student_grupa in (select pk_student_grupa from studenti_grupe stg , studenti st where stg.pk_student = st.pk_student and st.nume_student = '+aco6' ); delete from studenti_grupe where pk_student in (select pk_student from studenti where nume_student = '+aco6'); delete from studenti where nume_student = '+aco6';
:ar acum putem terge foarte simplu studentul+ delete from studenti where nume_student = '78iriac';
2.2
Co%anda Co%%it
0omanda RA))8A0D anuleaz ultima tranzac#ie, dar cnd a %nceput aceast tranzac#ieN Arice tranzac#ie %ncepe dup comanda commit i se termin la comanda commit. -ranzac#ia reprezint un ir de comenzi de tipul select, update, insert, etc, care este privit de Aracle ca un tot unitar+ ori toate comenzile se termin cu succes, ori sunt anulate toate. 0omanda commit %nc$eie tranzac#ia curent astfel %nct, toate modificrile realizate pn %n acel moment trec %n stare definitiv. Prima comand '() dup commit %ncepe o nou tranzac#ie care se termin la urmtorul commit. ' re#inem deci c prin RA))8A0D putem reface doar modificrile din tranzac#ia curent, nimic nu ne mai salveaz dup e"ecu#ia comenzii 0A..:-.
0e se %ntmpl dac nu merge contarea N 2nu tiu e"act care sunt conturile pe care trebuie s contez3. :n acest caz salvm cteva puncte intermediare %n tranzac#ia noastr. &up scoaterea produsului din magazie definim un punct intermediar de succes + succes+ *"LL<AC= to factura4 SAV+:"6N! iesire1magazie1succes;
Apoi contm factura. &ac totul e AD dm un 0A..:-, altfel m intorc la ultima situa#ie de
:n acest fel am reuit s s scoatem factura clientului, rmnnd pentru mai trziu s rezolvm problema contrii.