83 Curs11 Bd

21
22/08/22 1 Limbajul SQL - Limbajul de Manipulare a Datelor (LMD)

description

bd

Transcript of 83 Curs11 Bd

  • Limbajul SQL - Limbajul de Manipulare a Datelor (LMD)

  • INSTRUCIUNI SQL de manipulare a datelor Instruciunile SQL de manipulare a datelor conin una din comenzile: SELECT, INSERT, UPDATE sau DELETE.Instruciunea INSERT se folosete pentru introducerea datelor n tabele i are urmtoarea sintax: INSERT INTO nume_tabel(col1,col2,...coln)VALUES(val1,val2,...valn); ntre valori i numele de coloane trebuie s existe o coresponden unu la unu. Valorile din list pot fi constante (literale) sau expresii. De exemplu, introducerea unei linii n tabelul SECTII se poate face cu instruciunea: INSERT INTO SECTII (IdSectie,Nume,Buget) VALUES (1,Productie,4000000);

  • Lista de coloane poate s lipseasc dac se introduc valori n toate coloanele tabelului, dar n aceast situatie ordinea valorilor introduse trebuie s respecte ordinea atributelor. Aceasta ordine provine din ordinea de definire a atributelor prin instruciunea CREATE TABLE, precum i din operaiile ulterioare de alterare (modificare) a tabelului respectiv. De exemplu, introducerea unei linii n tabelul ANGAJATI(IdAngajat,Nume,Prenume,DataNasterii,Adresa,Salariu), se poate face cu instruciunea: INSERT INTO ANGAJATI VALUES(100,Mihailescu, Mihai,1950-04-05,Craiova,3000);

  • Instruciunea UPDATE permite actualizarea valorilor coloanelor (atributelor) din una sau mai multe linii ale unui tabel. Aceasta are sintaxa: UPDATE nume_tabela SET nume_atribut_1 = valoare_1[, ... [, nume_atribut_n = valoare_n]] [WHERE conditie];Clauza WHERE impune ca actualizarea valorilor coloanelor s se efectueze numai asupra acelor linii care ndeplinesc condiia dat. Dac este omis clauza WHERE, vor fi modificate valorile coloanelor din toate liniile tabelului.De exemplu, pentru a modifica linia introdus mai sus n tabelul ANGAJATI, se poate introduce instruciunea: UPDATE ANGAJATI SET Adresa = Bucuresti,Str. Victoriei WHERE IdAngajat = 100;

  • Instruciunea DELETE permite tergerea uneia sau mai multor linii dintr-un tabel i are forma: DELETE FROM nume_tabel [WHERE conditie]; Din tabel se terg acele linii care ndeplinesc condiia dat n clauza WHERE. Dac este omis clauza WHERE, vor fi sterse toate liniile din tabel. De exemplu, pentru a sterge din tabelul ANGAJATI toi angajatii care au numele Ionescu, se introduce instruciunea: DELETE FROM ANGAJATI WHERE Nume =Ionescu;

  • INSTRUCIUNEA SELECT Instruciunea SELECT este instruciunea de interogare n limbajul SQL, prin care se regsesc informaiile dorite din unul sau mai multe tabele ale bazei de date. Instruciunea SELECT are urmtoarea sintax general: SELECT [DISTINCT] lista_coloane [FROM lista_tabele] [WHERE conditie] [clauze_secundare]; Ca rezultat al instruciunii SELECT se obine un tabel care conine atributele (coloanele) din lista_coloane ale acelor linii (tupluri) ale produsului cartezian al tabelelor din lista_tabele pentru care expresia logic conditie este adevrat (are valoarea TRUE).

  • Instruciunea de interogare SELECT are trei cuvinte-cheie importante: SELECT, FROM i WHERE. Cuvntul-cheie SELECT definete coloanele tabelului rezultat. Clauza FROM indic unul sau mai multe tabele (o list de tabele) din care se selecteaz liniile tabelului rezultat. Clauza WHERE definete condiia pe care trebuie s o ndeplineasc fiecare linie a tabelului rezultat. n afara acestor clauze, comanda SELECT mai poate conine i clauze secundare (ORDER BY, GROUP BY, HAVING), care permit ordonri sau grupri ale tuplurilor (liniilor) rezultate, etc. Cuvntul-cheie SELECT introduce lista coloanelor unor tabele sau expresii care vor fi selectate i afiate. Coloanele din list trebuie s aparin unuia din tabelele specificate n clauza FROM. De exemplu, comanda urmtoare va selecta numele i prenumele tuturor angajailor din tabelul ANGAJATI: SELECT Nume,Prenume FROM ANGAJATI; Ca rezultat al instruciunii de mai sus se pot obtine dou sau mai multe linii identice, dac exista angajai cu acelai nume i prenume, deci rezultatul operaiei nu este o relaie n sensul definiiei din modelul relaional.

  • Pentru eliminarea liniilor duplicat se introduce parametrul DISTINCT i atunci se elimin liniile duplicat iar rezultatul este o relaie n sensul definiiei din modelul relaional. Deci instruciunea de mai sus se poate scrie: SELECT DISTINCT Nume,Prenume FROM ANGAJATI; Dac lista de atribute este un asterisc (*), atunci se selecteaz toate atributele produsului cartezian al tabelelor indicate prin clauza FROM, care ndeplinesc condiia din clauza WHERE. De exemplu, instruciunea: SELECT * FROM ANGAJATI; permite selectarea tuturor coloanele i a liniilor din tabelul ANGAJATI. n clauza SELECT se pot introduce i funcii de totalizare (funcii agregat). Funciile agregat definite n limbajul SQL2 sunt date n tabelul urmtor.

  • De exemplu, comenzile urmtoare vor afia numrul de linii ale tabelului ANGAJATI i salariul maxim, minim i mediu al angajailor: SELECT COUNT(*) FROM ANGAJATI; SELECT MAX(Salariu) FROM ANGAJATI; SELECT MIN(Salariu) FROM ANGAJATI; SELECT AVG(Salariu) FROM ANGAJATI; Instruciunea SELECT poate s conin chiar i numai clauza SELECT, deci, fr s se refere la un tabel (printr-o clauz FROM). n acest caz, comanda SELECT conine o list de expresii pe care le evalueaz i rezultatele calculate sunt returnate ca o linie a unui tabel ale crui coloane sunt chiar expresiile date. n clauza SELECT se pot redenumi atributele (coloane ale tabelelor) sau se pot specifica nume pentru expresii, folosind urmtoarea sintax: SELECT nume1 [AS] noul_nume1 [,...n] FROM lista_tabele [alte_clauze];

  • De exemplu, comanda urmtoare va afisa numele angajatului denumit NumeAngajat i 80% din salariul acestuia, denumit SalariuNet: SELECT Nume AS NumeAngajat,Salariu*0.8 AS SalariuNet FROM ANGAJATI;Clauza FROM este obligatorie dac n comanda SELECT sau ntr-una din clauzele WHERE sau HAVING apar nume de coloane ale unor tabele. n acest caz, lista de tabele care nsoete clauza FROM trebuie s conin numele tuturor tabelelor (separate prin virgul) ale cror coloane se folosesc. Dac lista conine mai mult de un tabel, atunci numele coloanelor din comanda SELECT trebuie s fie diferite i, dac nu sunt diferite, se calific cu numele tabelului caruia i aparine, precednd numele atributului cu numele tabelului urmat de operatorul punct (.). De exemplu: SELECT ANGAJATI.Nume,SECTII.Nume FROM ANGAJATI,SECTII; De retinut c, dei limbajul SQL este case-insensitive, totui este necesar ca numele tabelului cu care se calific numele unui atribut s fie identic (inclusiv tipul de caracter, majuscul sau nu) cu cel declarat n clauza FROM.

  • Clauza WHERE restrictioneaz tuplurile returnate ca rezultat la acele tupluri care ndeplinesc condiia introdus de aceast clauz sub forma unei expresii logice. O expresie logic se construieste din valori logice, operatori logici (AND, OR, NOT) i paranteze. O valoare logic se obtine, n mod obinuit, ca rezultat al comparaiei ntre doi operanzi folosind un operator de comparaie. Un operand poate fi un atribut (nume de coloan dintr-unul din tabelele introduse prin clauza FROM), o constant, valoarea unei expresii aritmetice sau o valoare returnat de o funcie. Operatorii de comparaie utilizai n clauza WHERE pot fi att operatori aritmetici de comparaie ct i operatori SQL de comparaie, aa cum se poate vedea n instruciunile urmtoare: SELECT Nume,Prenume FROM ANGAJATI WHERE DataNasterii > 1968-01-01; SELECT Nume,Prenume FROM ANGAJATI WHERE Salariu BETWEEN 3000 AND 4000 AND Functie = Inginer;

  • Clauza ORDER BY introduce numele atributului dup care se face ordonarea liniilor tabelului rezultat. Ordonarea se face n ordine cresctoare n mod implicit sau dac numele atributului este urmat de cuvntul cheie ASC; dac numele atributului este urmat de cuvntul DESC, ordonarea liniilor se face n ordine descresctoare a valorilor acelui atribut. Ordonarea liniilor astfel obinut este ordonare logic, foarte util n prezentarea (afiarea) rezultatului i nu nseamn ordonarea nregistrrilor n fiierele relaiilor. De exemplu, pentru afiarea listei angajatilor ordonat dup numele acestora, se introduce comanda: SELECT * FROM ANGAJATI ORDER BY Nume; Clauza GROUP BY se folosete pentru gruparea rezultatelor funciilor agregat (totalizatoare) n funcie de valoarea uneia sau mai multor coloane. Pentru aceasta, n instruciunea SELECT se introduce clauza GROUP BY, urmat de numele coloanei (sau al coloanelor) dup valoarea crora se dorete gruparea rezultatelor funciei agregat. n acest caz, funcia agregat se aplic separat acelor linii care au aceeai valoare a atributelor specificate de clauza GROUP BY.

  • De exemplu, salariul mediu calculat separat pe grupuri de angajati, fiecare grup fiind compus din liniile care au aceeai valoare a atributului Functie, se obine cu urmtoarea instruciune SQL: SELECT AVG (Salariu) FROM ANGAJATI GROUP BY Functie; Clauza HAVING. Funciile agregat (totalizatoare) nu pot fi utilizate n clauza WHERE; de exemplu instruciunea urmtoare (prin care se cere lista angajailor cu salariu mai mare dect salariul mediu) este eronat: SELECT Nume,Prenume FROM ANGAJATI WHERE Salariu >= AVG(Salariu);

  • Pentru folosirea unei funcii agregat ntr-o condiie de selecie se folosete clauza HAVING. Clauza HAVING este asemntoare clauzei WHERE, adic introduce o condiie pe care trebuie s o ndeplineasca tuplurile rezultat, i, n plus, permite utilizarea funciilor agregat n expresia conditional. Exemplul de mai sus se scrie corect astfel: SELECT Nume,Prenume FROM ANGAJATI HAVING Salariu >= AVG (Salariu); Instruciuni SELECT imbricate. Subinterogri. Instruciunile SELECT se pot imbrica pe mai multe niveluri, o instruciune avnd ca intrare (argument) rezultatul unei altei instruciuni, numit subinterogare. Exist mai multe moduri de construire a subinterogrilor.

  • De exemplu, una din formele cele mai frecvent folosite este urmtoarea: SELECT lista_atribute FROM tabel1WHERE colx IN (SELECT colx FROM tabel2 WHERE conditie); ntr-o astfel de construcie valoarea de comparaie (pentru operatorul de comparaie IN) din clauza WHERE a primei instruciuni SELECT se definete printr-o subinterogare care const dintr-o alt instruciune SELECT. Alte forme de construire a subinterogrilor vor fi prezentate n leciile viitoare.

  • Indexarea relaiilor Unul din avantajele sistemelor de gestiune este acela de a elibera proiectantul bazei de date de necesitatea de a cunoate detaliile de organizare a datelor, prin asigurarea independenei datelor. Totui, aceast independen nu este complet i, deci, programatorii de aplicaii trebuie s ia n consideraie influena pe care modul de stocare i de regsire a datelor l are asupra performanelor aplicaiilor. ntr-o relaie, privit ca o colecie de elemente n care nu sunt admise elemente duplicat (deoarece este o mulime), operaiile de baz sunt cutarea, inserarea i tergerea unui element, crora, desigur, le corespund operaiile (interogare, inserare, tergere) din limbajele de manevrare a datelor n relaii. Relaiile unei baze de date sunt memorate n fiiere pe disc, iar comenzile de manevrare a datelor sunt transformate de SGBD n operaii asupra fiierelor care stocheaz relaiile bazei de date. Modul i timpul de execuie a acestor operaii de baz depind de modul de reprezentare a mulimii de elemente (tupluri) ale relaiei.

  • n cazul unei mulimi reprezentate printr-o colecie neordonat de elemente, timpul de cutare a unui element crete proporional cu numrul de elemente ale mulimii, deoarece, n cazul cel mai defavorabil, este necesar s fie parcurse toate elementele coleciei pentru a gsi elementul dorit. n general, operaiile de cutare, inserare i tergere a elementelor ntr-o mulime se execut mai rapid dac elementele mulimii sunt reprezentate printr-o colecie ordonat. Astfel, dei o relaie nu presupune ordonarea tuplurilor sale, pentru accelerarea operaiilor de cutare, inserare i tergere, se folosesc colecii ordonate, ca de exemplu arbori binari ordonai sau tabele de dispersie (hash table). Un index al unei relaii (index) este o structur auxiliar memorat n baza de date care permite accesul rapid la nregistrrile (tuplurile) relaiilor prin ordonarea acestora. La definirea unei relaii se stabilesc dou categorii de indexuri: indexul primar al relaiei, care determin localizarea tuplurilor n fiierele bazei de date, i zero, unul sau mai multe indexuri secundare, care nu modific localizarea tuplurilor, dar sunt folosii pentru regsirea tuplurilor dup un criteriu dat.

  • Indexul primar Indexul primar (primary index) se definete pe unul sau mai multe atribute ale relaiei i reprezint cheia (eticheta) dup care ordoneaz tuplurile relaiei. Fiecare SGBD prevede o anumit modalitate de reprezentare a indexului primar. n general, sistemele SGBD definesc n mod implicit indexul primar pe cheia primar a relaiei. Operaiile de cutare sau tergere n care se specific valoarea atributului index primar se execut de asemenea eficient.De exemplu, pentru rezolvarea interogrii "Care este oraul de domiciliu al studentului cu identificatorul 200?" se gsete tuplul (200,Marin,Dan,Craiova) folosind valoarea indexului primar (200).

  • Dac ntr-o operaie de cutare sau tergere nu se specific valoarea atributului index primar, atunci cutarea unui anumit tuplu se desfoar greoi i cu durat de timp mare. De exemplu, interogarea "Care este oraul de domiciliu al studentului cu numele Marin?" gsete tuplul (200,Marin,Dan,Craiova) parcurgnd toate tuplurile i comparnd valoarea atributului Nume cu constanta Marin, pn este gsit tuplul care ndeplinete aceast condiie. Astfel de situaii sunt frecvent ntlnite n aplicaii, dat fiind c interogrile se formuleaz de obicei folosind un nume, nu un identificator (care este probabil cheie primar, deci conine indexul primar, dar este necunoscut utilizatorilor). Pentru rezolvarea mai eficient a unor astfel de interogri se pot defini indexuri secundare pe acele atribute care intervin frecvent n interogri.

  • Indexuri secundare Un index secundar pe un atribut A al unei relaii (secondary index) este o structur care conine o mulime de perechi (v,L) ordonate dup v; fiecare pereche corespunde unui tuplu al relaiei, v este valoarea atributului A, iar L este adresa tuplului respectiv n structura indexului primar al relaiei. Un index secundar nu modific adresa de memorare a unui tuplu (care este coninut n structura indexului primar), dar conine informaii suplimentare care permit identificarea rapid a unui tuplu dup valoarea atributului indexului. Fiecare index secundar ocup spaiu de memorare suplimentar i trebuie s fie actualizat la fiecare operaie de inserare i tergere a unui tuplu, ceea ce nseamn timp de execuie suplimentar. n general, se recomand utilizarea unui numr ct mai mic de indexuri secundare, definii pe atributele care intervin cel mai frecvent n condiiile de interogare. Aceast decizie o ia proiectantul bazei de date prin analiza cerinelor din domeniul pentru care se dezvolt baza de date i aplicaiile corespunztoare.

  • Dat fiind c indexurile sunt folosite n special pentru mbuntirea performanelor bazelor de date i nu fac parte din modelul relaional de baz, ei nu sunt cuprini n standardul limbajului SQL. ns majoritatea sistemelor SGBD ncorporeaz indexuri, coninnd instruciuni pentru crearea indexurilor de forma: CREATE [optiuni] INDEX nume_index ON tabel (lista_atribute);Una din opiunile care se pot introduce n instruciunea CREATE INDEX este opiunea UNIQUE, care specific faptul c nu pot exista dou tupluri cu aceeai combinaie de valori ale atributelor indexului, deci acele atribute reprezint o cheie unic a relaiei.