Sunteți pe pagina 1din 21

SQL

1.1. Prezentare general!


Un limbaj particular care provine din dezvoltarea unui model rela!ional este Limbajul Interog"rii Structurate, sau SQL. n ultimii ani SQL a devenit limbajul standard al bazelor de date rela!ionale, n 1986 un standard pentru SQL fiind definit de American National Standards Institute (ANSI), care a fost preluat ca standard interna!ional de c"tre International Standards Organization (ISO) n 1987. Mai mult de 100 de sisteme de administrare a bazelor de date suport" SQL, rulate att pe calculatoare personale ct #i pe re!ele de calculatoare. n continuare, prezentarea SQL va fi f"cut" folosind n special terminologia ISO, n acest capitol fiind prezentate no!iunile de baz" ale limbajului SQL.

1.1.1. Obiectivele "i terminologia SQL


n mod ideal un limbaj de baze de date ar trebui s" permit" utilizatorului s" creeze baze de date #i structuri rela!ionale; ar trebui s" permit" realizarea unor opera!ii de baz" asupra datelor ca: inserarea, modificarea #i #tergerea datelor din rela!ii; #i ar trebui s" permit" realizarea att a interog"rilor simple ct #i complexe pentru a transforma datele ini!iale n informa!ii. Ca o completare un limbaj de baze de date trebuie s" gestioneze aceste evenimente cu un efort minim, #i structura #i sintaxa comenzilor trebuie s" fie relativ u#or de nv"!at. n final acesta trebuie s" fie portabil, adic" s" fie conform unor standarde recunoscute n domeniu astfel nct s" putem folosi acelea#i structuri #i sintaxe de comenzi cnd trecem de la un SGBD la altul. SQL inten!ioneaz" s" satisfac" aceste cerin!e. SQL este un exemplu de limbaj construit pentru folosi rela!iile pentru a transforma intr"rile n ie#irile cerute. Ca limbaj, SQL are dou" mari componente: un limbaj de definire a datelor (LDD) pentru definirea structurii bazelor de date ; un limbaj de manipulare a datelor (LMD) pentru recuperarea #i actualizarea datelor ; SQL con!ine numai aceste comenzi definitorii #i manipulative; nu con!ine comezi de control ca: IFTHENELSE, GO TO, DOWHILE ori alte astfel de comenzi. Acestea trebuiesc implementate folosind un limbaj de programare sau n mod interactiv prin deciziile utilizatorului. SQL poate fi utilizat n dou" moduri. Primul mod este de a folosi SQL interactiv, introducnd comenzile de la un terminal. Al doilea mod este de a ata#a comenzile SQL unui limbaj de programare procedural. SQL este un limbaj relativ u#or de nv"!at: Este un limbaj non-procedural: utilizatorul mai degrab" specific" ce informa!ii l intereseaz", dect cum se ob!in acestea. Cu alte cuvinte nu cere s" se specifice metodele de acces la date. Ca majoritatea limbajelor moderne, SQL are n mod esen!ial un format liber, ceea ce nseamn" c" blocurile de declara!ii nu trebuie tip"rite n zone particulare ale ecranului. Structura comenzilor con!ine cuvinte din engleza standard: CREATE TABLE, INSERT, SELECT. SQL poate fi folosit de o mul!ime de utilizatori incluznd administratorii bazelor de date, programatorii de aplica!ii #i multe alte tipuri de utilizatori. Exist" acum un standard interna!ional pentru limbajul SQL (ISO, 1992), care este considerat limbajul standard de definire #i manipulare a bazelor de date rela!ionale. Standardul ISO SQL nu folose#te termeni formali pentru rela!ii, atribute #i tupluri, n schimb folose#te termenii de tabele, coloane #i linii. De asemenea trebuie s" punct"m faptul c" SQL nu ader" strict la o defini!ie a modelului rela!ional. De exemplu, SQL permite tabelul produs ca rezultat a opera!iei SELECT ce con!ine linii duble, impunnd o ordine a coloanelor, #i de asemenea permite utilizatorului de a ordona liniile unui tabel.

1.1.2. Scrierea comenzilor SQL


n acest" sec!iune vom descrie structura unei declara!ii SQL #i nota!iile pe care le folosim n definirea formatelor pentru diferite construc!ii SQL. O declara!ie SQL con!ine cuvinte rezervate #i cuvinte definite de c"tre utilizator. Cuvintele rezervate sunt o parte fixat" a limbajului SQL #i au un n!eles fix. Ele trebuie scrise exact #i nu pot fi desp"r!ite cu cratim". Cuvintele definite de c"tre utilizator sunt create !inndu-se seama de reguli specifice de sintax" #i reprezint" numele diferitelor obiecte de baz" de date cum ar fi rela!ii, coloane, indexuri etc. Cuvintele dintr-o declara!ie sunt de asemenea construite !inndu-se seama de un set de reguli de sintax". De#i standardul nu cere acest lucru, multe dialecte SQL pretind folosirea unui declara!ii finale pentru a marca sfr#itul fiec"rei declara!ii SQL (de obicei se folose#te ;). 1

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.

1.2. SQL - limbaj de manipulare a datelor (LMD)


Aceast" sec!iune se refer" la declara!ii SQL LMD disponibile, numite: SELECT interogarea datelor din baza de date, INSERT inserarea datelor ntr-un tabel, UPDATE actualizarea datelor ntr-un tabel, DELETE #tergerea datelor dintr-un tabel. Datorit" complexit"!ii declara!iilor SELECT #i a simplit"!ii relative a altor declara!ii LMD o mare parte din aceast" sec!iune va fi dedicat" declara!iei SELECT #i diferitelor formate ale acesteia. La nceput vor fi prezentate interog"ri simple #i succesiv acestea se vor complica pentru a ar"ta c" pot fi generate interog"ri care folosesc la sortarea, gruparea, combinarea datelor #i de asemenea interog"ri pe mai multe tabele. n finalul aceastei sec!iuni vor fi prezentate declara!iile INSERT, UPDATE #i DELETE. Pe parcursul acestei sec!iuni vor fi date exemple pentru toate comenzile SQL care vor fi prezentate, iar aceste exemple vor folosi, pentru a ilustra felul n care opereaz" aceste comenzi, urm"toarele rela!ii: cadre_didactice (nr_mat, nume, prenume, func!ia, vechime, salariu) sec!ii (cod_sec, denumire, ini!iale) grupe (cod_sec, cod_gr, nr_semigrupe, nr_studen!i) ora#e (cod, denumire); municipii(cod_m, denum_m); Pentru aceste rela!ii vom considera urm"toarele nregistr"ri: Tabelul cadre_didactice: nr_mat nume 1111 Popa 1112 Liana 1113 Barbu 1114 $tefan 1115 Savu 1116 Ionescu Tabelul sec!ii: cod_sec 1 2 3 4 denumire Matematic" Informatic" Matematic"-fizic" Fizic"-chimie ini!iale M I MF FC 2

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

Tabelul grupe: cod_sec 1 1 2 3 3 4 Tabelul ora#e: cod O1 O2 O3

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

denumire Bra#ov Codlea Timi#oara

Tabelul municipii: cod_m M1 M2 M3

denum_m Timi#oara Ia#i Bra#ov

1.2.1. Comanda SELECT


Scopul declara!iei SELECT este de a recupera #i a afi#a datele din unul sau mai multe tabele de baze de date. Este o comand" extrem de puternic" capabil" de a echivala n algebra rela!ional" selec!ia, proiec!ia #i jonc!iunea ntr-o singur" declara!ie. SELECT este comanda cea mai des folosit" n SQL. Forma general" a declara!iei SELECT este : SELECT [DISTINCT|ALL]{* | [expresie_coloan" [AS nume_nou]][,]} FROM nume_tabel [alias][,] [WHERE condi!ie] [GROUP BY list"_coloane] [HAVING condi!ie] [ORDER BY list"_coloane] n aceast" declara!ie expresie_coloan! reprezint" o coloan" sau o expresie; alias reprezint" o prescurtare a numelui de tabel. Pentru cuvintele rezervate avem urm"toarea semnifica!ie: FROM specific" tabelul sau tabelele care vor fi folosite; WHERE specific" liniile care trebuiesc recuperate cu ajutorul unor condi!ii; GROUP BY grupeaz" toate liniile din tabele care au aceea#i valoare pe coloana specificat"; HAVING selecteaz" grupurile care respect" condi!ia de c"utare; SELECT specific" coloanele care vor ap"rea n rezultatul interog"rii; ORDER BY ordoneaz" valorile returnate dup" coloanele specificate. Ordinea clauzelor n declara!ia SELECT nu poate fi schimbat". Singurele dou" clauze obligatorii sunt primele dou": SELECT #i FROM celelalte fiind op!ionale. Opera!ia SELECT este nchis", rezultatul interog"rii unui tabel fiind tot un tabel. Exist" mai multe variante ale acestei comenzi, totu#i exemplele care urmeaz" ilustreaz" principalele variante ale acestei declara!ii. Interog!ri simple

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

2. Recuperarea liniilor unui tabel doar pentru anumite coloane ale: 3

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.

Folosirea cmpurilor calculate:

SELECT nr_mat, nume, prenume, salariu/5 FROM cadre_didactice;

nr_mat 1111 1112 1113 1114 1115 1116 Clauza WHERE

nume Popa Liana Barbu $tefan Savu Ionescu

prenume Ioan Carmen Traian Elena Alexandru Mircea

col 4 80,000 140,000 180,000 180,000 190,000 80,000

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

nr_mat 1113 1114 1115

nume Barbu $tefan Savu

prenume Traian Elena Alexandru

salariu 900,000 900,000 950,000

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

prenume Carmen Traian Elena

salariu 700,000 900,000 900,000

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.

Utilizarea func!iei COUNT(DISTINCT):

SELECT COUNT(DISTINCT salariu) AS contor FROM cadre_didactice WHERE salariu BETWEEN 500,000 AND 950,000; contor 3

3.

Utilizarea func!iilor COUNT #i SUM:

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

Conceptual, SQL realizeaz" interogarea n felul urm"tor:

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.

Utilizarea operatorului EXEPT:

(SELECT denumire AS ora#e FROM ora#e) EXEPT (SELECT denum_m FROM municipii); ora#e Codlea

1.2.2. Actualiz!rile bazelor de date


SQL este un limbaj complet de manipulare a datelor care poate fi folosit pentru modificarea datei n baza de date precum #i interogarea bazei de date. Comenzile pentru modificarea bazei de date nu sunt a#a complexe ca declara!ie SELECT. n aceast" sec!iune, vom descrie cele 3 declara!ii SQL care sunt disponibile pentru a modifica con!inuturile tabelelor n baza de date: INSERT se agaug" noi linii de date ntr-un tabel UPDATE se modific" data existent" ntr-un tabel DELETE se mut" linii de date dintr-un tabel Ad!ugarea datei n baza de date (INSERT) Exist" dou" forme a declara!iei INSERT. Prima form" permite inserarea unei singure linii ntr-un tabel specificat. Formatul declara!iei INSERT este: INSERT INTO nume_tabel [(list"_coloan")] VALUES (lista_valoare_dat") nume_tabel poate fi un tabel de baz" sau un view actualizabil #i lista_coloan! reprezint" o list" a unuia sau mai multor nume coloane separate prin virgul". Lista _coloan! este op!ional", dac" este omis", SQL presupune o list" a tuturor coloanelor n ordinea lor original" din CREATE TABLE. Dac" este specificat", atunci orice coloan" care este omis" din list" trebuie s" fie declarat" ca #i coloan" NULL c"nd tabelul a fost creat, n cazul n 12

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.;

1.3. SQL - limbaj de definire a datelor (LDD)


13

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.

1.3.1. Identificatorii SQL


Identificatorii SQL sunt folosi!i pentru a identifica obiectele n baza de date, cum ar fi numele tabelelor, numele rapoartelor #i coloanele. Caracterele care pot fi folosite ntr-un identificator SQL definit de utilizator trebuie s" apara ntr-un set de caractere. Standardul ISO prevede urm"torul set de caractere, care con!ine literele mari AZ, literele mici az, cifrele 09 #i caracterele subliniate ( _ ). Este, de asemenea, posibil" specificarea unui set de caractere alternative. Urm"toarele restric!ii sunt impuse pe un identificator: Un identificator nu poate fi mai lung dect 128 de caractere (multe dialecte au o limit" mai mic" dect aceasta). Un identificator trebuie s" nceap" cu o liter". Un identificator nu poate con!ine spa!ii.

1.3.2. Tipurile de date ISO SQL


Exist" 6 tipuri de date scalare SQL definite n standardul ISO, prezentate n tabelul care urmeaz": Tipul de dat" caracter bit exact numeric aproximativ numeric dat"-timp interval Declara!ii VARCHAR BIT VARYING DECIMAL, REAL, TIME,

CHAR, BIT, NUMERIC, FLOAT, DATE, INTERVAL,

INTEGER, DOUBLE PRECISION TIMESTAMP

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.

1.3.3. Crearea unei baze de date


Procesul de creare a bazei de date difer" semnificativ de la produs la produs. Conform standardului ISO, rela!iile #i alte obiecte ale bazei de date exist" ntr-un mediu. Printre altele, fiecare mediu este alc"tuit dintr-unul sau mai multe cataloage #i fiecare catalog este alc"tuit dintr-un set de scheme. O schem" este o colec!ie specificat" a obiectelor bazei de date care sunt legate una de alta ntr-un anumit mod (toate obiectele din baza de date sunt descrise ntr-o schem" sau alta). Obiectele dintr-o schem" pot fi tabele, view-uri, domenii, compara!ii, transla!ii #i seturi de caractere. Toate obiectele dintr-o schem" au acela#i proprietar #i mpart un num"r de valori implicite. Standardul ISO define#te prin implementare mecanismul pentru crearea #i distrugerea cataloagelor #i furnizeaz" mecanisme pentru crearea #i distrugerea schemelor. Declara!ia de definire a schemei are forma (simplificat") urm"toare: CREATE SCHEMA [nume | AUTHORIZATION creator-identificator] De aceea, dac" creatorul unei scheme sql-schem" este Ionescu, declara!ia SQL este: CREATE SCHEMA sql-schem" AUTHORIZATION Ionescu; O schem" poate fi distrus" folosind declara!ia DROP SCHEMA, care are forma urm"toare: DROP SCHEMA nume [RESTRICT | CASCADE] Dac" RESTRICT este specificat, care este #i valoarea implicit" dac" nici unul din calificative nu este specificat, schema trebuie s" fie vid" sau opera!ia e#ueaz". Dac" CASCADE este specificat, opera!ia aranjeaz" n cascad" toat" obiectele asociate schemei n ordinea definit" nainte.

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;

1.4. SQL avansat. View-uri


Un view este rezultatul dinamic a uneia sau mai multor opera!ii rela!ionale care opereaz" pe rela!ii de baz" pentru a produce alt" rela!ie. Un view este o rela!ie virtual" care nu exist", de fapt, n baza de date, dar este produs" pe baza cerin!ei unui utilizator particular. 18

1.4.1. Crearea unui view (CREATE VIEW)


Formatul declara!iei CREATE VIEW este: CREATE VIEW nume_view [(nume_coloan" [,])] AS subselect [WITH [CASCADED | LOCAL] CHECK OPTION] Se poate repartiza, op!ional, un nume pentru fiecare coloan" din view. Dac" o list" a numelor de coloan" este specificat", atunci trebuie s" aib" acela#i num"r de elemente ca #i num"rul coloanelor produse de c"tre subselect. Dac" lista numelor de coloan" este omis", fiecare coloan" din view ia numele coloanei corespunz"toare din subselect. Lista numelor de coloan" trebuie s" fie specificat" n cazul n care exist" orice ambiguitate n numele unei coloane. Aceasta se poate ntmpla dac" subselectul include coloane calculate #i subclauza AS nu a fost folosit" pentru a numi astfel de coloane sau produce dou" coloane cu nume identice ca rezultat a unei jonc!iuni. Subselectul este cunoscut ca interogare definit". Dac" WITH CHECK OPTION este specificat, SQL asigur" faptul c" dac" o linie nu ajut" la satisfacerea clauzei WHERE a interog"rii definite a view-ului, aceasta nu este ad"ugat" la tabelul view-ului. De#i toate view-urile sunt create n acela#i mod, n practic" diferite tipuri de view-uri sunt folosite pentru diferite scopuri: 1. Wiew orizontal, care pemite restric!ionarea accesului utilizatorilor la anumite linii ale unui tabel: CREATE VIEW vechime_cadre AS SELECT * FROM cadre_didactice WHERE vechime >= 25; nr_mat 1113 1114 1115 nume Barbu $tefan Savu prenume Traian Elena Alexandru func!ia conf. conf. conf. vechime 25 25 28 salariu 900,000 900,000 950,000

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

3. View grupat #i view jonc!ionat:

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

1.4.2. #tergerea unui view (DROP VIEW)


Un view este #ters din baza de date cu declara!ia: DROP VIEW nume_view [RESTRICT | CASCADE]; Dac" CASCADE este specificat, DROP VIEW #terge toate obiectele dependente, cu alte cuvinte, #terge toate obiectele de referin!" ale view-ului. Dac" RESTRICT este specificat #i exist" orice alte obiecte a c"ror existen!" depinde de existen!a view-ului ce urmeaz" a fi #ters, comanda este respins". Valoarea imlicit" este RESTRICT. De exemplu, putem #terge view-ul vechime_cadre folosind declara!ia: DROP VIEW vechime_cadre;

1.4.3. Restric$ii asupra view-urilor


Standardul ISO impune cteva restric!ii importante n crearea #i folosirea view-urilor, de#i exist" varia!ii considerabile ntre dialecte. Dac" o coloan" din view se bazeaz" pe o func!ie complex", atunci coloana poate ap"rea numai n clauzele SELECT #i ORDER BY ale interog"rii care acceseaz" view-ul. n particular, o astfel de coloan" nu poate fi folosit" ntr-o clauz" WHERE #i nu poate fi folosit" ca argument pentru o func!ie complex" n orice interogare bazat" pe view; Un view grupat nu poate fi jonc!ionat cu un tabel sau un view.

1.4.4. Actualizabilitatea view-urilor


Toate actualiz"rile unui tabel sunt imediat reflectate n toate view-urile care cuprind acel tabel. Analog, putem s" ne a#tept"m la faptul c" dac" un view este actualizat atunci tabelul (tabelele) va reflecta acea schimbare. Standardul ISO specific" view-urile care trebuie s" fie actualizabile ntr-un sistem corespunz"tor standardului. Defini!ia dat" n standardul ISO este c" un view este actualizabil dac" #i numai dac": DISTINCT nu este specificat, adic" liniile duble nu trebuie eliminate din rezultatele interog"rii. Fiecare element din lista SELECT a interog"rii definitorii este un nume de coloan" (mai degrab" dect o constant", o expresie sau o func!ie complex") #i nici o coloan" nu apare mai mult dect o dat". Clauza FROM specific" numai un tabel, adic" view-ul trebuie s" aib" un singur tabel surs" asupra c"ruia utilizatorul are privilegiile cerute. Dac" tabelul surs" ns"#i este un view, atunci acest view trebuie s" satisfac" aceste condi!ii. De aceea, aceasta exclude orice view-uri bazate pe o jonc!iune, reuniune (UNION), intersec!ie (INTERSECT) #i diferen!" (EXCEPT). Clauza WHERE nu include nici un SELECT intercalat care se refer" la tabelul din clauza FROM. Nu exist" clauzele GROUP BY #i HAVING n interogarea definitorie. n plus, fiecare linie ad"ugat" prin view nu trebuie s" ncalce restric!iile de integritate ale tabelului. Cu alte cuvinte, SGBD-ul trebuie s" poat" s" copieze orice linie sau coloan" napoi n linia sau coloana sa din tabelul surs".

1.4.5. Avantaje "i dezavantaje ale view-urilor


Avantaje. 1. Independen!a datei Un view poate prezenta o imagine consistent", nemodificabil" a structurii bazei de date, chiar dac" tabelele surs" principale sunt schimbate (de exemplu, coloane ad"ugate sau #terse, rela!ii schimbate, tabele dezbinate, restructurate sau redenumite). Dac" coloanele sunt ad"ugate sau #terse dintr-un tabel #i aceste coloane nu sunt cerute de c"tre view, atunci definirea view-ului nu necesit" schimb"ri. Dac" un tabel existent este rearanjat sau dezbinat, un view poate fi definit astfel nct utilizatorul poate continua s" vad" vechiul tabel. n cazul dezbin"rii unui tabel, vechiul tabel poate fi recreat prin definirea unui view jonc!ionnd noile tabele.

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

S-ar putea să vă placă și