Documente Academic
Documente Profesional
Documente Cultură
Majoritatea componentelor unei declara!ii SQL sunt insensibile la litere mari sau mici. O excep!ie important" de la aceast" regul" este faptul c" datele caractere literale trebuiesc scrise exact cum apar n baza de date. De exemplu dac" scriem numele unei persoane MARIN #i apoi c"ut"m numele folosind Marin articolul nu va fi g"sit. De#i SQL este de liber format, o declara!ie SQL sau un set de declara!ii este mult mai interesant" dac" este folosit" alinierea. De exemplu: Fiecare clauz" din declara!ie ar trebui scris" pe linie nou". nceputul fiec"rei clauze ar trebui scris" sub nceputul altei clauze. Dac" o clauz" are mai multe p"r!i ele ar trebui s" apar" pe linii separate #i s" fie inclus" la nceputul clauzei pentru a ar"ta rela!ia dintre ele. n acest capitol vom folosi urm"toarea modalitate pentru a defini declara!iile SQL: Literele mari sunt folosite n reprezentarea cuvintelor rezervate #i trebuiesc scrise exact. Literele mici sunt folosite n reprezentarea cuvintelor definite de c"tre utilizator. | indic" o alegere ntre alternative; de exemplu a | b | c. Parantezele acolade indic" un element dorit: de exemplu, {a}. Parantezele p"trate indic" un element op!ional: de exemplu, [a]. Punctele () sunt folosite pentru a indica repeti!ia op!ional" a unui element nul sau a unui alt element de mai multe ori. De exemplu: {a|b}[,c], ceea ce nseamn" a sau b urmat de zero sau mai multe repeti!ii al lui c separate prin virgul". n practic" declara!iile LDD sunt folosite pentru crearea de structuri de baze de date (tabele), iar declara!iile LMD pentru a popula #i interoga tabelele. n acest capitol vom prezenta declara!iile LMD naintea celor LDD pentru a ar"ta importan!a relativ" a declara!iilor LMD.
vechime 15 20 25 25 28 18
cod_gr 1 2 1 1 2 1
nr_semigrupe 2 2 1 2 1 2
nr_studen!i 25 24 30 28 24 29
1. Recuperarea tuturor liniilor unui tabel: SELECT nr_mat, nume, prenume, func!ia, vechime, salariu FROM cadre_didactice; SELECT * FROM cadre_didactice;
Ob!inem n urma acestor dou" interog"ri acela#i rezultat: nr_mat 1111 1112 1113 1114 1115 1116 nume Popa Liana Barbu $tefan Savu Ionescu prenume Ioan Carmen Traian Elena Alexandru Mircea func!ia lect. conf. conf. conf. conf. lect. vechime 15 20 25 25 28 18 salariu 400,000 700,000 900,000 900,000 950,000 400,000
SELECT nr_mat, nume, prenume, salariu FROM cadre_didactice; nr_mat 1111 1112 1113 1114 1115 1116 nume Popa Liana Barbu $tefan Savu Ionescu prenume Ioan Carmen Traian Elena Alexandru Mircea salariu 400,000 700,000 900,000 900,000 950,000 400,000
3. Utilizarea cuvntului rezervat DISTINCT care elimin" liniile duble: SELECT salariu FROM cadre_didactice; salariu 400,000 700,000 900,000 900,000 950,000 400,000 SELECT DISTINCT salariu FROM cadre_didactice; salariu 400,000 700,000 900,000 950,000
4.
Exemplele de mai sus arat" folosirea declara!iei SELECT pentru a recupera toate liniile dintr-un tabel. Totu#i, deseori avem nevoie de a restrnge liniile care au fost recuperate. Acest lucru se poate realiza cu clauza WHERE care con!ine cuvntul cheie urmat de o condi!ie de c"utare care specific" liniile ce trebuiesc recuperate. n SQL avem urm"toarii operatori de compara!ie: =, <, >, <=, >=, < >, != (diferit). Multe predicate complexe pot fi generate folosind operatori logici AND, OR, #i NOT, cu paranteze sau nu, pentru a ar"ta ordinea de valoare. Regulile pentru evaluarea expresiilor condi!ionate sunt: O expresie evaluat" de la stnga la dreapta. Subexpresiile n paranteze sunt evaluate prima dat". Operatorii NOT sunt evalua!i naintea operatorilor AND #i OR. Operatorii AND sunt evalua!i naintea celor OR. Folosirea parantezelor este ntotdeauna recomandat" pentru a elimina posibilile ambiguit"!i. Cele 5 condi!ii principale de c"utare sunt urm"toarele: 1. Compara!ia. Compar" valorile unei expresii cu valorile altei expresii: SELECT nr_mat, nume, prenume, salariu FROM cadre_didactice WHERE salariu >700.000; 4
2. $ir. Testeaz" dac" valoarea unei expresii este inclus" ntr-un #ir de valori specificate (BETWEEN/NOT BETWEEN):
SELECT nr_mat, nume, prenume, salariu FROM cadre_didactice WHERE salariu BETWEEN 500.000 AND 900.000; nr_mat nume 1112 Liana 1113 Barbu 1114 $tefan
3. Apartenen!a la o mul!ime. Testeaz" dac" valoarea unei expresii apar!ine unui set de valori (IN/NOT IN): SELECT nr_mat, nume, prenume, vechime FROM cadre_didactice WHERE vechime IN (20, 25); nr_mat 1112 1113 1114 nume Liana Barbu $tefan prenume Carmen Traian Elena vechime 20 25 25
4. Compatibilitatea. Testeaz" dac" un #ir se potrive#te cu un model specificat (LIKE/NOT LIKE). SQL are dou" caractere speciale: % reprezint" orice secven!" de zero sau de mai multe caractere; _ reprezint" orice caracter singular. Celelalte caractere se folosesc normal. De exemplu: adresa LIKE H% nseamn" c" primul caracter trebuie s" fie H, iar celelalte pot fi orice caracter. adresa LIKE H_ _ _ nseamn" c" trebuie s" fie exact patru caractere n #ir primul fiind H. adresa LIKE %e nseamn" orice secven!" de caractere de lungime cel pu!in 1 cu ultimul caracter e. adresa LIKE %Popescu% nseamn" o secven!" de caractere de orice lungime care con!ine Popescu. adresa NOT LIKE H% nseamn" c" numele nu poate ncepe cu H. SELECT nr_mat, nume, prenume FROM cadre_didactice WHERE nume LIKE P%; nr_mat 1111 (1 linie) nume Popa prenume Ioan
5. Nul. Testeaz" dac" o coloan" are o valoare nul" (necunoscut") (IS NULL/IS NOT NULL). Clauza ORDER BY (rezultate de sortare) n general, liniile tabelului rezultat a unei interogari SQL nu sunt aranjate ntr-o anumit" ordine. Totu#i, putem sorta rezultatele unei interog"ri folosind clauza ORDER BY din declara!ia SELECT. Clauza ORDER BY con!ine o list" de identificatori de coloan" pentru ca rezultatul s" fie sortat #i separat prin virgul". Identificatorul de coloan" poate fi, fie un nume de coloan", fie un num"r de coloan" care identific" un element din lista SELECT dndu-ne pozi!ia acestuia n list":1 pentru primul element din list", 2 pentru al doilea, #.a.m.d. Numerele de coloan" pot fi folosite dac" coloana ce trebuie sortat" este o expresie #i nici o clauz" AS nu este specificat" n vederea ata#"ri unui nume pentru coloan", nume care ar putea fi de referin!" ulterior. Clauza ORDER BY ne permite ordonarea articolelor recuperate n mod cresc"tor (ASC) sau descresc"tor (DESC) pe orice coloan" sau combina!ie de coloane indiferent dac" coloana apare sau nu n rezultat.Totu#i, unele dialecte 5
insist" asupra faptului ca elementele ORDER BY s" apara n lista SELECT. n ambele cazuri, clauza ORDER BY trebuie s" fie ntotdeauna ultima n declara!ia SELECT. SELECT nr_mat, nume, prenume, salariu FROM cadre_didactice ORDER BY salariu DESC; nr_mat 1115 1113 1114 1112 1111 1116 nume Savu Barbu $tefan Liana Popa Ionescu prenume Alexandru Traian Elena Carmen Ioan Mircea salariu 950,000 900,000 900,000 700,000 400,000 400,000
Este posibil de a include mai multe elemente n clauza ORDER BY. Cheia de sortare major" determin" ordinea general" a tabelului rezultat. Dac" cheia de sortare major" este unic", nu mai este nevoie de nici o cheie de control pentru sortare. Totu#i, dac" cheia de sortare major" nu este unic", ar putea s" existe mai multe linii din tabelul rezultat cu aceea#i valoare pentru cheia de sortare major". n acest caz, ar fi de dorit s" se ordoneze liniile cu aceea#i valoare pentru cheia de sortare major" cu ajutorul unei chei de sortare adi!ional". Dac" apare un al doilea element n clauza ORDER BY, atunci acesta se nume#te cheie de sortare minor". SELECT nr_mat, nume, prenume, func!ia, salariu FROM cadre_didactice ORDER BY func!ia, salariu DESC; nr_mat 1111 1116 1115 1113 1114 1112 nume Popa Ionescu Savu Barbu $tefan Liana prenume Ioan Mircea Alexandru Traian Elena Carmen func!ia lect. lect. conf. conf. conf. conf. salariu 400,000 400,000 950,000 900,000 900,000 700,000
Standardul ISO specific" faptul c" zerourile dintr-o coloan" sau expresie sortat" cu ORDER BY trebuiesc tratate mai pu!in sau mai mult dect toate valorile nenule. Acest lucru r"mne la alegerea implementorului SGBD. Folosirea func"iilor complexe SQL Standardul ISO define#te 5 functii complexe: COUNT returneaz" numarul de valori dintr-o coloan" specificat". SUM returneaz" suma valorilor dintr-o coloan" specificat". AVG returneaz" media valorilor dintr-o coloan" specificat". MIN returneaz" cea mai mic" valoare dintr-o coloan" specificat". MAX returneaz" cea mai mare valoare dintr-o coloan" specificat". Aceste func!ii opereaz" pe o singur" coloan" a tabelului #i returneaz" o singur" valoare. COUNT, MIN, MAX se aplic" att pe cmpuri numerice ct #i pe cmpuri nenumerice, iar SUM #i AVG pot fi folosite numai pe cmpuri numerice. n afar" de COUNT(*), fiecare func!ie elimin" prima dat" zerourile #i opereaz" pe cele care au r"mas cu valoare nenul". COUNT(*) este o folosire special" a lui COUNT. Scopul ei este de a num"ra liniile unui tabel indiferent dac" con!in sau nu zerouri sau valori duble. Dac" dorim s" elimin"m dublurile nainte de a aplica func!ia, trebuie s" folosim cuvntul cheie DISTINCT nainte de numele de coloan" din func!ie. Standardul ISO permite specificarea cuvntului cheie ALL, dac" nu dorim eliminarea dublurilor, de#i ALL este presupus dac" nu se specific" nimic. DISTINCT nu are nici un efect asupra func!iilor MIN #i MAX. Totu#i, poate avea un efect asupra rezultatelor date de SUM sau AVG, de aceea trebuie pus n vedere dac" dublurile trebuiesc incluse sau nu n opera!ie. Ca o ad"ugare, DISTINCT poate fi specificat o singur" dat" n interogare. Este important faptul c" func!iile complexe pot fi folosite numai n lista SELECT #i n clauza HAVING. Este incorect" folosirea lor n alt" parte. Dac" lista SELECT include o func!ie complex" #i dac" nu a fost folosit" clauza GROUP BY pentru gruparea datelor, atunci nici un element din lista SELECT nu poate con!ine referin!e la o coloan" numai dac" acea coloan" este un argument a unei func!ii complexe. De exemplu, interogarea urm"toare este incorect": 6
SELECT nr_mat, COUNT(salariu) FROM cadre_didactice; deoarece lista SELECT con!ine att un nume de coloan" (nr_mat) ct #i o func!ie complex" separat" (COUNT), f"r" a fi folosit" o clauz" GROUP BY. Exemple: 1. Utilizarea func!iei COUNT(*): SELECT COUNT(*) AS contor FROM cadre_didactice WHERE salariu >400,000; contor 4
2.
SELECT COUNT(DISTINCT salariu) AS contor FROM cadre_didactice WHERE salariu BETWEEN 500,000 AND 950,000; contor 3
3.
SELECT COUNT(nr_mat) AS contor, SUM(salariu) AS total_sal FROM cadre_didactice WHERE func!ia=conf.; contor 4 total_sal 4,450,000
4. Utilizarea func!iilor MIN, MAX, AVG: SELECT MIN(salariu) AS min, MAX(salariu) AS max, AVG(salariu) AS media FROM cadre_didactice;
min 400,000
max 950,000
media 708,333.3
Clauza GROUP BY (rezultate de grupare) Interog"rile sumare de mai sus sunt similare cu totalele de la sfr#itul raportului. Se condenseaz" toate datele din raport ntr-o singur" linie sumar" de date. Totu#i, este deseori folositor de a avea subtotale n raport. Pentru aceasta putem folosi clauza GROUP BY din declara!ia SELECT. O interogare care cuprinde clauza GROUP BY se nume#te interogare grupat", deoarece grupeaz" datele din tabelele SELECT #i creaz" o singur" linie pentru fiecare grup. Coloanele numite n clauza GROUP BY se numesc coloane de grupare. Standardul ISO cere ca clauzele SELECT #i GROUP BY s" fie strns integrate.Cnd se folose#te GROUP BY, fiecare element din lista SELECT trebuie s" aib" valoare unic" pe grup. n plus, clauza SELECT poate s" con!in" numai: nume de coloan", func!ii complexe, constante, o expresie cuprinznd combina!ii ale elementelor de mai sus. Toate numele de coloan" din lista SELECT trebuie s" apar" n clauza GROUP BY, n afar" de cazul cnd numele este folosit numai ntr-o func!ie complex". Reciproca nu este adev"rat": pot s" existe nume de coloane n clauza GROUP BY care nu apar n lista SELECT. Cnd clauza WHERE este folosit" cu GROUP BY, prima dat" este apelat" clauza WHERE, apoi grupurile sunt formate din liniile r"mase ceea ce satisface condi!ia de c"utare.
Standardul ISO consider" dou" zerouri ca fiind egale pentru scopurile clauzei GROUP BY. Dac" dou" linii au zerouri n aceea#i coloan" de grupare #i valori identice n toate coloanele de grupare nenule, ele sunt combinate n acela#i grup. Exemplu: SELECT func!ia, COUNT(nr_mat) AS contor, SUM(salariu) AS total_sal FROM cadre_didactice GROUP BY func!ia ORDER BY func!ia; func!ia lect. conf. contor 2 4 total_sal 800,000 3,450,000
1. SQL divide schema n grupuri !innd seama de cmpul func!ia. n cadrul fiec"rui grup, toate cadrele didactice au acea#i func!ie. 2. Pentru fiecare grup, SQL calculeaz" num"rul membrilor schemei #i adun" valorile n coloana salariu pentru a ob!ine totalul salariilor. SQL genereaz" o singur" linie sumar" n rezultatul interog"rii pentru fiecare grup. 3. n final, rezultatul este sortat n ordinea cresc"toare dup" cmpul func!ia.
Clauza HAVING (restrngerea grupurilor) Clauza HAVING este folosit" mpreun" cu clauza GROUP BY pentru a restrnge grupurile care apar la finalul tabelului rezultat. De#i sunt similare n sintax", HAVING #i WHERE servesc scopuri diferite. Clauza WHERE strecoar" linii individuale n finalul tabelului rezultat, iar HAVING strecoar" grupuri n finalul tabelului rezultat. Standardul ISO cere ca numele coloan" folosite n clauza HAVING s" apar", deasemenea, n lista GROUP BY sau s" fie con!inute ntr-o func!ie complex". n practic", condi!ia de c"utare din clauza HAVING include ntotdeauna cel pu!in o func!ie complex", altfel condi!ia de c"utare ar putea fi mutat" n clauza WHERE #i aplicat" pe linii individuale. Clauza HAVING nu este parte important" a SQL, orice interogare exprimat" folosind clauza HAVING poate fi rescris" ntotdeauna f"r" clauza HAVING. Exemplu: SELECT func!ia, COUNT(nr_mat) AS contor, SUM(salariu) AS total_sal FROM cadre_didactice GROUP BY func!ia HAVING COUNT(nr_mat)>2 ORDER BY func!ia; func!ia conf. Subinterog!ri Unele declara!ii SQL pot avea o declara!ie SELECT complet" ncrustat" n interiorul lor. Rezultatele acestei declara!ii SELECT interioare (sau subselect) sunt folosite n declara!iile exterioare pentru a ajuta la determinarea con!inutului rezultatului final. Un subselect poate fi folosit n clauzele WHERE #i HAVING a unei declara!ii SELECT exterioare, unde acesta este numit subinterogare sau interogare intercalat". Subselectele pot ap"rea, de asemenea, n declara!iile INSERT, UPDATE #i DELETE. contor 4 total_sal 3,450,000
Exemplu: SELECT cod_gr, nr_semigrupe, nr_studen!i FROM grupe WHERE cod_sec = (SELECT cod_sec FROM sec!ii WHERE denumire = Matematica); cod_gr 1 nr_semigrupe 2 nr_studen!i 25 8
24
Subinterogarea poate fi privit" ca produc"torul unor tabele temporare de rezultate, care pot fi accesate #i folosite de c"tre declara!ii exterioare. O subinterogare poate fi folosit" imediat dup" un operator rela!ional (=,< , >, <=, >=, < >) ntr-o clauz" WHERE sau HAVING. Subinterogarea ns"#i este ntodeauna nchis" ntre paranteze. Asupra subinterog"rilor se aplic" urm"toarele reguli: 1) Clauza ORDER BY nu poate fi folosit" ntr-o subinterogare (de#i ea poate fi folosit" n majoritatea declara!iilor SELECT exterioare. 2) Lista subinterog"rilor SELECT trebuie s" con!in" un singur nume coloan" sau o singur" expresie, excep!ie f"cnd subinerog"rile care folosesc cuvntul cheie EXISTS. 3) Deoarece lipsesc, numele coloan" dintr-o subinterogare se refer" la numele tabel din clauza FROM a subinterog"rii. Este posibil s" se recurg" la un tabel dintr-o clauz" FROM a unei interog"ri exterioare n modificarea numelui coloan". 4) Cnd o subinterogare este una din cei doi operan!i implica!i ntr-o compara!ie, subinterogarea trebuie s" apar" n partea dreapt" a compara!iei. 5) O subinterogare nu poate fi folosit" ca operant ntr-o expresie. Folosirea cuvintelor rezervate ANY #i ALL Cuvintele ANY #i ALL pot fi folosite cu subinterog"ri care produc o singur" coloan" a numerelor. Dac" subinterogarea este precedat" de cuvntul cheie ALL, condi!ia va fi adev"rat" numai dac" este satisf"cut" de toate valorile date de subinterogare. Dac" subinterogarea este precedat" de cuvntul cheie ANY, condi!ia va fi adev"rat" dac" este satisf"cut" de orice (una sau mai multe) valoare dat" de subinterogare. Dac" subinterogarea este vid", condi!ia ALL returneaz" valoarea adev"rat, iar condi!ia ANY returneaz" valoarea fals. Standardul ISO permite folosirea calificativului SOME n locul lui ANY. Exemple:
1. Utilizarea cuvntului rezervat ANY: SELECT nume, prenume, salariu FROM cadre_didactice WHERE salariu > ANY (SELECT salariu FROM cadre_didactice WHERE func!ia =conf);
nume Savu Barbu $tefan prenume Alexandru Traian Elena salariu 950,000 900,000 900,000
2. Utilizarea cuvntului rezervat ALL: SELECT nume, prenume, salariu FROM cadre_didactice WHERE salariu => ALL (SELECT salariu FROM cadre_didactice WHERE func!ia =conf.); nume prenume Savu Alexandru Interog!ri multi-tabele
salariu 950,000
Toate exemplele considerate pn" acum au o limitare major": toate coloanele ce trebuie s" apar" n tabelele rezultat trebuie s" provin" dintr-un singur tabel. n multe cazuri, acest lucru nu este suficient. Pentru a combina coloanele din mai multe tabele n ob!inerea unui tabel rezultat, avem nevoie de o opera!ie de jonc!iune. Opera!ia de jonc!iune SQL combin" informa!ia din dou" tabele formnd perechi de linii nrudite din cele dou" tabele. Perechile de linii ce alc"tuiesc tabelul asociat sunt toate acolo unde coloanele corespunz"toare din cele dou" tabele au aceea#i valoare. Dac" avem nevoie s" ob!inem informa!ii din mai multe tabele, putem alege ntre folosirea unei subinterog"ri #i a unei jonc!iuni. Dac" tabelul rezultat final trebuie s" con!in" coloane din diferite tabele, atunci trebuie s" folosim jonc!iunea. Pentru a reu#i opera!ia de jonc!iune, trebuie doar s" includem mai multe nume de tabele n clauza FROM, folosind ca separator virgula #i incuznd clauza WHERE pentru a specifica coloanele jonc!iunii. De asemenea, este posibil s" folosim alias pentru un tabel specificat n clauza FROM. n acest caz, aliasul este 9
separat de numele tabelului printr-un spa!iu. Un alias poate fi folosit pentru a modifica numele coloan" ori de cte ori exist" ambiguit"!i privind sursa numelui coloan". De asemenea, se mai poate folosi ca o nota!ie pentru numele tabelului. Dac" un alias este specificat, trebuie folosit oriunde numele tabelului ar putea fi specificat. Jonc!iunea este o submul!ime a unei combina!ii mult mai generale a dou" tabele cunoscute cum ar fi produsul cartezian a dou" tabele. Produsul cartezian a doua tabele este un alt tabel alc"tuit din toate perechile posibile de linii din cele doua tabele. Coloanele tabelului produs sunt toate coloanele primului tabel urmat de toate coloanele celui de al doilea tabel. Dac" specific"m o interogare doi-tabel f"r" clauza WHERE, SQL produce produsul cartezian al celor dou" tabele ca fiind interogarea rezultat. Procedura pentru generarea rezultatelor unui SELECT cu o asociere este: 1. Se formeaz" produsul cartezian a tabelelor numite n clauza FROM. 2. Dac" exist" o clauz" WHERE, se aplic" condi!ia de c"utare fiec"rei linii a tabelului produs, re!innd acele linii care satisfac condi!ia. n termenii algebrei rela!ionale, aceast" opera!ie produce o restric!ie a produsului cartezian. 3. Pentru fiecare linie r"mas", se determin" valoarea fiec"rui element din lista SELECT n scopul producerii unei singure linii n tabelul rezultat. 4. Dac" SELECT DISTiNCT a fost specificat, se elimin" orice linie dubl" din tabelul rezultat. n algebra rela!ional", pasul 3 #i 4 sunt echivalente cu o proiec!ie a restric!iei asupra coloanelor men!ionate n lista SELECT. 5. Dac" exist" o clauza ORDER BY, se sorteaz" n modul cerut tabelul rezultat. Exemple: SELECT s.denumire, s.ini!iale, g.cod_gr, g.nr_semigrupe, g.nr_studen!i FROM sec!ii s, grupe g WHERE s.cod_sec = g.cod_sec denumire Matematic" Matematic" Informatic" Matematic"-fizic" Matematic"-fizic" Fizic"-chimie ini!iale M M I MF MF FC cod_gr 1 2 1 1 2 1 nr_semigrupe 2 2 1 2 1 2 nr_studen!i 25 24 30 28 24 29
Cele mai comune interog"ri muti-tabel implic" dou" tabele care au o rela!ie 1:M (sau tat"/fiu). Interogarea precedent" este o astfel de interogare. Fiecare fiu are un tat" asociat #i fiecare p"rinte are asocia!i mai multi fii. Perechile de linii care genereaz" interogarea rezultat sunt combina!ii de linii tat"/fiu. Tabelul care con!ine cheia str"in" este un tabel fiu, iar tabelul care con!ine cheia fundamental" este un tabel tat". Pentru a folosi rela!ia tat"/fiu ntr-o interogare SQL, vom specifica o condi!ie de c"utare care compar" cheia str"in" cu cheia fundamental". n exemplul de mai sus se face o astfel de compara!ie. Standardul SQL2 furnizeaz" urm"toarele moduri alternative pentru a specifica aceast" asociere: FROM sec!ii s JOIN grupe g ON s.cod_sec=g.cod_sec FROM sec!ii JOIN grupe USING cod_sec FROM sec!ii NATURAL JOIN grupe n fiecare caz, clauza FROM nlocuie#te clauzele originale FROM #i WHERE. Jonc"iuni externe Opera!ia de jonc!iune combin" datele din dou" tabele formnd perechi de linii specificate, unde coloanele corespunz"toare din fiecare tabel au aceea#i valoare. Dac" o linie a tabelului este f"r" pereche, linia este omis" din tabelul rezultat. Acesta a fost cazul pentru jonc!iunile examinate mai sus. Standardul ISO furnizeaz" un alt set de operatori de jonc!iune numi!i jonc!iuni externe. Jonc!iunea extern" re!ine liniile care nu satisfac condi!ia de jonc!iune. Exist" trei tipuri de jonc!iuni externe:
1. jonc!iune extern" stng": SELECT o.*, m.* FROM ora#e o LEFT JOIN municipii m ON o.denumire = m.denum_m;
cod O1 O2 O3 denumire Bra#ov Codlea Timi#oara cod_m M3 NULL M1 denum_m Bra#ov NULL Timi#oara 10
2. jonc!iune extern" dreapt": SELECT o.*, m.* FROM ora#e o RIGHT JOIN municipii m ON o.denumire = m.denum_m; cod O3 NULL O1 denumire Timi#oara NULL Bra#ov cod_m M1 M2 M3 denum_m Timi#oara Ia#i Bra#ov
3. jonc!iune extern" total": SELECT o.*, m.* FROM ora#e o FULL JOIN municipii m ON o.denumire = m.denum_m; cod O3 NULL O2 O1 EXISTS #i NOT EXISTS Cuvintele cheie EXISTS #i NOT EXISTS se folosesc numai cu subinterog"ri. Ele produc un rezultat simplu adev"rat/fals. EXISTS este adev"rat dac" #i numai dac" exist" cel pu!in o linie n tabelul rezultat returnat" de c"tre interogare #i este fals" dac" subinterogarea returneaz" un tabel rezultat vid. NOT EXISTS este opusul lui EXISTS. n timp ce EXISTS #i NOT EXISTS verific" numai existen!a sau inexisten!a liniilor n tabelul rezultat al subinterog"rii, subinterogarea poate con!ine orice num"r de coloane. Pentru simplificare, subinterogarea urmnd una din aceste cuvinte cheie este de obicei de forma: (SELECT*). Exemplu: SELECT cod_gr, nr_semigrupe, nr_studen!i FROM grupe g WHERE EXISTS (SELECT * FROM sec!ii s WHERE g.cod_sec = s.cod_sec AND ini!iale=M ); cod_gr 1 2 nr_semigrupe 2 2 nr_studen!i 25 24 denumire Timi#oara NULL Codlea Bra#ov cod_m M1 M2 NULL M3 denum_m Timi#oara Ia#i NULL Bra#ov
Combinarea tabelelor rezultat (UNION, INTERSECT, EXCEPT) n SQL, putem folosi opera!iile normale cu mul!imi: reuniune, intersec!ia #i diferen!a, pentru a combina rezultatele a dou" sau mai multe interog"ri ntr-un singur tabel rezultat. Reuniunea a dou" tabele, A #i B, este un tabel ce con!ine toate liniile care sunt att n tabelul A ct #i n B. Intersec!ia a dou" tabele, A #i B este un tabel ce con!ine toate liniile comune celor dou" tabele. Diferen!a a dou" tabele, A #i B, este un tabel ce con!ine toate liniile care sunt n A, dar nu sunt n B. Exist" restric!ii asupra tabelelor care pot fi combinate folosind opera!iile cu mul!imi. Cea mai important" restric!ie este c" cele dou" tabele sunt compatibile (prin asociere), adic" ele au acea#i structur". Aceasta implic" faptul c" cele dou" tabele trebuie s" con!in" acela#i numar de coloane #i c", coloanele lor corespunz"toare s" aib" acelea#i tipuri #i lungimi de date. Este responsabilitatea utilizatorului de a se asigura c" valorile datelor n coloanele corespunz"toare provin din acela#i domeniu. De exemplu, ar fi f"r" sens s" combin"m o coloan" care con!ine vrsta personalului cu num"rul camerelor dintr-o proprietate, chiar dac" ambele coloane ar putea avea acela#i tip de dat": de exemplu, SMALLINT. Cei trei operatori de mul!imi sunt numi!i, n standardul ISO, UNION, INTERSECT #i EXCEPT. Formatul clauzei operatorului de mul!imi este, n fiecare caz: operator [ALL][CORRESPONDING [BY {coloan" [,]}]] Dac" CORRESPONDING BY este specificat, atunci opera!ia cu mul!imi este realizat" prin coloana (coloanele) specificate. Dac" CORRESPONDING este specificat dar f"r" clauza BY, opera!ia cu mul!imi este realizat" prin coloanele care sunt comune ambelor tabele. Dac" ALL este specificat, rezultatul poate include linii duble. 11
Unele dialecte ale SQL nu accept" INTERSECT #i EXCEPT, altele folosesc MINUS n locul lui EXCEPT. Exemple: 1. Utilizarea operatorului UNION: (SELECT denumire AS ora#e FROM ora#e WHERE denumire IS NOT NULL) UNION (SELECT denum_m AS ora#e FROM municipii WHERE denum_m IS NOT NULL) ora#e Bra#ov Codlea Timi#oara Ia#i 2. Utilizarea operatorului INTERSECT: (SELECT denumire AS ora#e FROM ora#e) INTERSECT (SELECT denum_m AS ora#e FROM municipii) ora#e Bra#ov Timi#oara
3.
(SELECT denumire AS ora#e FROM ora#e) EXEPT (SELECT denum_m FROM municipii); ora#e Codlea
care op!iunea DEFAULT nu a fost folosit" cnd s-a creat coloana. Lista_valoare_dat" trebuie s" se potriveasc" cu lista coloan" dup" cum urmeaz" : Num"rul elementelor din ambele liste trebuie s" fie acela#i Trebuie s" fie o corespondent" direct" ntre pozi!ia elementelor din ambele liste, astfel nct primul element din lista_valoare_dat! corespunde primului element din lista_coloan!, al doilea element din lista_valoare_dat! corespunde celui de-al doilea element din lista_coloan!, #.a.m.d. Tipul datei fiec"rui element din lista_valoare_dat! trebuie s" fie compatibil cu tipul datei coloanei corespunz"toare. Exemplu: INSERT INTO ora#e VALUES (O5, Deva); A doua form" a declara!iei INSERT permite copierea mai multor linii din una sau mai multe tabele n altele. Formatul este: INSERT INTO nume_tabel [(lista_coloan")] SELECT Nume_tabel #i lista_coloan! sunt definite ca mai sus n cazul ncas"rii unei singure linii. Clauza SELECT poate fi orice declara!ie valabil" SELECT. Liniile inserate n tabelul specificat sunt identice cu cele din tabelul rezultat produs de subselect. Acelea#i restric!ii aplicate primei forme a declara!iei INSERT se aplic" #i aici. Exemplu: INSERT INTO ora#e (SELECT cod_m, denum_m FROM municipii); Modificarea datei n baza de date (UPDATE) Declara!ia UPDATE permite schimbarea con!inutului liniilor existente dintr-un tabel specificat. Formatul comenzii este: UPDATE nume_tabel SET nume_coloan" 1=valoare_dat" 1[, nume_coloan" 2= valoare_dat" 2] [WHERE condi!ie_c"utare] Nume_tabel poate fi numele unui tabel de baz" sau un view actualizabil. Clauza SET specific" numele unei sau mai multor coloane care urmeaz" s" fie actualizate. Clauza WHERE este op!ional". Dac" este omis", coloana specificat" este actualizat" pentru toate liniile din tabel. Dac" clauza WHERE este specificat", numai acele linii care satisfac condi"ia_c!utare sunt actualizate. Noile valoare_dat! trebuie s" fie compatibile cu tipul de dat" pentru coloana corespunz"toare. Exemplu: UPDATE cadre_didactice SET func!ia =conf. WHERE func!ia=lect.; $tergerea datei din baza de date (DELETE) Declara!ia DELETE permite #tergerea liniilor dintr-un tabel specificat. Formatul comenzii este: DELETE FROM nume_tabel [WHERE condi!ia_c"utare] Ca #i n declara!iile INSERT #i UPDATE, nume_tabel poate fi numele unui tabel de baz" #i un view actualizabil. Condi"ia_c!utare este op!ional, dac" este omis", toate liniile sunt #terse din tabel. Acesta nu #terge tabelul, dac" se dore#te #tergerea con!inutul tabelului #i defini!ia tabelului, trebuie folosit", n schimb, declara!ia DROP TABLE. Dac" condi"ia_c!utare este specificat", numai acele linii care satisfac condi!ia sunt #terse. Exemplu: DELETE FROM cadre_didactice WHERE func!ia=lect.;
Limbajul de definire a datei SQL (LDD) ne permite crearea #i distrugerea obiectelor baz" de dat" (scheme, domenii, tabele, view-uri, rapoarte #i indexuri). n aceast" sec!iune, examin"m, pe scurt, cum s" cre"m #i s" distrugem scheme, tabele #i indexuri. Principalele declara!ii de definirii datei n SQL sunt: CREATE SCHEMA DROP SCHEMA CREATE DOMAIN ALTER DOMAIN DROP DOMAIN CREATE TABLE ALTER TABLE DROP TABLE CREATE VIEW DROP VIEW Deasemenea, urm"toarele dou" declara!ii au fost prev"zute de multe SGBD: CREATE INDEX DROP INDEX Aceste declara!ii sunt folosite pentru a crea, schimba sau distruge structurile care alc"tuiesc schema conceptual". nainte de a considera declara!iile LDD, discut"m sintaxa identificatorilor SQL #i tipurile de date SQL care pot fi folosite n definirea coloanelor tabel.
SMALLINT
Uneori pentru scopuri de manipulare #i conversie, tipurile de date caracter #i bit sunt atribuite tipurilor de date string, #i exact numeric #i aproximativ numerice sunt atribuite tipurilor de date numeric, deoarece ele mpart propriet"!isimilare. Datele caracter Datele caracter con!in o secven!" de caractere dintr-un set de caractere definite de implementator, adic" este definit" de c"tre distribuitorul dialectului particular SQL. Astfel, caracterele exacte care pot ap"rea ca valorile datelor ntr-o coloan" tip caracter vor varia. ASCII este una din seturile utilizate n comun ast"zi. Formatul pentru specificarea unui tip de dat" caracter este: CHARACTER [VARYING][length] CHARACTER can be abbreviated to CHAR and CHARACTER VARYING to VARCHAR. Cnd o coloan" caracter string este definit", o lungime poate fi specificat" s" indice maximul num"rului de caractere con!inute n coloane (lungimiea implicit" este 1). Un caracter string poate fi definit" ca avnd o lungime fix" sau variabil". Dac" stringul este definit cu lungime fix", #i dac" introducem un string cu cteva caractere mai pu!in dect aceast" lungime, stringul este completat cu spa!ii la dreapta pentru a ob!ine lungimea cerut". Dac" stringul este definit cu lungime variabil" #i introducem un string cu cteva caractere mai pu!in dect aceast" lungime, numai acele caractere introduse sunt rezervate, astfel folosindu-se mai pu!ine spa!ii. De 14
exemplu, num"rul matricol din coloana nr_mat a tabelului cadre_didactice, care are o lungime fix" de 4 caractere, este declarat ca: nr_mat CHAR(4) Coloana nume a tabelului cadre_didactice, care are un num"r variabil de caractere pn" la maximum de 20, este declarat" ca: nume VARCHAR(20) Datele bit Tipul de date bit este folosit pentru definirea stringurile bit, adic" o secven!" de cifre binare, fiecare avnd sau valoarea 0 sau 1. Formatul pentru specificarea tipului de dat" bit este similar cu cel al tipului de dat" caracter: BIT [VARYING][lenght] De exemplu, pentru a !ine lungimea fix" a stringului binar 0011, declar"m o coloan" bit_string, ca: bit_string BIT(4) Datele exact numerice Tipul de dat" exact numeric este folosit pentru definirea numerelor cu reprezentare exact". Num"rul con!ine cifre, un punct zecimal op!ional #i un semn op!ional. Un tip de dat" exact numeric con!ine o precizie #i o scal". Precizia d" num"rul total a cifrelor zecimale semnificative: adic" num"rul total al cifrelor, incluznd zecimalele dar excluznd punctul. Scala d" num"rul total al zecimalelor. De exemplu, valoarea exact numeric" -12.345 are precizia 5 #i scala 3. Un caz special survine n cazul datelor exact numerice ntregi. Exist" mai multe moduri de a specifica un tip de dat" exact numeric: NUMERIC [precision [, scale]] DECIMAL [precision [, scale]] INTEGER SMALLINT INTEGER poate fi prescurtat prin INT #i DECIMAL prin DEC. NUMERIC #i DECIMAL genereaz" numere n scriere zecimal". Valoarea implicit" a scalei este ntotdeauna 0, iar precizia implicit" este definit" de limbaj. INTEGER este folosit pentru numere mari pozitive sau negative ntregi. SMALLINT este folosit pentru numere mici pozitive sau negative ntregi. Specificnd acest tip de dat", pot fi rezervate mai pu!ine spa!ii de stocare pentru dat". De exemplu, valoarea absolut" maxim" care poate fi stocat" n acest tip de dat" poate fi 32767. Coloana vechime a tabelului cadre_didactice, care reprezint" num"rul anilor , este evident un ntreg mic #i poate fi declarat" ca: vechime SMALLINT Coloana salariu a tabelului cadre_didactice poate fi declarat" ca: salariu DECIMAL(9,2) care poate manipula o valoare pn" la 9,999,999.99. Datele aproximativ numerice Tipul de dat" aproximativ numeric este folosit pentru definirea numerelor care nu au o reprezentare exact", ca de pild" numerele reale. Aproximativ numeric, sau punct float, este similar nota!iei stiin!ifice n care un num"r este scris ca o putere de zece. De exemplu, 10E3, +5.2E6, -0.2E-4. Exist" mai multe moduri de a specifica un tip de dat" aproximativ numeric: FLOAT [precision] REAL DOUBLE PRECISION Datele dat!-timp Acest tip de dat" este folosit pentru a defini puncte n timp la un anumit grad de precizie. Ca exemple putem da date calendaristice, intervale de timp #i intervale ale unei zile. Standardul ISO folose#te pentru acest tip de dat" cuvintele rezervate: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR #i TIMEZONE_MINUTE. Ultimele dou" cmpuri specific" ora #i minutul pentru anumite zone geografice. Trei tipuri ale acestui tip de date sunt acceptate: DATE TIME [time_precision][WITH TIME ZONE] 15
TIMESTAMP [time_precision][ WITH TIME ZONE] DATE este folosit pentru a reprezenta datele calendaristice folosind cuvintele rezervate YEAR, MONTH #i DAY. TIME este folosit pentru a reprezenta timpul folosind cuvintele rezervate HOUR, MINUTE #i SECOND. TIMESTAMP reprezint" datele calendaristice #i timpul. Time_precision reprezint" unitatea de m"sur" a cmpului SECOND. Dac" nu este specificat acesta este implicit 0 n TIME fiind vorba de secunde, iar n TIMESTAMP valoarea implicit" este 6 fiind vorba de microsecunde. Cuvntul cheie WITH TIME ZONE controleaz" prezen!a cmpurilor TIMEZONE_HOUR #i TIMEZONE_MINUTE. Date interval Tipul de dat" interval este folosit pentru a reprezenta intervale de timp. Fiecare tip de dat" interval este alc"tuit dintr-un subset nvecinat al cmpurilor: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND. Exist" dou" clase de date interval: intervale an-lun" #i intervale zi-timp. Clasa an-lun" poate con!ine numai cmpurile YEAR #i/sau MONTH, iar clasa zi-timp poate con!ine o selec!ie invecinat" din DAY, HOUR, MINUTE, SECOND. Formatul pentru specificarea tipului da dat" interval este: INTERVAL {{start_cmp TO sfr#it_cmp} | cmp_dat"-timp} start_cmp=YEAR|MONTH|DAY|HOUR|MINUTE [(precizia cmpului principal al intervalului)] sfr#it_cmp=YEAR| MONTH|DAY|HOUR|MINUTE|SECOND [(precizia zecimalelor cmpului secundar al intervalului)] cmp_dat"-timp=start_cmp|SECOND [(precizia cmpului principal al intervalului [,precizia cmpului secundar al intervalului])]
zecimalelor
n toate cazurile precizia implicit" a cmpului start_cmp este 2. Exemplu: INTERVAL YEAR(2) TO MONTH reprezint" un interval de timp cu o valoare ntre 0 ani 0 luni #i 99 ani 11 luni. INTERVAL HOUR TO SECOND(4) reprezint" un interval de timp cu o valoare ntre 0 ore 0 minute 0 secunde #i 99 ore 59 minute 59.9999 secunde.
16
n prezent declara!iile CREATE #i DROP SCHEMA nu sunt nc" larg implementate. n unele implement"ri, n locul declara!iei CREATE SCHEMA este folosit" declara!ia urm"toare: CREATE DATABASE nume_baz"-date. Crearea unui tabel (CREATE TABLE) Avnd creat" structura bazei de dat", putem acum crea structurile tabelelor de baz" a rela!iilor pentru a fi localizate n baza de date. Crearea unui tabel se face folosind comanda CREATE TABLE, care are urm"toarea sintax" principal": CREATE TABLE nume_tabel (nume_coloan" tip_dat" [NULL | NOT NULL][,]) Aceast" comand" creaz" un tabel numit nume_tabel alc"tuit din una sau mai multe coloane al cmpului tip_dat! specificat. Specificatorul NULL este folosit pentru a indica dac" unei coloane i este permis sau nu s" con!in" null-uri. Un null este diferit de spa!iu sau 0 #i este folosit pentru a reprezenta date dac" acestea nu sunt disponibile, pierdute sau nu sunt aplicabile. Cnd NOT NULL este specificat, sistemul respinge orice ncercare de inserare a unui null n coloane. Dac" NULL este specificat, sistemul accept" null-uri. Valoarea implicit" ISO este NULL. De exemplu, pentru crearea tabelului cadre_didactice avem: CREATE TABEL cadre_didactice( nr_mat CHAR(4) NOT NULL, nume CHAR(15) NOT NULL, prenume CHAR(15) NOT NULL, func!ia CHAR(10) vechime SMALLINT ); Distrugerea unui tabel (DROP TABLE) Cu timpul structura unei baze de date se va schimba, tabele noi fiind create iar altele vechi nu vor mai fi necesare. Putem #terge un tabel suplimentar din baza de date folosind declara!ia DROP TABLE, care are formatul: DROP TABLE nume_tabel [RESTRICT | CASCADE] De exemplu pentru a distruge tabelul cadre_didactice folosim comanda: DROP TABLE cadre_didactice; Observ"m c" aceast" comand" #terge nu numai tabelul specificat, ci #i toate liniile din interiorul acesteia. Dac" se dore#te #tergerea liniilor din tabel dar s" se re!in" structura tabelului trebuie folosit" declara!ia DELETE. Dac" RESTRICT este specificat n comanda DROP TABLE #i exist" orice alte obiecte a c"ror existen!" depinde de existen!a tabelului, asupra c"ruia ac!ioneaz" comanda, SQL nu permite comenzii DROP TABLE s" continue. Dac" CASCADE este specificat SQL automat #terge toate obiectele dependente de tabel (#i obiectele dependente de aceste obiecte). O folosire uzual" a comenzii DROP TABLE este de a corecta gre#elile f"cute la crearea unui tabel. Dac" este creat un tabel cu o structur" incorect" se poate folosi DROP TABLE pentru a #terge tabelul nou creat #i ncepe din nou. Modificarea structurii unui tabel (ALTER TABLE) Standardul ISO furnizeaz" declara!ia ALTER TABLE pentru modificarea structurii unui tabel odat" ce a fost creat. Definirea declara!iei ALTER TABLE n standardul ISO este alc"tuit" din 6 op!iuni pentru: a ad"uga o nou" coloan" la un tabel; a #terge o coloan" dintr-un tabel ; a ad"uga o nou" restric!ie pentru tabel; a #terge o restric!ie a tabelului; a stabilii o valoare implicit" pentru o coloan"; a #terge o valoare implicit" a coloanei. Formatul principal al declara!iei este:
17
ALTER TABLE nume_tabel [ADD [COLUMN] nume_coloan" tip_dat" [NOT NULL][UNIQUE] [DEFAULT op!iune_implicit"][CHECK(condi!ie_c"utare)]] [DROP [COLUMN] nume_coloan" [RESTRICT | CASCADE]] [ADD [CONSTRAINT [nume_restric!ie]] defini!ie_restric!ie_tabel] [DROP CONSTRAINT nume_restric!ie [RESTRICT | CASCADE]] [ALTER [COLUMN] SET DEFAULT op!iune_implicit"] [ALTER [COLUMN] DROP DEFAULT] unde parametrii sunt defini!i ca #i n declara!ia CREATE TABLE. Defini!ie_restric!ie_tabel este una din clauzele: PRIMARY KEY, UNIQUE, FOREIGN KEY sau CHECK. Clauza ADD COLUMN este similar" cu definirea unei coloane din declara!ia CREATE TABLE. Clauza DROP COLUMN specific" numele coloanei ce trebuie #tears" din defini!ia tabelului. Aceast" clauz" are un calificativ op!ional care ne permite s" specific"m dac" ac!iunea DROP este n cascad" sau nu. Avem acela# concept ca #i la calificativul RESTRICT | CASCADE a declara!iei DROP TABLE. De exemplu pentru a ad"uga coloana vechime la tabelul cadre_didactice folosim comanda: ALTER TABLE cadre_didactice ADD vechime INTEGER(2); Declara!ia ALTER TABLE nu este disponibil" n toate dialectele SQL. n unele dialecte, declara!ia nu poate fi folosit" pentru a muta o coloan" existent" dintr-un tabel. Crearea unui index (CREATE INDEX) Un index este o structur" care furnizeaz" accesul rapid la liniile unui tabel bazat pe valorile uneia sau mai multor coloane. Prezen!a unui index poate mbun"t"!i sim!itor performan!a unei interog"ri. Indexurile sunt create, de obicei, pentru a satisface criteriul de c"utare particular dup" ce tabelul a fost folosit un timp #i a crescut n m"rime. Crearea indexurilor nu este standardizat" n SQL. Totu#i multe dialecte accept" cel pu!in urm"toarea form" a acestei comenzi: CREATE [UNIQUE] INDEX nume_index ON nume_tabel (colon" [ASC |DESC] [,]) Coloanele specificate alc"tuiesc cheia index #i ar trebui listate n ordine descresc"toare. Indexurile pot fi create numai n tabele de baz" nu #i n view-uri. Dac" clauza UNIQUE este folosit", unicitatea coloanei sau combina!iei de coloane indexate va fi decretat" de c"tre sistem. De#i indexurile pot fi create oricnd, putem avea probleme dac" ncerc"m s" cre"m un index unic pe un tabel care con!ine articole, deoarece valorile provenite din coloana (coloanele) indexat" poate s" con!in" deja dubluri. De aceea este mai bine s" cre"m indexuri unice, cel pu!in pentru coloane cheie principale, atunci cnd tabelul de baz" este creat #i sistemul nu va asigura automat unicitatea cheii principale. Pentru tabelul cadre_didactice putem crea urm"toarele indexuri: CREATE UNIQUE INDEX matricol_ind ON cadre_didactice(nr_mat); CREATE UNIQUE INDEX nume_ind ON cadre_didactice(nume); Pentru fiecare coloan" putem specifica dac" ordinea este ascendent" (ASC) sau descendent" (DESC), valoarea implicit" fiind ASC. $tergerea unui index (DROP INDEX) Dac" cre"m un index pentru un tabel de baz" #i mai trziu decidem c" nu mai este necesar, declara!ia DROP INDEX #terge indexul din baza de date. DROP INDEX are formatul: DROP INDEX nume_index Declara!ia urm"toare va #terge indexul creat n exemplul anterior: DROP INDEX matricol_ind;
2. View vertical care pemite restric!ionarea accesului utilizatorilor la anumite coloane ale unui tabel ale unui tabel: CREATE VIEW cadre_lect AS SELECT nr_mat, nume, prenume FROM cadre_didactice WHERE func!ia = lect.; nr_mat 1111 1116 nume Popa Ionescu prenume Ioan Mircea
CREATE VIEW sec!ii_grupe (sec!ia, grupa) AS SELECT s.denumire, g.cod_gr FROM sec!ii s, grupe g WHERE s.cod_sec = g.cod_sec; GROUP BY s.denumire; sec!ia Matematic" Matematic" Informatic" Matematic"-fizic" Matematic"-fizic" Fizic"-chimie grupa 1 2 1 1 2 1 19
2. Universalitatea Schimb"rile oric"ror tabele n interogarea definit" sunt imediat reflectate n view. 3.
Securitatea 20
Fiecare utilizator poate avea privilegiul de a accesa baze de date numai printr-un mic set de view-uri, care con!ine date potrivite acelui utilizator, astfel restrngnd #i controlnd accesul la baza de date a fiec"rui utilizator.
4. Complexitatea redus" Un view poate simplifica interog"rile prezentarea datelor din mai multe tabele ntr-un singur tabel #i, astfel, transformnd interog"ri multi-tabel n interog"ri 1-tabel. 5. Selectabilitatea View-urile furnizeaz" posibilitatea ca acelea#i tabele principale s" poat" fi v"zute de diferi!i utilizatori, n diferite moduri. 6. Integritatea datei Dac" WITH CHECK OPTION a declara!iei CREATE VIEW este folosit, SQL asigur" faptul c" nici o linie care nu satisface clauza WHERE a interog"rii definite nu este niciodat" ad"ugat" la orice tabel principal prin view, prin aceasta asigurnd integritatea view-ului.
Dezavantaje. De#i view-urile furnizeaz" multe beneficii semnificative, exist" de asemenea, cteva dezavantaje ale view-urilor SQL:
1. Restric!ia actualiz"rii n unele cazuri un view nu poate fi actualizat. 2. Restric!ia structurii Structura unui view este determinat" la timpil cre"rii lui. Dac" interogarea definit" a fost de forma SELECT * FROM , atunci * se refer" la coloanele tabelului de baz" existent cnd a fost creat view-ul. Dac" coloanele sunt ulterior ad"ugate la tabelul de baz", atunci aceste coloane nu vor ap"rea n view, n afar" de cazul cnd view-ul este #ters #i recreat. 3. Performan!a Exist" un neajuns care apare cnd folosim un view. n unele cazuri acest lucru va fi neglijabil; n alte cazuri poate fi mai problematic. De exemplu, un view definit printr-o interogare complex" multi-tabel poate lua un timp ndelungat pentru a fi prelucrat pe cnd rezolu!ia view-ului trebuie s" jonc!ioneze tabelele de fiecare dat" cnd view-ul este accesat. Rezolu!ia view-ului cere resurse n plus calculatorului.
21