Sunteți pe pagina 1din 33

SQL

CURS 4 SQL
Noiuni elementare de baze de date Indiferent dac o tii sau nu, folosii baze de date tot timpul. De fiecare dat cnd selectai un nume din agenda cu adrese de e-mail, folosii o baz de date. Dac efectuai o cutare ntr-un site specializat din Internet, folosii o baz de date. Cnd ncepei sesiunea de lucru n reea, v validai numele i parola prin comparaie cu datele dintr-o baz de date. Chiar i atunci cnd v folosii cardul ATM la un bancomat, utilizai baze de date pentru confirmarea codului PIN i verificarea strii contului. Ce este SQL? SQL reprezint o abreviere de la Structured Querry Language. SQL este un limbaj special conceput pentru comunicarea cu bazele de date. Spre deosebire de alte limbaje, SQL este alctuit dintr-un numr foarte redus de cuvinte. SQL este proiectat pentru a v furniza o modalitate simpl i eficient de a citi i a scrie date ntr-o baz de date. Regsirea datelor Instruciunea SELECT Instruciunile SQL sunt alctuite din termeni simpli, n limba englez. Aceti termeni se numesc cuvinte cheie, fiecare instruciune SQL fiind alctuit din unul sau mai multe cuvinte cheie (nu denumii niciodat un tabel sau un cmp folosind un cuvnt cheie). Instruciunea SQL pe care o vei folosi probabil cel mai frecvent este instruciunea SELECT. Rolul su const n regsirea informaiilor dintr-unul sau mai multe tabele. Pentru a utiliza instruciunea SELECT n vederea regsirii datelor dintr-un tabel, trebuie s precizai cel puin dou informaii: ce anume dorii s selectai i locaia de unde dorii s selectai. SELECT nume_student FROM Studenti

SQL

Exemplul de mai sus folosete instruciunea SELECT pentru a regsi o singur coloan, denumit nume_studenti, din tabelul Studenti. Numele coloanei dorite este specificat imediat dup cuvntul cheie SELECT, iar cuvntul cheie FROM indic numele tabelului din care vor fi regsite datele. Rezultatul acestei instruciuni este prezentat n continuare:

O instruciune SELECT simpl, precum cea prezentat anterior, returneaz toate rndurile dintr-un tabel. Datele nu sunt filtrate i nici sortate. Toate spaiile albe suplimentare incluse ntr-o instruciune SQL vor fi ignorate la prelucrarea instruciunii respective. Instruciunile SQL pot fi specificate ntr-o singur linie lung sau pot fi divizate pe mai multe linii. Instruciunile multiple trebuie separate prin caractere punct i virgul (;). Este important de reinut c instruciunile SQL nu fac diferena ntre majuscule i minuscule (este posibil ca acest lucru s nu fie valabil pentru numele tabelelor sau ale cmpurilor, depinznd de programul dumneavoastr SGBD). Pentru a regsi mai multe coloane dintr-un tabel, se folosete aceeai instruciune SELECT specificnd mai multe nume de coloane, iar fiecare nume de coloan trebuie separat de urmtorul printr-o virgul (nu i dup numele ultimei coloane). SELECT nume_studenti, prenume_studenti, varsta FROM Studenti;

SQL

Instruciunile SELECT pot solicita afiarea tuturor coloanelor, fr a fi necesar menionarea individual a numelor lor. Aceasta se realizeaz cu ajutorul caracterului de nlocuire asterisc (*) plasat n locul numelor efective ale coloanelor. SELECT * FROM Studeni;

SQL

Sortarea datelor regsite

Instruciunile SQL sunt alctuite din clauze, unele obligatorii, altele opionale. De obicei, o clauz este compus dintr-un cuvnt cheie i datele furnizate. Un exemplu n acest sens l reprezint clauza FROM a instruciunii SELECT. n vederea sortrii n mod explicit a datelor regsite folosind o instruciune SELECT, se va folosi clauza ORDER BY. Aceasta preia numele uneia sau mai multor coloane n funcie de care urmeaz s se sorteze datele de ieire. SELECT nume_studenti, prenume_studenti FROM Studenti ORDER BY nume_studenti;

Instruciunea SELECT din exemplu conine o clauz ORDER BY prin care sistemului de gestiune a bazelor de date i se indic s sorteze datele n ordine alfabetic, n funcie de coloana nume_student. Destul de frecvent, coloanele folosite ntr-o clauz ORDER BY vor fi dintre cele selectate pentru afiare. Totui, acest lucru nu este o necesitate i este posibil s se sorteze date n funcie de o coloan care nu este afiat.

SQL

Sortarea n funcie de mai multe coloane Deseori este necesar sortarea n funcie de mai multe coloane. Pentru acest lucru specificai numele coloanelor, separate prin virgul, secvena de sortare corespunznd specificaiilor. SELECT id, nume_studenti, prenume_studenti, varsta FROM Studenti ORDER BY varsta, nume_studenti;

Sortarea n funcie de poziia coloanei n afar de posibilitatea de a specifica ordinea de sortare folosind numele coloanelor, clauza ORDER BY permite i ordonarea specificat prin poziia relativ a coloanei. SELECT id, nume_studenti, prenume_studenti, varsta FROM Studenti ORDER BY 4, 2;

SQL

Rezultatul instruciunii este acelai, diferena constnd n faptul c n loc de a specifica numele coloanelor dup care se face sortarea, se specific poziiile relative ale coloanelor din lista SELECT. Principalul avantaj al acestei tehnici const n scutirea reintroducerii de la tastatur a numelor coloanelor. Dar exist i unele dezavantaje. Mai nti, neprecizarea n mod explicit a numelor coloanelor mrete probabilitatea de specificare, din greeal, a unei alte coloane. n al doilea rnd, este foarte uor ca datele s fie reordonate, tot din greeal, la efectuarea de modificri n lista SELECT. i, n final, este clar c nu se poate folosi acest procedeu cnd se sorteaz dup coloane care nu se gsesc n lista SELECT. Specificarea direcie de sortare Sortarea datelor nu este limitat la ordinea de stocare cresctoare (de la A la Z). Dei aceasta este ordinea prestabilit de sortare, clauza ORDER BY poate fi de asemenea utilizat pentru a sorta n ordine descresctoare (de la Z la A). Pentru a sorta n ordine descresctoare, este necesar specificarea cuvntului cheie DESC. SELECT id, nume_studenti, prenume_studenti FROM Studenti ORDER BY nume_studenti DESC;

SQL

Cuvntul cheie DESC se aplic numai datelor din coloana al crei nume l precede direct. Dac dorii s sortai n ordine descresctoare pe mai multe coloane, asigurai-v ca numele fiecrei coloane s fie nsoit de cuvntul cheie DESC. Filtrarea datelor Utilizarea clauzei WHERE De obicei, tabelele dintr-o baz de date conin cantiti mari de date i deseori nu avei nevoie s regsii toate rndurile unui tabel. Vei dori s extragei un subset al datelor din tabel, conform necesitilor, pentru anumite operaii sau pentru rapoarte. Regsirea numai a datelor dorite implic specificarea unor criterii de cutare, cunoscute i sub numele de condiie de filtrare. n cadrul unei instruciuni SELECT, datele sunt filtrate prin specificarea criteriilor de cutare n clauza WHERE. Clauza WHERE este specificat imediat dup numele tabelului (clauza FROM), aa cum se vede i n exemplul urmtor: SELECT nume_studenti, prenume_studenti, varsta FROM Studenti WHERE varsta = 20;

SQL

Aceast instruciune regsete trei coloane din tabelul Studenti, dar, n loc s returneze toate rndurile, va afia numai rndurile care prezint valoarea 20 n coloana varsta. Cnd se utilizeaz att clauza ORDER BY ct i clauza WHERE, verificai ca ORDER BY s fie plasat dup WHERE, deoarece n caz contrar va fi generat o eroare. Operatorii clauzei WHERE SQL accept o ntreag gam de operatori condiionali, aa cum se poate observa din tabelul urmtor: Operator Descriere = Egalitate <> Diferit de != Diferit de < Mai mic <= Mai mic sau egal !< Nu mai mic > Mai mare >= Mai mare sau egal !> Nu mai mare BETWEEN ntre dou valori specificate IS NULL Este o valoare NULL

SQL

n situaia n care comparai o valoare cu o coloan care conine date de tip caracter, ghilimelele de delimitare sunt obligatorii. Ghilimelele nu se folosesc pentru delimitarea valorilor utilizate n coloanele numerice. SELECT id, nume_studenti, prenume_studenti, grupa FROM Studeni WHERE grupa <> 112A;

Pentru a verifica ncadrarea ntr-un interval de valori, putei folosi operatorul BETWEEN. Sintaxa sa este uor diferit de a altor operatori ai clauzei WHERE, deoarece necesit dou valori: nceputul i sfritul intervalului. SELECT id, nume_studenti, prenume_studenti, varsta FROM Studenti WHERE varsta BETWEEN 21 AND 23; Cele dou valori trebuie separate de cuvntul cheie AND, iar operatorul BETWEEN regsete toate valorile din interval, inclusiv valorile de nceput i cele de sfrit.

SQL

La crearea unui tabel, proiectantul tabelului poate specifica dac anumite coloane pot s nu conin nicio valoare. Cnd o coloan nu conine nicio valoare, se spune c include o valoare NULL (cu totul altfel dect un cmp care conine 0 sau spaiu). Instruciunea SELECT are o clauz WHERE special, care se poate utiliza pentru a detecta coloanele care conin valori NULL, i anume clauza IS NULL. Filtrarea avansat a datelor

Operatorul AND n vederea filtrrii n funcie de mai multe coloane, vei folosi operatorul AND pentru a ataa condiii la clauza dumneavoastr WHERE. SELECT nume_studenti, prenume_studenti FROM Studenti WHERE grupa = 111A AND varsta > 21; AND este un cuvnt cheie folosit n cadrul unei clauze WHERE pentru a specifica faptul c vor fi regsite numai acele rnduri care satisfac toate condiiile menionate.

10

SQL

Operatorul OR Operatorul OR indic sistemului de gestiune a bazelor de date s regseasc rndurile care satisfac una din condiii. SELECT nume_studenti, prenume_studenti, grupa, varsta FROM Studenti WHERE grupa = 111A OR varsta < 21;

Clauzele WHERE pot conine un numr orict de mare de operatori AND i OR. Prin combinarea celor doi operatori, avei posibilitatea de a
11

SQL

efectua operaii de filtrare sofisticate i complexe. Ori de cte ori scriei clauze WHERE care folosesc att operatorul AND ct i operatorul OR, utilizai parantezele pentru a grupa operatorii n mod explicit. Operatorul IN Operatorul IN este folosit la specificarea unui domeniu de condiii, din care poate fi satisfcut oricare. Operatorul IN este urmat de o list (ntre paranteze) a valorilor valide delimitate prin virgul. SELECT nume_studenti, prenume_studenti, varsta FROM Studenti WHERE varsta IN (20, 21, 22);

Operatorul NOT Operatorul NOT al clauzei WHERE are o singur funcie, i anume aceea de a nega orice condiie pe care o precede. Deoarece NOT nu este niciodat folosit singur (ntotdeauna cu un alt operator), sintaxa sa este uor diferit de a tuturor celorlali operatori. NOT se poate folosi i nainte de coloana n funcie de care se va efectua filtrarea, nu numai dup aceasta. SELECT nume_studenti, prenume_studenti, varsta FROM Studenti WHERE NOT varsta = 20;

12

SQL

Operatorul LIKE Toi operatorii pe care i-am studiat execut filtrarea folosind ca referin valori cunoscute. n cazul n care nu se tie valoarea exact, se pot folosi caractere de nlocuire. Pentru a folosi caractere de nlocuire n clauze de cutare, trebuie utilizat operatorul LIKE. Cutarea prin intermediul caracterelor de nlocuire se poate folosi numai n cazul cmpurilor de tip text. Caracterul de nlocuire procent (%). Caracterul de nlocuire cel mai utilizat l reprezint simbolul procent (%). n interiorul unui ir de cutare, % are semnificaia urmtoare: gsete orice caracter, indiferent de cte ori apare. SELECT nume_studenti, prenume_studenti, grupa FROM Studenti WHERE prenume_studenti LIKE S%;

13

SQL

La evaluarea acestei clauze, se gsesc toi studenii al cror prenume ncepe cu S. Dac utilizai Microsoft Access, va trebui s folosii * n loc de %. Caracterele de nlocuire pot fi utilizate oriunde n interiorul modelului de cutare, dup cum pot fi utilizate i mai multe asemenea caractere. Caracterul de nlocuire liniu de subliniere (_) Acest caracter se folosete ca i simbolul procentului, dar, n loc de a substitui mai multe caractere, poate nlocui un singur caracter. Dac utilizai Microsoft Access, va trebui s folosii ? n loc de _. SELECT nume_studenti, prenume_studenti, varsta, grupa FROM Studenti WHERE grupa LIKE 11_ _;

Crearea cmpurilor cu valoare calculat Datele stocate n interiorul tabelelor unei baze de date nu se gsesc ntotdeauna exact n formatul cerut de aplicaiile utilizatorilor: avei nevoie ca datele extrase din coloane separate ale tabelului s fie grupate ntr-un singur cmp; dorii ca datele s fie extrase cu majuscule; avei nevoie de total, de medii sau de alte calcule pe baza datelor din tabel.

14

SQL

Cmpurile cu valoare calculat nu exist efectiv n tabelele dintr-o baz de date, ele sunt create instantaneu n cadrul unei instruciuni SQL SELECT. Utilizarea alias-urilor Un alias este un nume alternativ al unui cmp sau al unei valori. Alias-urile se atribuie prin intermediul cuvntului cheie AS. SELECT nume_studenti, varsta AS VARSTA STUDENTULUI FROM Studenti;

Efectuarea calculelor matematice O alt utilizare frecvent a cmpurilor cu valoare calculat const din realizarea de operaii matematice cu datele regsite. SELECT nume_studenti, 2010-varsta AS AN NASTERE FROM Studenti;

15

SQL

SQL recunoate operatorii matematici elementari (+, -, *, /). De asemenea, se pot folosi paranteze pentru stabilirea ordinii de preceden. Utilizarea funciilor de manipulare a datelor Ca aproape orice alt limbaj de calculator, SQL permite utilizarea funciilor pentru manipularea datelor. Spre deosebire de instruciunile SQL (de exemplu SELECT), care, n majoritatea cazurilor, sunt acceptate de toate programele SGBD n mod similar, funciile prezint tendina de a fi specifice unui anumit SGBD (ex. preluarea datei curente NOW() n Access, CURRENT_DATE() n DB2, CURDATE() n MySQL, GETDATE() n SQL Server, SYSDATE n Oracle). Majoritatea implementrilor SQL recunosc urmtoarele tipuri de funcii: funciile pentru manipularea irurilor de text (eliminarea sau completarea cu valori, conversia n majuscule sau minuscule); funciile pentru efectuarea de operaii matematice cu date numerice (returnarea de valori absolute, calcule algebrice); funciile de tip dat i or; funciile sistem. Funcii frecvent utilizate la manipularea textelor: LENGTH() returneaz lungimea unui ir; LOWER() convertete irul n minuscule; UPPER() convertete irul n majuscule; RTRIM() elimin spaiile albe de la dreapta irului. SELECT CONCAT(UPPER(nume_studenti), , prenume_studenti) AS NUME FROM Studenti;

16

SQL

Funciile de manipulare numeric sunt folosite cu precdere pentru calcule algebrice, trigonometrice sau geometrice, cele mai utilizate fiind: ABS() returneaz valoarea absolut a unui numr; COS() returneaz valoarea cosinusului trigonometric al unui anumit unghi; EXP() returneaz valoarea funciei exponeniale aplicate unui anumit numr; PI() returneaz valoarea lui PI; SQRT() returneaz valoarea rdcinii ptrate a unui numr specificat; SELECT PI(), SQRT(625), SIN(PI()/2);

17

SQL

Sintetizarea datelor

Utilizarea funciilor agregat Funciile agregat sunt funcii care lucreaz cu un set de rnduri pentru a calcula i returna o singur valoare. Utiliznd aceste funcii, interogrile SQL sunt frecvent folosite la regsirea datelor pentru analiz i includerea n rapoarte. Printre exemplele din aceast categorie de operaii se numr: determinarea numrului de rnduri dintr-un tabel (sau a numrului de rnduri care satisfac o anumit condiie); obinerea sumei unui set de rnduri dintr-un tabel; determinarea valorii maxime, minime sau medii din coloana unui tabel. Funcia AVG() Funcia AVG() este utilizat pentru calculul mediei valorilor dintr-o anumit coloan. SELECT AVG(varsta) AS Varsta medie FROM Studenti;

Funcia AVG() ignor, dintr-o coloan, rndurile care conin valori NULL. Funcia COUNT() Folosind funcia COUNT() putei determina numrul de rnduri dintrun tabel sau numrul de rnduri care satisfac un anumit criteriu. Funcia COUNT() se poate folosi n dou moduri:

18

SQL

Formatul COUNT(*) se utilizeaz la numrarea rndurilor dintr-un tabel, indiferent dac avem valori NULL prin coloane; Formatul COUNT(coloana) se utilizeaz la numrarea rndurilor care conin valori dintr-o anumit coloan, ignornd valorile NULL.

SELECT COUNT(nume_studenti) AS Numarul_studentilor FROM Studenti;

Funciile MAX(), MIN() Funcia MAX(), MIN() returneaz cea mai mare, respectiv cea mai mic valoare dintr-o coloan specificat. SELECT MAX(varsta) AS Varsta_maxima FROM Studenti;

19

SQL

Funcia SUM() Funcia SUM() este utilizat la calculul sumei valorilor dintr-o anumit coloan. Funcia SUM() se poate folosi i la totalizarea valorilor calculate (SUM(pret_unitar*cantitate)). Cele cinci funcii agregat se pot folosi n dou moduri: pentru efectuarea de calcule cu toate rndurile, se specific argumentul ALL sau nu se specific niciun argument (deoarece ALL reprezint comportarea prestabilit); pentru a include numai valori distincte, specificai argumentul DISTINCT. SELECT AVG(DISTINCT varsta) AS Varsta medie FROM Studenti;

Aa cum se poate observa, n acest caz vrsta medie este mai mare folosind argumentul DISTINCT, deoarece exist mai muli studeni cu aceeai vrst mic. Prin excluderea acestora, vrsta medie crete. Gruparea datelor

Grupurile v permit s mprii datele n seturi logice, pentru a putea s efectuai calcule de sintez cu fiecare grup. Grupurile se creeaz cu ajutorul clauzei GROUP BY n cadrul instruciunii dumneavoastr SELECT. Clauza GROUP BY trebuie s fie plasat dup toate clauzele WHERE i anterior tuturor clauzelor ORDER BY.

20

SQL

SELECT grupa, SUM(restante) AS Restante_grupa FROM Studenti GROUP BY grupa;

n afar de posibilitatea de a grupa datele folosind GROUP BY, SQL mai permite i filtrarea grupurilor care vor fi incluse, respectiv a celor care vor fi excluse. n acest scop, SQL pune la dispoziie clauza HAVING. Aceasta este foarte asemntoare cu clauza WHERE. Singura diferen este aceea c, n timp ce WHERE filtreaz rnduri, HAVING filtreaz grupuri. SELECT grupa, SUM(restante) AS Restante_grupa FROM Studenti GROUP BY grupa HAVING SUM(restante) >= 5;

21

SQL

Ca regul practic, ori de cte ori folosii o clauz GROUP BY, trebuie de asemenea s specificai o clauz ORDER BY. Aceasta reprezint singura modalitate de a v asigura c datele vor fi sortate n mod corespunztor. Lucrul cu sub-interogrile SQL permite crearea sub-interogrilor, adic a interogrilor care sunt nglobate n alte interogri. SELECT nume_ang, prenume_ang, tel_ang FROM Angajati WHERE id_functie IN (SELECT id_functie FROM Posturi WHERE sal_min >= 4000);

Sub-interogrile sunt ntotdeauna prelucrate pornind de la instruciunea SELECT interioar nspre exterior. O alt modalitate de a utiliza sub-interogrile const n crearea cmpurilor cu valoare calculat. SELECT den_post, (SELECT COUNT(*) FROM Angajati WHERE Angajati.id_functie = Posturi.id_posturi) FROM Posturi;

22

SQL

Aceast sintax numele tabelului i numele coloanei, separate printrun punct trebuie utilizat ori de cte ori exist posibilitatea unei neclariti n ceea ce privete numele coloanelor (n special cnd exist coloane cu acelai nume n tabele diferite). Unirea tabelelor Una dintre cele mai puternice funcionaliti ale limbajului SQL o reprezint capacitatea de unire instantanee a tabelelor n cadrul interogrilor de regsire a datelor. Este important de reinut c o uniune nu reprezint o entitate fizic altfel spus, nu exist n tabelele reale din baza de date. O uniune este creat de programul SGBD conform necesitilor i persist pe durata execuiei interogrii. Pentru a crea o uniune, trebuie s specificai toate tabelele care urmeaz a fi incluse, precum i legtura dintre ele. SELECT nume_ang, prenume_ang, den_post, sal_min FROM Angajati, Posturi WHERE Angajati.id_functie = Posturi.id_posturi;

23

SQL

Cnd unii dou tabele, de fapt alctuii perechi formate din fiecare rnd al primului tabel i fiecare rnd al celui de-al doilea tabel (produs cartezian). Clauza WHERE acioneaz ca un filtru, pentru a se include numai acele rnduri care corespund condiiei de filtrare. SELECT nume_ang, prenume_ang, den_post, sal_min FROM Angajati, Posturi;

Uniunea pe care ai folosit-o pn acum se numete echi-uniune adic o uniune bazat pe verificarea egalitii valorilor cuprinse n dou tabele. Aceast categorie de uniune se mai numete i uniune interioar. Pentru aceste uniuni se mai poate folosi o sintax uor diferit, n care se specific n mod explicit tipul uniunii.

24

SQL

SELECT nume_ang, prenume_ang, den_post, sal_min FROM Angajati INNER JOIN Posturi ON Angajati.id_functie = Posturi.id_posturi;

n exemplul de mai sus, relaia dintre cele dou tabele face parte din clauza FROM, specificat sub forma INNER JOIN. Cnd folosii aceast sintax, condiia de unire este specificat folosindu-se clauza special ON, n locul clauzei WHERE. Majoritatea uniunilor stabilesc legturi ntre rndurile dintr-un tabel i rndurile dintr-un alt tabel. Dar, uneori, se dorete includerea rndurilor care nu sunt corelate cu alte rnduri. n aceste cazuri, se folosesc uniuni exterioare, care pot fi folosite pentru executarea, de exemplu, a urmtoarelor operaii: stabilirea numrului comenzilor emise de fiecare client, inclusiv de clienii care nu au emis nc nicio comand; enumerarea tuturor produselor, alturi de cantitile n care au fost comandate, inclusiv produsele pe care nu le-a comandat nimeni; calcularea cifrei medii de vnzri, lundu-i n calcul i pe clienii care nu au emis nc nicio comand. n fiecare dintre aceste exemple, uniunea include rnduri din tabel care nu dispun de rnduri asociate n tabelul conex. SELECT nume_ang, prenume_ang, den_post FROM Angajati RIGHT OUTER JOIN Posturi ON Angajati.id_functie = Posturi.id_posturi;
25

SQL

Asemntor uniunii interioare, instruciunea SELECT folosete cuvinte (dreapta) sau LEFT (stnga) pentru a specifica tabelul din care urmeaz a se include toate rndurile. Combinarea interogrilor SQL permite efectuarea mai multor interogri i returnarea rezultatelor sub forma unui singur set. Aceste interogri combinate poart numele de reuniuni sau interogri compuse. Interogrile SQL se combin folosind operatorul UNION. Operatorul UNION se plaseaz ntre instruciunile SELECT. SELECT nume_ang, prenume_ang, varsta_ang FROM Angajati WHERE varsta_ang > 40 UNION SELECT nume_ang, prenume_ang, varsta_ang FROM Angajati, Posturi WHERE Angajati.id_functie = Posturi.id_posturi AND spor_noapte > 15;

26

SQL

Inserarea datelor Instruciunea INSERT este utilizat pentru a insera (aduga) rnduri ntr-un tabel dintr-o baz de date. Aceast instruciune se poate folosi n mai multe moduri: pentru a insera un singur rnd complet; pentru a insera un singur rnd parial; pentru a insera rezultatele unei interogri. Cea mai simpl modalitate de a insera date ntr-un tabel const din utilizarea sintaxei elementare a instruciunii INSERT, care impune specificarea numelui tabelului i a valorilor care urmeaz a fi inserate n noul rnd. INSERT INTO Angajati VALUES (Cristea, Dan, Str. Uverturii, nr.22, NULL, 23, NULL); Datele care urmeaz a fi stocate n fiecare coloan a tabelului sunt specificate n clauza VALUES, iar pentru fiecare coloan trebuie specificat o valoare. Dac ntr-o coloan nu se gsete nicio valoare, se va folosi valoarea NULL. Coloanele trebuie populate n ordinea n care apar n definiia tabelului. Dei aceast sintax este ntr-adevr simpl, nu este deloc sigur i trebuie, n general, evitat. Instruciunea SQL anterioar este

27

SQL

dependent n cel mai nalt grad de ordinea n care coloanele sunt definite n tabel. Metoda mai sigur de a scrie instruciunea INSERT este urmtoarea: INSERT INTO Angajati (nume_ang, prenume_ang, adresa_ang, tel_ang, varsta_ang, id_functie) VALUES (Cristea, Dan, Str. Uverturii, nr.22, NULL, 23, NULL); Prima intrare din lista VALUES corespunde primului nume de coloan specificat, a doua intrare corespunde celui de-al doilea nume de coloan etc. Deoarece numele coloanelor sunt indicate, valorile din lista VALUES trebuie s corespund numelor de coloan specificate n ordinea n care sunt precizate acestea, dar nu neaprat n ordinea n care apar coloanele n tabelul propriu-zis. Avantajul acestui procedeu este c, n eventualitatea unei modificri a machetei tabelului, instruciunea INSERT va continua s funcioneze corect. Folosind aceast sintax, avei de asemenea posibilitatea de a omite coloane (dac definiia tabelului o permite). De obicei, instruciunea INSERT insereaz un singur rnd. Pentru a insera mai multe rnduri putei folosi instruciunea INSERT SELECT, cu ajutorul creia toate datele returnate de instruciunea SELECT vor fi inserate prin intermediul instruciunii INSERT. Actualizarea i tergerea datelor

Pentru a actualiza (modifica) datele dintr-un tabel se utilizeaz instruciunea UPDATE. Formatul fundamental al unei instruciuni UPDATE este alctuit din trei componente: tabelul care urmeaz a fi actualizat; numele coloanelor i noile valori ale acestora; condiia de filtrare care determin rndurile ce urmeaz a fi actualizate. UPDATE Angajati SET tel_ang = 07112233 WHERE id_angajati = 7;

28

SQL

Clauza SET atribuie coloanei valoarea specificat. Cnd se actualizeaz coloane multiple, se folosete o singur comand SET, iar fiecare pereche coloan=valoare este separat de urmtoarea printro virgul. Pentru a terge date dintr-un tabel se folosete instruciunea DELETE. DELETE FROM Angajati WHERE id_angajati = 8; Instruciunea DELETE nu preia nume de coloane i nici caractere de nlocuire. DELETE terge rnduri, nu coloane. Pentru a terge anumite coloane folosii instruciunea UPDATE (atribuind valori NULL). Dac omitei clauza WHERE, operaiile de actualizare, respectiv tergere vor fi aplicate tuturor rndurilor din tabel.

Crearea i manipularea tabelelor

Pentru a crea un tabel folosind instruciunea CREATE TABLE, trebuie s specificai urmtoarele informaii: numele noului tabel, indicat dup cuvintele cheie CREATE TABLE; numele i definiiile coloanelor din tabel, separate prin virgule.

CREATE TABLE Angajati ( id_angajati INT(11) NOT NULL AUTO_INCREMENT,

29

SQL

nume_ang VARCHAR(20), prenume_ang VARCHAR(20), adresa_ang VARCHAR(40), tel_ang VARCHAR(10), varsta_ang INT(2), id_functie INT(3) ); Fiecare coloan a unui tabel este de tip NULL sau NOT NULL, iar aceast stare este specificat n definiia tabelului, la creare. Nu confundai valorile NULL cu irurile vide. O valoare NULL reprezint lipsa unei valori i nu un ir vid. SQL permite specificarea unor valori prestabilite, care urmeaz a fi utilizate dac nu este specificat nicio valoare la inserarea unui rnd. Valorile prestabilite sunt precizate folosind cuvntul cheie DEFAULT n definiiile coloanelor incluse n instruciunea CREATE TABLE. Pentru a actualiza definiiile tabelelor, se folosete instruciunea ALTER TABLE. ALTER TABLE Angajati ADD email_ang VARCHAR(25); ALTER TABLE Angajati DROP COLUMN spor_noapte; tergerea tabelelor este o operaie foarte simpl i se realizeaz folosind instruciunea DROP TABLE. DROP TABLE AngajatiCopie; Aceast instruciune terge tabelul AngajatiCopie. Nu vei primi nicio confirmare i nici nu exist posibilitatea de anulare, executarea acestei instruciuni are ca efect eliminarea definitiv a tabelului. Gestiunea prelucrrii tranzaciilor

30

SQL

Prelucrarea tranzaciilor este utilizat pentru conservarea integritii bazelor de date, prin garantarea faptului c grupurile de operaii SQL se execut n totalitate sau deloc. Cnd lucrai cu tranzacii exist cteva cuvinte cheie care vor aprea n mod repetat: tranzacie un bloc de instruciuni SQL; revenire procesul de anulare a unor instruciuni SQL; angajare scrierea instruciunilor SQL nesalvate n tabele; punct de salvare un nlocuitor temporar ntr-un set de tranzacii pn la care se poate executa o revenire. Unele programe SGBD impun marcarea explicit a nceputului i a sfritului blocurilor de tranzacie. n SQL Server se procedeaz astfel: BEGIN TRANSACTION ... COMMIT TRANSACTION n acest exemplu, toate instruciunile SQL cuprinse ntre BEGIN i COMMIT trebuie executate fie n totalitate, fie deloc. Echivalentul n MySQL al acelorai comenzi este: START TRANSACTION ... Comanda SQL ROLLBACK este folosit pentru anularea instruciunilor SQL. n interiorul unui bloc de tranzacie, operaiile de tergere, inserare sau actualizare nu sunt irevocabile. Pentru a permite revenirea tranzaciilor pariale, trebuie s avei posibilitatea de a plasa nlocuitori n poziii strategice din blocul de tranzacie. Apoi, dac este necesar o revenire, putei reveni la unul dintre nlocuitori. n SQL aceti nlocuitori se numesc puncte de salvare. Pentru a crea un asemenea punct de salvare se folosete instruciunea SAVEPOINT.

Caracteristici avansate ale limbajului SQL

31

SQL

Bazele de date relaionale stocheaz date divizate n tabele multiple, fiecare din tabelele respective coninnd date corelate. Pentru crearea referinelor de la un tabel la altul se folosesc chei. Chei primare O cheie primar este o constrngere special, folosit pentru a garanta c valorile dintr-o coloan (sau set de coloane) sunt unice i nu se modific niciodat. n absena cheilor primare, este dificil s se actualizeze, respectiv s se tearg anumite rnduri fr a le afecta pe altele. CREATE TABLE Angajati ( id_angajati INT(11) NOT NULL PRIMARY KEY, ....); Sau ALTER TABLE Angajati ADD CONSTRAINT PRIMARY KEY (id_angajati); Chei externe O cheie extern reprezint o coloan dintr-un tabel ale crei valori trebuie s fie enumerate n cadrul unei coloane cheie primar dintr-un alt tabel. CREATE TABLE Angajati ( ... id_functie INT(4) NOT NULL REFERENCES Posturi(id_posturi) ); Sau ALTER TABLE Angajati ADD CONSTRAINT FOREIGN KEY (id_funcie) REFERENCES Posturi(id_posturi);

Securitatea bazelor de date


32

SQL

Nimic nu este mai valoros pentru o organizaie dect datele acesteia, motiv pentru care datele trebuie ntotdeauna protejate. Evident, n acelai timp datele trebuie s fie accesibile utilizatorilor, iar majoritatea programelor de tip SGBD furnizeaz administratorilor mecanisme de acordare, respectiv de limitare a accesului la date. Fundamentul oricrui sistem de securitate l reprezint autorizarea i autentificarea utilizatorilor. Acesta este procesul prin care un utilizator este confirmat, pentru a exista certitudinea c are identitatea pe care i-o asum i c are permisiunea de a executa operaia pe care o dorete s o execute. Unele programe se integreaz, n acest scop, cu securitatea sistemului de operare, iar altele folosesc propriile lor liste cu utilizatori i parole. Securitatea este gestionat prin intermediul instruciunilor SQL GRANT sau REVOKE.

33