L Li im mb ba aj ju ul l S SQ QL L( ( S St tr ru uc ct tu ur re ed d Q Qu ue er ry y L La an ng gu ua ag ge e ) ) C Ca ar ra ac ct te er ri is st ti ic ci i g ge en ne er ra al le e Limbajul SQL este un limbaj declarativ; utilizatorul descrie informaiile pe care vrea s le obin n urma interogrii, fr a preciza algoritmii necesari pentru obinerea rezultatelor dorite. n 1986 SQL a devenit standard ANSI (SQL-86). n ultimii ani, comitetele ANSI i ISO pentru standardizarea limbajului SQL au adugat noi faciliti pentru gestiunea bazelor de date orientate pe obiecte i obiect-relaional. S-a ajuns astfel la o versiune SQL3, pe cale de a deveni un standard n domeniu. Aceste faciliti se pot structura: faciliti orientate obiect ce propun definirea la nivel de utilizator a tipurilor de date abstracte; structuri de control specifice: IF, FOR, WHILE ce permit transformarea SQL-ului ntr-un limbaj de sine stttor; faciliti de comunicare n reea; faciliti de prelucrare distribuit; faciliti multi-media, nglobate n modulul Multi - Media SQL.
Tipuri de instruciuni n funcie de rolul lor n manipularea datelor i tranzaciilor, instruciunile SQL, pot fi grupate astfel: a) instruciuni de definire a datelor care permit descrierea structurii bazei de date; b) instruciuni de manipulare a datelor n sensul adugrii, modificrii i tergerii nregistrrilor; c) instruciuni de selecie a datelor care permit consultarea bazei de date; d) instruciuni de procesare a tranzaciilor care privesc unitile logice de prelucrare i constituie n fapt, operaii multiple de manipulare a datelor; e) instruciuni de control al cursorului; f) instruciuni privind controlul accesului la date.
Instruciuni pentru selectarea datelor- formatul frazei SELECT S SE EL LE EC CT T [ [A AL LL L/ /D DI IS ST TI IN NC CT T/ /D DI IS ST TI IN NC CT TR RO OW W] ] l li is st t a at tr ri ib bu ut te e F FR RO OM M l li is st t - -t ta ab be el le e [ [W WH HE ER RE E c cr ri it te er ri iu u- -d de e- -c c u ut ta ar re e] ] [ [G GR RO OU UP P B BY Y c cr ri it te er ri iu u- -d de e- -g gr ru up pa ar re e] ] [ [H HA AV VI IN NG G c cr ri it te er ri iu u- -d de e- -g gr ru up pa ar re e] ] [ [O OR RD DE ER R B BY Y c cr ri it te er ri iu u- -d de e- -o or rd do on na ar re e [ [A AS SC C| |D DE ES SC C] ]] ]; ; Unde: lista-atribute specific atributele ale cror valori vor fi returnate; FROM list-tabele specific tabelele din care se vor extrage datele; WHERE permite prin precizarea unei expresii exprimarea criteriului de selecie; ORDER BY precizeaz atributul dup care se va face ordonarea; GROUP BY folosit pentru a partiiona o tabel n grupuri acordnd acestora valori pe un atribut sau list de atribute; HAVING specific criterii de selecie pe grupuri de tupluri. Toate rindurile tabelei Produse: SELECTDISTINCTROW* FROMPRODUSE; Mumele i preul produselor avnd preul mai mare de 10000: SELECTDISTINCTROW[DEN PROD], PRE FROMPRODUSE WHEREPRE>10000;
BD Cursul 10&11&12 NP 2 / 9 n cazul n care dorii s cunoatei denumirea produselor cu preuri ntre 19000 i 110000 lei putei fie s introducei o expresie compus n clauza WHERE, fie s utilizai operatorul between: SELECT[DEN PROD] FROMPRODUSE WHEREPRE >=19000 AND PRE=<110000; sau: SELECT[DEN PROD] FROM PRODUSE WHEREPRE BETWEEN 19000 AND 110000; n cazul n care dorii s cunoatei produsele ale cror preuri sunt fie 110000, fie 150000, n clauza WHERE se va folosi operatorul IN: SELECT[DEN PROD] FROMPRODUSE WHEREPRE IN (110000,150000); Poate fi util solicitarea ordonrii rindurilor dup calitate i pre, pornind de la preul cel mai mare din grupa de calitate respectiv: SELECTDISTINCTROW* FROMPRODUSE ORDERBYCALITATE, PRE DESC; n cazul n care se dorete aflarea preului maxim, minim i mediu al produselor, blocul de cereri va utiliza funciile corespunztoare: SELECTDISTINCTROWMAX(PRE) AS [PRE MAX], MIN(PRE) AS [PRE MIN], AVG(PRE) AS [PRE MEDIU] FROMPRODUSE; Prin clauza AS, n exemplul de mai sus, am putut modifica eticheta coloanelor ce returneaz valoarea funciilor specificate. Dac dorii s stabilii preul maxim al produselor grupndu-le pe caliti utilizai n blocul de cerere clauza GROUP BY: SELECTDISTINCTROWMAX(PRE) AS [PRE MAXIM], CALITATE FROMPRODUSE GROUPBYCALITATE;
De cele mai multe ori, ns, este necesar s extragem date stocate n mai multe tabele. S presupunem c dorim s cunoatem n ce cantiti am livrat produse clienilor i care este valoarea facturat a fiecrui produs: SELECTDISTINCTROWPRODFACT.[NR FACT], PRODUSE.[DEN PROD], PRODFACT.[CANT FACT], PRODUSE.PRE, PRODUSE.PRE*PRODFACT.[CANT FACT] AS VALOARE FROMPRODUSE, PRODFACT WHEREPRODUSE.[COD PRODUS]=PRODFACT.[COD PRODUS]; Observai n acest bloc de cerere utilizarea calificrii atributelor (precedarea numelui lor de numele tabelei creia i aparin) i precizarea n clauza FROM a numelor celor dou tabele surs. Criteriul de compunere al celor dou tabele este precizat n clauza WHERE.
Interogri cu subinterogri Realizarea unor cutri mai complexe n baza de date presupune construirea unor subcereri n cadrul cererii iniiale. S presupunem c dorim s cunoatem care sunt produsele cu preul mai mare dect al merelor: SELECTDISTINCTROW[DEN PROD], PRE FROMPRODUSE WHEREPRE > (SELECTPRE FROMPRODUSE WHERE[DEN PROD]=MERE); Utilizarea predicatelor ALL, ANY, EXIST Domeniul de obinere a rezultatelor unei subinterogri poate fi influenat prin precizarea unuia din cuvintele cheie: ALL, ANY i respectiv EXIST. ALL Se preiau rezultatele subinterogrii i, dac acestea ndeplinesc condiia cerut, se returneaz valoarea logic True. Exemplu : Dac dorim s cunoatem numele produselor de calitatea nti cu preul mai mic dect al tuturor produselor de calitatea a 2-a cererea va avea urmtoarea form: SELECT[DEN PROD] FROMPRODUSE
BD Cursul 10&11&12 NP 3 / 9 WHERECALITATEA=1AND PRE< ALL(SELECTPRE FROMPRODUSE WHERECALITATEA=2); ANY Are n vedere compararea valorii de ieire a subinterogrii cu fiecare nregistrare din interogarea extern. Dac pentru fiecare nregistrare din interogare exist un rezultat al subinterogrii, se va returna valoarea logic True. Spre deosebire de clauza IN poate fi folosit cu diveri operatori relaionali. Cuvntul cheie SOME are acelai rol i caracteristici ca ANY. Exemplu: S se returneze lista crilor din bibliotec care aparin unuia din domeniile abordate de editura ABC n anul 2000: SELECTTITLUL_CARTII, DOMENIUL, ANUL_APARITIEI, PRET FROMCRI WHEREDOMENIUL= ANY (SELECTDOMENIUL FROMCRI WHEREEDITURA=ABC AND [ANUL APARIIEI]=2000); nlocuirea lui ANY cu SOME produce un rezultat identic: SELECTTITLUL_CARTII, DOMENIUL, ANUL_APARITIEI, PRE FROMCARTI WHEREDOMENIUL= SOME(SELECTDOMENIUL FROMCARTI WHEREDOMENIUL ="INFORMATICA"); EXISTS Folosete subinterogarea ca pe o condiie, analiznd setul de rezultate al acesteia i returnnd valoarea False dac nu exist nici o ieire. Se poate astfel verifica existena anumitor nregistrri i controla ansamblul rspunsurilor date de interogare. Exemplu: S se verifice dac n cadrul bibliotecii exist i cri aprute nainte de anul 2001: SELECTTITLUL_CRII, ANUL_APARIIEI FROMCRI WHEREEXISTS(SELECT* FROMCRI WHEREANUL_APARIIEI < 2001); Fiecare dintre cuvintele cheie ANY, ALL i EXISTS poate s fie utilizat pentru restricionarea interogrilor i n forma cu negaie adic prin folosirea operatorului logic NOT. Interogri folosind operatorul UNION Cnd utilizatorul dorete s vad rezultatele mai multor interogri SELECT n acelai timp, prin combinarea ieirilor lor, poate utiliza UNION: S SE EL LE EC CT T l li is st ta a_ _c ca am mp pu ur ri i F FR RO OM M t ta ab be el la a1 1 U UN NI IO ON N S SE EL LE EC CT T l li is st t _ _c ca am mp pu ur ri i F FR RO OM M t ta ab be el la a2 2 [ [G GR RO OU UP P B BY Y c ca am mp p_ _d de e_ _g gr ru up pa ar re e] ] [ [H HA AV VI IN NG G c cr ri it te er ri iu ul l_ _d de e_ _a ag gr re eg ga ar re e] ] [ [U UN NI IO ON N S SE EL LE EC CT T l li is st t _ _c ca am mp pu ur ri i F FR RO OM M t ta ab be el la a3 3 [ [G GR RO OU UP P B BY Y c ca am mp p_ _d de e_ _g gr ru up pa ar re e ] ] [ [H HA AV VI IN NG G c cr ri it te er ri iu ul l_ _d de e_ _g gr ru up pa ar re e] ]] ] [ [U UN NI IO ON N. .. .. .] ] [ [O OR RD DE ER R B BY Y c ca am mp p_ _c cr ri it te er ri iu u_ _d de e_ _s so or rt ta ar re e] ]; ; Exist mai multe restricii pentru instruciunile care genereaz interogri UNION i anume: numrul de cmpuri din lista de cmpuri asociat fiecrei instruciuni SELECT i UNION SELECT trebuie s fie acelai; este permis doar o dat utilizarea clauzei ORDER BY, dup ultima instruciune UNION SELECT; secvena de nume din fiecare list de cmpuri trebuie s corespund unor intrri identice. Cnd se folosete UNION, automat se vor elimina duplicatele ce apar n urma combinrii. In cazul folosirii domeniului ALL se vor lua n considerare i valorile duplicate. Exemple: a) Care a fost media salariilor colaboratorilor studeni i ingineri ? SELECTCATEGORIE, AVG(SALARIU) AS MEDIE FROMCOLABORATORI GROUPBYCATEGORIE HAVINGCATEGORIE = "STUDENT" UNIONSELECTCATEGORIE, AVG(SALARIU) AS MEDIE FROMCOLABORATORI GROUPBY CATEGORIE HAVINGCATEGORIE = "ING";
BD Cursul 10&11&12 NP 4 / 9 b) Fie tabelele Clieni (cod, nume, localitate) i Furnizori (cod, nume, localitate). Prin utilizarea operatorului UNION putem obine lista comun a clienilor i furnizorilor: SELECT* FROMCLIENI UNION SELECT* FROMFURNIZORI ORDERBYNUME;
Instruciuni pentru actualizarea bazei de date Pentru inserarea unui tuplu ntr-o tabel se utilizeaz comanda INSERT: I IN NS SE ER RT T I IN NT TO O n nu um me e- -t ta ab be el la a [ [( (n nu um me e- -a at tr ri ib bu ut t, , ) )] ] { {V VA AL LU UE ES S( (v va al lo oa ar re e, , ) )| |c ce er re er re e} } Lista de atribute se specific n cazul n care realizrile din clauza VALUES nu corespund ordinii tuplurilor din tabel. Dac tuplul/tuplurile inserate sunt preluate dintr-o alt tabel se va specifica comanda Select. Exemple: Se introduce un nou tuplu n tabela Produse (avnd n structura sa atributele: cod produs, denumire, unit. msur, pre, calitate) : INSERTINTOPRODUSE VALUES(345,PERE,KG,12000,1); sau: Se introduc tupluri n tabela Produse sursa de date constituind-o tabela Nouti (care prezint aceeai structur cu tabela Produse): INSERTINTOPRODUSE SELECT* FROMNOUTTI; Actualizarea datelor dintr-o tabel se realizeaz prin comanda UPDATE care prezint urmtoarea sintax: UPDATEnume-tabela SET{nume-atribut=expresie,| (nume-atribut=subcerere),} [WHEREcondiie]; Noua realizare a atributului actualizat se precizeaz prin expresie sau este returnat de subcererea precizat. Clauza WHERE permite selectarea tuplurilor afectate de actualizare. Exemplu: Se majoreaz cu 1000 preul produselor de categoria a doua : UPDATEPRODUSE SETPRE=PRE+500 WHERECALITATE=2; G Ge es st ti iu un ne ea a v vi ie ew w- -u ur ri il lo or r Un view este o tabel virtual, care nu conine date, dar i confer utilizatorului posibilitatea de vizualizare a datelor din baza de date dintr-o anumit perspectiv. Pentru definirea unui view se folosete o cerere SQL. View-urile pot fi folosite n urmtoarele scopuri: limiteaz accesul unor categorii de utilizatori la anumite date, mai mult sau mai puin confideniale; permite simplificarea viziunii utilizatorilor asupra bazei de date; asigur securitatea i confidenialitatea datelor. Fiecrui utilizator al bazei de date i sunt asignate anumite drepturi (GRANT/REVOKE) ceea ce determin o limitare a accesului la baza de date, la obiectele bazei de date i la efectuarea unor operaii asupra obiectelor bazei de date. Asupra unui view se pot efectua ulterior aceleai operaii ca i asupra unei tabele, dar cu deosebirea c view- ul nu conine date, ci este o reflectare dinamic a unei tabele. Astfel, o modificare a datelor dintr-o tabel este automat reflectat n view-urile definite pe acea tabel. Un view se recreeaz de fiecare dat cnd este apelat, pe baza definiiei sale stocate n dicionarul bazei de date. Operaiile aplicate asupra view-urilor sunt: crearea unui view cu comanda CREATE VIEW; interogarea view-urilor - prin folosirea unei fraze SELECT; actualizarea datelor dintr-un view folosind comanda UPDATE; adugarea de noi date folosind comanda INSERT;
BD Cursul 10&11&12 NP 5 / 9 tergerea datelor dintr-un view cu comanda DELETE. Crearea unui view - permite definirea unei "ferestre" prin care se pot consulta datele stocate n tabele. C CR RE EA AT TE E V VI IE EW W n nu um me e- -v vi ie ew w [ [< <l li is st ta a a at tr ri ib bu ut te e> >] ] A AS S S SE EL LE EC CT T s se ec cv ve en n a a- -s se el le ec ct t [ [W WI IT TH H C CH HE EC CK K O OP PT TI IO ON N] ] Se poate observa n sintaxa comenzii c utilizatorului i se permite: specificarea denumirii view-ului i opional a denumirii atributelor din view, n cazul n care se dorete redenumirea atributelor specificate n instruciunea SELECT; specificarea interogrii (fraza SELECT); specificarea opional a unei condiii suplimentare impuse view-ului, astfel nct s poat fi realizat actualizarea sau inserarea datelor n view (prin utilizarea clauzei WITH CHECK OPTION). Definirea unui view este stocat n dicionarul de date al sistemului. Odat definit view-ul, drepturile de acces ale utilizatorilor decurg pe de o parte, din privilegiile acordate utilizatorilor asupra relaiilor pentru care este definit view-ul i, pe de alt parte, din posibilitatea de actualizare a view-ului. Crearea unui view simplu, care va permite selectarea unei mulimi de tupluri dintr-o tabel, se realizeaz prin comanda: CREATEVIEW FZ1 AS SELECTCODFZ, DENFZ, ADRESA FROMFURNIZOR WHEREADRESA="BUCURESTI"; V Vi ie ew w c cr re ea at te ed d. . Sursa de date o reprezint tabela Furnizor iar rezultatul returnat const n afiarea codului, denumirii i adresei furnizorilor bucureteni. Cnd un view este creat, e afiat un mesaj "View Created". Ulterior, view-ul poate fi vizualizat ca orice tabel: SELECT* FROMFZ1; unde FZ1 reprezint view-ul creat prin comanda anterioar. Crearea unui view complex presupune utilizarea unor funcii agregat n fraza Select: CREATEVIEWSTOC_3 (DEPOZIT, STOC_MEDIU, STOC_MAX, STOC_MIN) AS SELECTCOD_DEP, AVG(CANTITATE), MAX(CANTITATE), MIN(CANTITATE) FROMSTOCURI GROUPBYCOD_DEP; n acest caz coloanele view-ului au primit nume distincte de numele atributelor existente n tabela Stocuri, atribuirea valorilor fcndu-se n ordinea definirii atributelor n view. n urmtorul exemplu se exemplific folosirea mai multor fraze SELECT imbricate, rezultatul returnat reprezentnd clienii care au solicitat comenzi depozitelor alimentare: CREATEVIEWCLIENT_A AS SELECT* FROMCLIENT WHERECODCLI IN(SELECTCODCLI FROMCOMANDA WHERECODDEP IN(SELECTCODDEP FROMDEPOZIT WHEREDENDEP LIKE "*ALIM*")); Utilizarea opiunii WITH CHECK OPTION Aceast opiune asigur faptul c n cazul unei operaii INSERT sau UPDATE - nu va fi adugat sau actualizat nici un tuplu care nu se ncadreaz n condiiile specificate la definirea view-ului. Exemplu: CREATEVIEWSAL1 AS SELECTMARCA, NUME, SAL FROMSALARIAT WHERESAL BETWEEN 1500000 AND 3000000 WITHCHECKOPTION; Asupra view-urilor pot fi efectuate aceleai operaii ca asupra tabelelor pe baza crora au fost definite, cu unele restricii: Interogarea view-urilor Restricii pentru interogarea view-rilor: a) Clauza WHERE nu poate conine un atribut rezultat din aplicarea unei funcii agregat.
BD Cursul 10&11&12 NP 6 / 9 CREATEVIEWDEP1(DEPOZIT, TOTAL) AS SELECTCOD_DEP, SUM(CANTITATE) FROMSTOCURI GROUPBYCOD_DEP; Nu se poate specifica atributul TOTAL al vizualizrii DEP1 n clauza WHERE a unei interogri de tipul: SELECT* FROMDEP1 WHERETOTAL>300; Atributul TOTAL poate fi apelat numai n clauza ORDER BY. SELECTDEPOZIT, TOTAL FROMDEP1 ORDERBYTOTAL; b) Un atribut al view-ului rezultat n urma aplicrii unei funcii agregat, nu poate fi utilizat ulterior ca argument al unei alte funcii agregat. Nu va putea fi executat o cerere de forma : SELECTAVG(TOTAL) FROMDEP1;
R Re ea al li iz za ar re ea a o op pe er ra at to or ri il lo or r r re el la a i io on na al li i f fo ol lo os si in nd d l li im mb ba aj ju ul l S SQ QL L REUNIUNEA a dou tabele R i S (RUS) prezentnd aceeai structur, unde R este format din n tupluri i S este format din m tupluri, are ca rezultat o a treia tabel, T avnd aceeai structur cu a tabelelor surs i coninnd m+n tupluri. Fie cele dou tabele Clienti i ClientiNoi (tabela ClientiNoi cuprinde noii clieni creai n cursul zilei curente) definite cu aceeai structur. Operatorul reuniune se realizeaz n Access prin dou cereri de aciune: o cerere de tip make-table prin care se creeaz noua tabel (numit T n cadrul definiiei reuniunii) TotiClientii, pe baza tabelei Clienti, i o cerere de aciune de tip append-query pe baza tabelei ClientiNoi. Comenzile SQL corespunztoare celor dou cereri de aciune sunt: SELECTCLIENTI.* INTOTOTICLIENTII FROMCLIENTI; INSERTINTOTOTICLIENTII SELECTCLIENTINOI.* FROMCLIENTINOI; O a doua soluie ar consta n utilizarea operatorului union care va returna toate tuplurile din cele dou tabele surs, Clieni i ClientiNoi, i apoi generarea tabelei TotiClientii care s stocheze toate tuplurile returnate de operatorul union. Frazele SELECT corespunztoare sunt: SELECT* FROMCLIENTI UNION SELECT* FROMCLIENTINOI;
SELECTUNION.* INTOTOTICLIENTII FROM[UNION]; INTERSECIA a dou tabele R i S (RS) prezentnd aceeai structur, genereaz o a treia tabel, T (cu aceeai structur), coninnd tuplurile identice aparinnd att lui R ct i lui S. Pentru exemplificare vom utiliza tabelele Clienti i ClientiDebitori care prezint aceeai structur. Implementarea operatorului intersecie se face printr-o fraz SELECT n care se realizeaz un inner join ntre cele dou tabele surs, Clienti i ClientiDebitori: SELECTClient.* FROMClienti INNERJOINClientiDebitori ONClienti.CodClient=ClientiDebitori.CodClient; Pentru crearea tabelei T se poate executa apoi o cerere de aciune de tip make table avnd drept surs de date cererea construit prin fraza select prezentat mai sus (cerere salvat cu numele Query1): SELECTQuery1.* INTO T FROMQuery1; DIFERENA dintre dou tabele R i S avnd aceeai structur (R-S), este reprezentat de tabela T cuprinznd mulimea tuplurilor aparinnd lui R dar neaparinnd lui S. Implementarea operatorului diferen se realizeaz construind o cerere de cutare a tuplurilor din tabela Clienti fr corespondent n tabela ClientiDebitori. Fraza SQL corespunztoare este: SELECTDISTINCTROW[CLIENTI].[CodClient], [CLIENTI].[NumeClient], [CLIENTI].[Localitate], [CLIENTI].[Adresa], [CLIENTI].[Telefon] FROMCLIENTI LEFTJOINClientiDebitori ON[CLIENTI].[CodClient] = [ClientiDebitori].[CodClient] WHERE[ClientiDebitori].[CodClient] Is Null; Pentru crearea tabelei T se poate construi apoi o cerere de aciune de tip make table avnd ca surs de date cererea prezentat mai sus.
BD Cursul 10&11&12 NP 7 / 9 PRODUSUL CARTEZIAN a dou tabele R i S (RxS) este reprezentat de tabela T stocnd mulimea perechilor obinute prin concatenarea nregistrrilor aparinnd lui R cu cele aparinnd lui S. Pentru exemplificare vom folosi tabela Clienti i tabela Produse. Vom construi o cerere de selecie avnd drept surs de date cele dou tabele (nelegate ntre ele) i vom cobor n grila de proiectare n rndul FIELD atributele NumeClient din tabela Client i Denumire din tabela Produse. Fraza SELECT corespunztoare acestei cereri de selecie este: SELECTCLIENTI.NUMECLIENT, PRODUSE.DENUMIRE FROMCLIENTI, PRODUSE; Tabela T se poate crea apoi printr-o cerere de aciune de tip make table. SELECIA aplicat asupra unei tabele R stocnd n tupluri genereaz o nou tabel R1, prezentnd aceeai structur, dar stocnd m tupluri (m<=n). Acest operator se implementeaz prin construirea unei cereri de selecie coninnd pe rndul criteria din grila de proiectare criteriul de selecie dorit. S presupunem c dorim s extragem din tabela Clienti toate informaiile privind clienii bucureteni. Fraza select corespunztoare acestei cereri de selecie este: SELECTCLIENTI.* FROMCLIENTI WHERECLIENTI.Localitate="Bucureti"; PROIECIA aplicat asupra unei tabele R prezentnd gradul n va genera o nou tabel R1 prezentnd gradul m (m<=n) i stocnd acelai numr de tupluri ca i R. i de aceast dat implementarea operatorului se va realiza prin construirea unei cereri de selecie dar n rndul fields al grilei de proiectare se vor cobor doar o parte din atributele aparinnd structurii tabelei surs de date. Exemplu: Dac dorim s cunoatem numele i adresa clienilor, se va construi o cerere de selecie pe tabela Clienti prezentnd urmtorul coninut: SELECTCLIENTI.NumeClient, CLIENTI.Adresa FROMCLIENTI; Considerm necesar s subliniem faptul c frazele select permit utilizarea mai multor tabele drept surs de date (n definiia operatorilor algebrei relaionale sursa de date este reprezentat de o singur tabel) i combinarea operatorilor de selecie i proiecie. Proiecia se realizeaz prin precizarea listei atributelor pentru care se ntorc valori, iar selecia prin utilizarea clauzei WHERE care specific criteriul de selecie. COMPUNEREA (JOIN) se aplic asupra a dou tabele R i S care prezint n structura lor un atribut comun (numit atribut de jonciune) i genereaz o nou tabel T cu o structur complex format implicit din mulimea atributelor tabelelor surs. Operatorul de compunere se implementeaz prin fraza SELECT atunci cnd sursa de date este reprezentat de mai multe tabele. Cel mai utilizat operator de compunere este inner join care presupune ca valorile atributelor de compunere din cele dou tabele surs s prezinte realizri comune (egale). SELECTCLIENTI.NumeClient, COMENZI.NrComanda, COMENZI.DataComanda FROMCLIENTI INNERJOINCOMENZI ONCLIENTI.CodClient = COMENZI.CodClient; n exemplul prezentat mai sus cererea de selecie returneaz numele clienilor (din tabela Clienti), numrul i data comenzilor din tabela Comenzi, operatorul de compunere fiind un inner join. Pe lng inner join frazele SELECT pot cuprinde i operatori de compunere de tip: left join, right join, self join, theta non- equal.
Tema de casa Se considera urmatorul model relational al unei BD:
BD Cursul 10&11&12 NP 8 / 9 Sa se exprime in limbajul SQL urmatoarele comenzi:
Comenzi SQL pentru descrierea datelor. 1. Creati Tabela CLIENTI cu urmatoarele campuri: CodCL, Nume, Adresa, DataInregistrare, SoldDatorii). 2. Creati Tabelul Angajati cu urmtoarele cmpuri CodAngajat, NumeAngajat, DataAngajare, SalariuBaza, CNP. Observatii: se va limita nume angajat la 20 de caractere iar CNP la 13 caractere. Campul nume nu trebuie sa permita valoarea NULL iar CNP trebuie sa ia valori unice. 3. In tabela Angajati se va mai adauga campurile Functia si adresa de tip text 4. In tabela Angajati se va modifica coloana Nume pentru a memora pina la 55 de caractere 5. Se va terge din tabela Clienti cmpul DataInregistrare 6. Se va elimina din baza de date tabela Clienti (nu se va executa interogarea pt a mai folosim tabela ulterior)
Comenzi SQL pentru manipularea datelor 7. Sa se adauge in tabelul angajati salariatul Ionescu Ion cu cod 101, salariu 6000000 (INSERT) 8. Sa se creeze tabelul FurnizoriBrasov cu codurile, numele i datoriile furnizorilor la care soldul datoriilor depete 10.000.000 lei (SELECT INTO). 9. Angajatul avind codul 101 s se completeze data Angajare cu valoarea 4 aprile 2005 si sa se mareasca salariul cu 1.000.000 lei (UPDATE). 10. Presupunnd c numele de furnizori nu au fost scrise corect s se transforme toate realizrile din cmpul nume n majuscule (UPDATE): 11. S se terag din tabela Comenzi toate comenzile mai vechi de 400 de zile i cele provenite de la clientul cu codul 102 (DELETE)
Instruciuni de selecie a datelor Exemple de interogri de selectie simple: 12. Afisati toate informaiile despre materialele din categoria Consumabile 13. Afisati lista ordonata alfabetic a localitatilor din care se parovizioneaz firma de la parteneri organizai ca societi pe aciuni: 14. Afisati lista cu numele, adresele si sumele datorate ale primilor 5 furnizori la care firma are cele mai mari datorii. 15. Calculai pentru fiecare aprovizionare Valoarea si Valoarea in lei grei si ordonai lista descrescator dupa Valoare iar pentru aprovizionarile cu aceeasi valoare, ordonati cronologic dupa DataAprov. 16. Afiai lista cu denumirile i StocurileInitiale ale materialelor dintr-o anumit categorile precizat ca parametru.In cazul materialelor fara stoc initial se va preciza intr-o coloana numita Necesar textul De aprovizionat Exemple de interogri de selecie ce presupun gruparea datelor
17. Calculati ci furnizori are firma in fiecare localitate si afisati lista ordonata descrescator pentru localitatile in care exista mai mult de 2 furnizori.
18. Calculai Valoarea totala a aprovizionarilor pentru fiecare luna de dup data de 01-01-2000 si afisati rezultateledoar pentru lunile in care au existat mai mult de 3 aprovizionari.
Exemple de interogri de selectie avnd ca surs mai multe tabele
BD Cursul 10&11&12 NP 9 / 9 19. Afisati numele si adresele furnizorilor de la care s-au receptioat materiale in ultimele 100 zile 20. Caz particular : Jonctiuni externe (LEFT/RIGHT JOIN) : De la ce furnizori nu s-a realizat nici o aprovizionare ? 21. Afisati lista cu numele materialelor achiziionate de furnizorul ABC SRL n anull 2005.
Interogari DE TIP UNION 22. Se dorete afiarea unei liste cu 3 coloane ce va conine numele i adresele clienilor i furnizorilor iar n cea de-a treia coloan (numit Categorie) se va afia C pentru Clienti i F pentru Furnizori. (In prealabil adaugati un client in tabela Clienti ca sa existe inregistrari)
Observaii pentru interogri UNION - toate sursele de date trebuie s conin acelai numr de cmpuri - cmpurile din sursele de date s fie de acelai tip - ordinea cmpurilor trebuie s fie aceeai Interogri Crosstab Sintaxa:
TRANSFORM expresie Instruciune de selecie PIVOT campul ce urmeaza a fi afisat pe coloanele tabelului
23. Sa se realizeze o interogare de tip analiza incrucisata pentru a determina cantitatea totala comandata din fiecare produs in fiecare an. Se vor ordona anii pe coloane si materialele pe linii. 24. Sa se determine cate aprovizionari s-au realizat din fiecare tara din fiecare material. Se vor odona materialele pe coloane si denumirile tarilor din care provin furnizorii pe coloane
INTEROGARI CU SUBINTEROGARI Un exemplu particular l reprezint interogrile de tip INSERT INTO ce permit adugarea de date dintr-o tabel n alt tabel
25. Sa se adauge in tabela CLIENTI toi furnizorii din afara rii. 26. S se afieze lista cu cele mai ieftine materiale (se utilizeaz ALL) 27. S se afieze Numele furnizorilor din aceeai ar cu firma BEST SA. (se utilizeaz ANY) 28. Care sunt furnizorii a cror nume se regsesc i n tabela Clieni 29. S se diminueze cu 10% Preturile unitare din aprovizionrile provenite de la furnizori din Brasov in ultimele 90 de zile (se utilizeaz IN) 30. S se terag din tabela matteriale toate materialele din clasa de calitate 1 care au fost aprovizionate de mai puin de 5 ori (se utilizeaz IN) .