Sunteți pe pagina 1din 18

Proiectarea bazelor de date orientate obiect MODELAREA BAZELOR DE DATE

LIMBAJUL DE PRELUCRARE A DATELOR

SQL conine un limbaj de prelucrare a datelor complet, care ofer mecanisme att pentru modificarea (inserarea, tergerea, reactualizarea) datelor din baza de date, ct i pentru interogarea acesteia. Instruciunile limbajului de prelucrare a datelor (LMD Data Manipulation Language) realizeaz accesarea i actualizarea datelor existente n obiectele aparinnd schemelor bazei de date. Aceste instruciuni nu salveaz tranzacia curent, fiind componente ale acesteia. LMD poate opera att la nivel extern (asupra vizualizrilor), ct i la nivel conceptual (asupra tabelelor de baz). Comenzile LMD sunt urmtoarele: SELECT permite interogarea datelor din tabele sau vizualizri; INSERT realizeaz adugarea de noi nregistrri n tabele sau vizualizri att explicit, ct i ca rezultat al unor interogri; UPDATE efectueaz actualizarea valorilor coloanelor din liniile existente n tabele sau vizualizri; DELETE permite suprimarea de nregistrri din tabele sau vizualizri; MERGE realizeaz adugarea sau actualizarea condiionat de nregistrri n tabele sau vizualizri; CALL permite executarea unei rutine din cadrul limbajului SQL; EXPLAIN PLAN determin planul i costul de execuie al unei instruciuni SQL specificate; LOCK TABLE determin blocarea unuia sau mai multor tabele, partiii sau subpartiii de tabele ntr-un mod specificat, fiind prioritar blocrilor automate. De asemenea, permite sau respinge accesul la un tabel sau o vizualizare pe durata unei operaii.

Instruciunea SELECT
Scopul unei cereri (interogri) este de a regsi informaii din tabele sau vizualizri ale bazei de date. Aceast operaie este realizat de instruciunea SELECT. Comanda este extrem de puternic, fiind capabil de a efectua echivalentul operaiilor de selecie, proiecie i uniune din algebra relaional, n cadrul unei singure instruciuni. Instruciunea SELECT este nchis, n sensul c rezultatul unei interogri referitoare la unul sau mai multe tabele este tot un tabel. n Oracle10g, instruciunea SELECT are urmtoarea sintax simplificat: SELECT [hint] { [ {DISTINCT | UNIQUE} | ALL] lista_select | *} FROM [nume_schem.]nume_obiect [clauza_flashback] ] [, [nume_schem.]nume_obiect [clauza_flashback] ] [WHERE condiie_clauza_where] [START WITH condiie_clauza_start_with CONNECT BY condiie_clauza_connect_by] [GROUP BY expresie [, expresie ] [HAVING condiie_clauza_having] ] [ORDER [SIBLINGS] BY {expresie | poziie [ASC | DESC] } [, {expresie | poziie [ASC | DESC] } ] ] [FOR UPDATE [OF [ [nume_schem.]nume_obiect.]nume_coloan [, [ [nume_schem.]nume_obiect.]nume_coloan] ] [NOWAIT | WAIT numr_ntreg] ]; Clauza SELECT realizeaz operaia de proiecie i este urmat de lista coloanelor care trebuie regsite din baza de date i reinute n relaia rezultat. Aceast opiune poate conine un comentariu (hint) prin care se pot transmite directive optimizorului, referitor la alegerea unui plan de execuie pentru instruciune. Clauza SELECT nu trebuie confundat cu selecia din algebra relaional, din cauza similitudinii denumirilor. De asemenea, proiecia din SQL difer de operatorul de proiecie definit n cadrul algebrei relaionale prin faptul c nu elimin n mod automat tuplurile duplicat. Eliminarea acestora, atunci cnd este necesar, trebuie solicitat explicit prin intermediul operatorului DISTINCT. Aceste cuvinte cheie sunt sinonime i utilizarea lor determin sistemul Oracle s returneze o singur copie din fiecare mulime de linii duplicat selectate. Nu se poate specifica DISTINCT dac lista_select conine coloane de tip LOB. Prin specificarea opiunii ALL, sistemul urmeaz s returneze toate liniile selectate, inclusiv toate duplicatele. Aceast opiune este implicit. n lista_select se precizeaz coloanele i expresiile ale cror valori trebuie

regsite n baza de date. Pentru orice element al acestei liste poate fi specificat cte un nume diferit (alias), care redenumete elementul pe durata execuiei cererii. Specificarea caracterului * permite selectarea tuturor coloanelor corespunztoare obiectelor din clauza FROM. Operaia de compunere (join) poate fi realizat cu ajutorul clauzei FROM, atunci cnd aceasta este urmat de cel puin dou nume de relaie, mpreun cu condiia de compunere formulat n cadrul predicatului din clauza WHERE. n clauza FROM se specific obiectele (tabele, vizualizri sau vizualizri materializate) din care se extrag date. Aceste obiecte pot fi nsoite de un alias. Dac un obiect se afl ntr-o baz de date distant, se va preciza numele legturii ctre aceasta (database link). Selecia din algebra relaional este realizat prin clauza WHERE. Aceast clauz este, ns, mai complex dect operaia de selecie din algebra relaional, deoarece expresia care o urmeaz poate conine att comparaii de atribute i/sau expresii aritmetice, ct i operatori logici (AND, OR, NOT), operatori pe mulimi (UNION, INTERSECT, MINUS), operatori de apartenen la mulimi cu negrile acestora (IN, NOT IN) i operatorul de existen (EXISTS). Prin intermediul opiunii clauza_flashback este posibil interogarea datelor dintr-o stare anterioar a obiectelor. Momentul anterior poate fi specificat fie printr-o expresie numeric reprezentnd o valoare SCN, fie printr-o expresie reprezentnd o marc de timp. Clauza are urmtoarea form sintactic: [VERSIONS BETWEEN {SCN | TIMESTAMP} {expresie | MINVALUE} AND {expresie | MAXVALUE} ] AS OF {SCN | TIMESTAMP} expresie n urma interogrii, sistemul Oracle va returna liniile corespunztoare valorii SCN sau momentului de timp specificat. Opiunea clauza_flashback nu poate fi aplicat unui obiect situat pe o baz de date distant. Clauza VERSIONS a fost introdus n sistemul Oracle10g pentru a facilita interogrile asupra versiunilor. Ea permite regsirea mai multor versiuni ale liniilor returnate de cerere. Sistemul ntoarce toate versiunile salvate ale acestor linii, care au existat ntre dou valori SCN sau dou mrci de timp precizate. Liniile returnate includ versiunile de nregistrri terse i apoi reintroduse. Opiunile MINVALUE i MAXVALUE reprezint valoarea SCN sau a mrcii de timp a celor mai vechi, respectiv a celor mai recente date disponibile. Oracle furnizeaz pseudocoloane care permit regsirea de informaii suplimentare despre diferitele versiuni de linii. Aceste pseudocoloane sunt: VERSIONS_STARTTIME, VERSIONS_STARTSCN returneaz marca

de timp, respectiv valoarea SCN, a primei versiuni a liniilor returnate de cerere; VERSIONS_ENDTIME, VERSIONS_ENDSCN returneaz marca de timp, respectiv valoarea SCN, a ultimei versiuni a liniilor returnate de cerere;. VERSIONS_XID pentru fiecare versiune a fiecrei linii, returneaz identificatorul tranzaciei care a creat versiunea respectiv; VERSIONS_OPERATION pentru fiecare versiune a fiecrei linii, returneaz un caracter care reprezint operaia ce a condus la obinerea versiunii respective. Valorile returnate pot fi I, U sau D, corespunztor operaiilor de inserare, actualizare sau tergere.

Atunci cnd ambele clauze sunt folosite mpreun, AS OF determin valoarea SCN sau a momentului de timp la care este lansat o cerere, iar clauza VERSIONS determin versiunile liniilor, din perspectiva punctului definit de clauza AS OF. Sistemul returneaz valoarea null pentru o versiune de linie dac tranzacia a nceput nainte de prima valoare BETWEEN sau s-a ncheiat dup punctul AS OF. Exemplu. S se afieze denumirile i valorile vestimentaiilor, corespunztoare strii tabelelor din ziua precedent. S se determine ce valori au avut vestimentaiile din prezentarea avnd codul 45 n ultimele 10 minute. SELECT denumire, valoare FROM vestimentatie AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY); SELECT denumire, valoare FROM vestimentatie VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL '20' MINUTE AND SYSTIMESTAMP - INTERVAL '1' MINUTE WHERE cod_prezentare = 45; Clauzele START WITH i CONNECT BY se utilizeaz n formularea cererilor ierarhice. Ele vor fi prezentate n cadrul paragrafului 4.1.6, dedicat acestui tip de cereri. Clauza GROUP BY are ca efect gruparea tuplurilor unei relaii pe baza valorilor unui atribut sau grup de atribute. Expresiile din cadrul acestei clauze furnizeaz criteriul de grupare al tuplurilor unei relaii n submulimi de tupluri, toate avnd aceeai valoare pentru expresiile respective. Aceste submulimi sau grupuri de tupluri urmeaz a fi tratate unitar n anumite operaii, cum ar fi aplicarea funciilor de agregare care se calculeaz nu pe ntreaga relaie, ci pentru fiecare grup de nregistrri n parte. Pentru fiecare astfel de grup, va fi returnat o singur linie de informaie.

Relaia care rezult din orice interogare care conine clauza GROUP BY caracterizeaz aceste grupuri de tupluri, i nu tupluri individuale. Expresiile din clauza SELECT a unei cereri care conine opiunea GROUP BY trebuie s reprezinte o proprietate unic de grup, adic fie un atribut de grupare, fie o funcie de agregare aplicat tuplurilor unui grup, fie o expresie format pe baza primelor dou. n clauza GROUP BY pot aprea cel mult 255 expresii. Aceste expresii nu pot conine coloane LOB, tablouri imbricate sau vectori. Clauza GROUP BY poate produce grupri superagregat utiliznd extensiile CUBE sau ROLLUP. Acestea sunt frecvent utilizate n prelucrarea informaiilor specifice magaziilor de date (data warehouse). CUBE grupeaz liniile selectate pe baza valorilor tuturor combinaiilor posibile de expresii specificate i returneaz o singur linie pentru fiecare grup. ROLLUP grupeaz liniile selectate pe baza valorilor primelor n, n - 1, , 0 expresii din specificaia GROUP BY i returneaz o singur linie pentru fiecare grup. Aceast opiune genereaz subtotaluri de la nivelul inferior, pn la totalul general. Funciile grup pot fi utilizate pentru a produce diferite tipuri de valori superagregat. O alt extensie a clauzei GROUP BY este GROUPING SETS. Aceasta permite specificarea mai multor grupri de date. n acest fel, nu este necesar ca sistemul Oracle s efectueze toate gruprile generate de CUBE sau ROLLUP. Sistemul va evalua toate gruprile specificate n clauza GROUPING SETS i va combina rezultatele gruprilor individuale printr-o operaie UNION ALL. Clauza HAVING permite precizarea unei condiii asupra grupurilor de linii returnate. Condiia clauzei se refer la proprietile globale ale unui grup de tupluri, i nu la tupluri individuale. Astfel, tuplurile unui grup sunt tratate mpreun, n bloc, conform criteriului specificat de aceast clauz. Exprimarea acestui criteriu se face cu ajutorul atributelor de grupare i al funciilor de agregare aplicate grupurilor. Clauza ORDER BY specific ordonarea tuplurilor unei relaii rezultat dup valorile expresiilor precizate. n aceast clauz pot fi specificate expresii sau numere ntregi reprezentnd poziiile unor expresii n lista SELECT. Astfel, ordonarea poate avea loc dup valorile expresiilor care apar n clauz sau dup valorile expresiilor din lista SELECT aflate pe poziia specificat n clauz. Cuvintele cheie ASC i DESC indic modul n care se face ordonarea, dup valorile cresctoare, respectiv descresctoare, ale expresiei specificate. Implicit, ordinea este cea cresctoare. Dac se omite clauza ORDER BY, atunci ordinea n care sunt regsite

nregistrrile poate s difere de la o execuie la alta. n ordine cresctoare, valorile null urmeaz tuturor celorlalte valori. Pentru a schimba poziia pe care apar valorile null n rezultat, sunt utile opiunile NULLS FIRST sau NULLS LAST. Acestea determin ca valorile null s apar pe primele, respectiv pe ultimele poziii. Clauza ORDER BY poate s conin cuvntul cheie SIBLINGS care este valid numai dac este prezent n cerere i opiunea CONNECT BY. La utilizarea opiunii SIBLINGS, sistemul conserv ordonrile specificate n clauza CONECT BY, apoi aplic ordonarea precizat prin ORDER BY nodurilor din ierarhie care au un printe comun. Similar opiunii GROUP BY, clauza ORDER BY poate conine cel mult 255 de expresii n care nu pot aprea coloane LOB, tablouri imbricate sau vectori. Dac n instruciunea SELECT a fost specificat operatorul DISTINCT, clauza ORDER BY nu poate face referin dect la coloane care apar n lista SELECT. n caz contrar, pot aprea expresii care fac referire la orice coloan a tabelelor din clauza FROM. Prin clauza FOR UPDATE este posibil blocarea nregistrrilor selectate de cerere, astfel nct ceilali utilizatori s nu poat bloca sau actualiza aceste linii pn la terminarea tranzaciei curente. Aceast opiune nu poate fi specificat n subcereri. O situaie n care aceast opiune este util apare la actualizarea unei valori LOB. n acest caz, trebuie blocat linia care conine valoarea respectiv. Liniile tablourilor imbricate nu sunt blocate ca rezultat al blocrii liniilor tabelului printe. Aceste linii pot fi blocate n mod explicit. Nu se poate utiliza clauza FOR UPDATE dac n interogare au aprut: operatorul DISTINCT, operatori pe mulimi, clauza GROUP BY sau funcii agregat. Tabelele blocate prin clauza FOR UPDATE, coloanele LONG i secvenele referite n instruciune trebuie s fie localizate pe aceeai baz de date. Prin intermediul clauzelor NOWAIT i WAIT se poate specifica modul n care sistemul Oracle va proceda atunci cnd instruciunea SELECT ncearc s blocheze o linie care a fost deja blocat de alt utilizator. Opiunea NOWAIT determin redarea controlului ctre utilizator imediat dup ce se constat c exist deja o blocare. Clauza WAIT, urmat de un numr ntreg n, determin sistemul s atepte n secunde pentru ca linia s devin disponibil, apoi s redea controlul utilizatorului. Dac se omit aceste clauze, sistemul Oracle ateapt pn cnd linia respectiv devine disponibil, dup care furnizeaz rezultatele instruciunii SELECT.

4.1.1. Funcii grup i clauza GROUP BY


Divizarea liniilor unui tabel n grupuri este posibil cu ajutorul clauzei GROUP BY. Gruparea liniilor se realizeaz cu scopul de a obine o informaie specific fiecrui grup, prin utilizarea funciilor agregat. Aceste funcii pot aprea n clauzele SELECT, ORDER BY i HAVING i sunt aplicate de ctre serverul Oracle fiecrui grup de nregistrri, ntorcnd cte o singur linie rezultat. Atunci cnd este utilizat clauza GROUP BY, serverul sorteaz implicit mulimea rezultat n ordinea cresctoare a valorilor coloanelor dup care se realizeaz gruparea. Din clasa funciilor grup definite n sistemul Oracle, amintim: AVG, SUM, MAX, MIN, COUNT, STDDEV, VARIANCE, DENSE_RANK, RANK, FIRST, LAST, GROUP_ID, GROUPING, GROUPING_ID etc. Tipurile de date ale argumentelor funciilor grup pot fi CHAR, VARCHAR2, NUMBER sau DATE. Funciile AVG, SUM, STDDEV i VARIANCE opereaz numai asupra valorilor numerice. Funciile MAX i MIN pot opera asupra valorilor numerice, caracter sau de tip dat calendaristic. Valorile null sunt ignorate de ctre toate funciile grup, cu excepia lui COUNT(*). Apelul COUNT(expresie) returneaz numrul de linii pentru care expresia dat este diferit de null. Funcia COUNT returneaz un numr mai mare sau egal cu zero i nu ntoarce niciodat valoarea null. Utilizarea gruprilor de date i a funciilor grup va fi exemplificat n cadrul interogrilor prezentate n paragrafele urmtoare.

Cereri simple
Interogrile simple sau monorelaie regsesc informaii dintr-un singur tabel. Pentru o bun nelegere a acestor cereri, vom prezenta un set de exemple. Acestea vor recurge la operatorii i funciile prezentate n capitolul 2 al acestei lucrri. Relaiile la care se fac referiri sunt cele corespunztoare modelului de gestiune a prezentrilor de mod. Exemplu. S se afieze denumirea i vechimea n ani a caselor de mod care nu au fost nfiinate n intervalul 2003-2005 i al cror proprietar ndeplinete funcia de director. SELECT nume "Denumire casa moda", MONTHS_BETWEEN(SYSDATE, data_creare)/12 vechime FROM casa_moda WHERE LOWER(proprietar) = LOWER(director)

AND

TO_CHAR(data_creare, 'YYYY') NOT BETWEEN 2003 AND 2005;

Coloanele sau expresiile regsite de cerere pot avea alias-uri care se specific, n mod necesar, ntre ghilimele atunci cnd conin spaii sau caractere speciale. Spre deosebire de acestea, irurile de caractere i datele calendaristice se includ ntre apostrofuri. n mod evident, cutrile dup un anumit ir de caractere sunt case sensitive. Pentru a determina efectuarea unei cutri case-insensitive se pot folosi funciile de tip caracter UPPER sau LOWER. Exemplu. S se afieze codurile creatorilor care au conceput vestimentaii a cror valoare este divizibil cu 1000 i codurile modelelor care au prezentat aceste vestimentaii. SELECT DISTINCT cod_creator, cod_model FROM vestimentatie WHERE MOD(valoare, 1000) = 0; Exemplu. S se afieze prezentrile coordonate de organizatorii avnd codurile 11, 44, 77, precum i cele a cror denumire conine cuvntul spring sau pentru care al treilea caracter din denumire este n. SELECT cod_prezentare, denumire, cod_organizator FROM prezentare WHERE cod_organizator IN (11, 44, 77) OR LOWER(denumire) LIKE '%spring%' OR LOWER(denumire) LIKE '__n%'; Cutarea unui ir de caractere se poate realiza cu ajutorul simbolurilor %, reprezentnd orice secven de zero sau mai multe caractere, i _, reprezentnd un singur caracter. Exemplu. S se afieze prezentrile de mod care au nceput n urm cu cel mult 3 luni i care au durat cel puin 5 zile. SELECT cod_prezentare, denumire FROM prezentare WHERE MONTHS_BETWEEN(SYSDATE, data_start) <= 3 AND data_final data_start > 5; Exemplu. S se afieze informaii despre prezentrile de mod, n formatul urmtor: Prezentarea <denumire> a nceput la data <data_start> i a durat <n> zile. Dac data de nceput nu este cunoscut, atunci va fi afiat 1 mai 2008. Dac nu este cunoscut durata, se va afia un mesaj corespunztor. SELECT 'Prezentarea ' || denumire

FROM

|| ' a inceput la data ' || NVL(data_start, '1-MAY-2008') || NVL2(TO_CHAR(data_final data_start), ' i a durat ' || data_final data_start || ' zile.', ' iar durata sa este necunoscuta.') "Prezentari de moda" prezentare;

Exemplu. Pentru prezentrile de mod a cror denumire ncepe cu caracterele ia i se termin cu irul show, s se afieze codul, denumirea, data de nceput, lungimea denumirii i poziia n care denumirea conine caracterul l. Informaiile se vor afia n ordinea lungimii, iar cele referitoare la denumire i la data de nceput se vor afla pe o singur coloan. SELECT cod_prezentare, CONCAT(denumire ||', ', data_start) "Info", LENGTH(denumire) lungime, INSTR(LOWER(denumire), 'l') "Pozitie 'o'" FROM prezentare WHERE SUBSTR(UPPER(denumire), 1, 2) = 'IA' AND SUBSTR(LOWER(denumire), -4) = 'show' ORDER BY lungime; Exemplu. S se afieze data, ora curent i ultima zi a lunii n curs. SELECT TO_CHAR(SYSDATE, 'DD-MM-YYYY HH24:MI:SS') "Data si ora curenta", LAST_DAY(SYSDATE) FROM DUAL; Pentru situaiile n care se afieaz valoarea unei constante, pseudocoloane sau expresii care nu este construit pe baza datelor vreunui obiect, este util tabelul DUAL. Acesta aparine schemei SYS i poate fi accesat de ctre toi utilizatorii. n general, tabelul DUAL este utilizat pentru a completa sintaxa instruciunii SELECT, deoarece clauzele SELECT i FROM sunt obligatorii. Exemplu. S se afieze vrsta creatorilor de mod i data primei renegocieri a contractului (considerat ca prima zi de vineri dup 6 luni de serviciu). Informaiile vor fi afiate n ordinea descresctoare a vrstei. SELECT cod_creator, nume, prenume, MONTHS_BETWEEN(SYSDATE, data_nastere) varsta, NEXT_DAY(ADD_MONTHS(data_angajare, 6), 'FRIDAY') "Data renegociere" FROM creator ORDER BY 2 DESC;

10

Exemplu. S se afieze numele, data nfiinrii i cifra de afaceri a caselor de mod care au fost create nainte de 15 august 1999. Data nfiinrii va aprea n limba englez, ntr-un format corespunztor exemplului Second of March 2008 08:50:00 PM. De asemenea, cifra de afaceri va fi afiat ntr-un format numeric corespunztor. SELECT nume, TO_CHAR(data_creare, 'Ddspth "of" Month YYYY HH:MI:SS AM') "Data infiintarii", TO_CHAR(valoare, '$999,999,999.00') Afaceri FROM casa_moda WHERE data_creare < TO_DATE('15-08-99', 'DD-MM-RR'); Utilizarea formatului RR asigur c anul corespunztor datei calendaristice este interpretat ca fcnd parte din intervalul 1950-1999. Utilizarea formatului YY ar determina considerarea anului n secolul curent. Exemplu. S se afieze denumirile caselor de mod i numele proprietarilor, dac acetia sunt diferii de directori. SELECT nume, NULLIF (proprietar, director) Proprietar FROM casa_moda; Exemplu. S se afieze denumirile vestimentaiilor pentru care se cunoate doar codul modelului, informaiile despre codul prezentrii i al creatorului fiind necunoscute. Presupunem c domeniile n care iau valori cele trei coduri sunt disjuncte. SELECT denumire, FROM vestimentatie WHERE COALESCE(cod_prezentare, cod_creator, cod_model) = cod_model; Exemplu. Pentru fiecare vestimentaie, s se afieze denumirea, valoarea i codul creatorului. De asemenea, s se listeze valoarea vestimentaiei dup ce se aplic o mrire, astfel: pentru vestimentaiile concepute de creatorul avnd codul 120 creterea este de 20%, pentru cele realizate de creatorul avnd codul 211 creterea este de 35%, iar valoarea celor aparinnd creatorului avnd codul 221 crete cu 15%. Valoarea nu se modific n cazul vestimentaiilor realizate de ali creatori. SELECT denumire, cod_creator, valoare, CASE cod_creator WHEN 120 THEN valoare * 1.20 WHEN 211 THEN valoare * 1.35

11

FROM

WHEN 221 THEN valoare * 1.15 ELSE valoare END "Crestere valoare" vestimentatie;

Echivalent, cererea precedent poate fi rezolvat utiliznd funcia DECODE: SELECT denumire, cod_creator, valoare, DECODE (cod_creator, 120, valoare * 1.20, 211, valoare * 1.35, 221, valoare * 1.15, valoare) "Crestere valoare" vestimentatie;

FROM

Exemplu. S se obin suma, media valorilor, valoarea minim i cea maxim pentru vestimentaiile realizate de creatorul avnd codul 75. n cadrul aceleiai interogri, se cere numrul de vestimentaii i numrul de modele care au prezentat pentru acest creator de mod. SELECT SUM(valoare) Suma, AVG(valoare) Media, MIN(valoare) Minim, MAX(valoare) Maxim, COUNT(*) Numar, COUNT(DISTINCT cod_model) "Numar modele" FROM vestimentatie WHERE cod_creator = 75; Dup cum se va arta ulterior, funciile grup ignor valorile null. Prin urmare, instruciunea precedent va returna media valorilor pe baza liniilor din tabel pentru care exist o valoare diferit de null. Astfel, reiese c suma valorilor se mparte la numrul de valori diferite de null. Calculul mediei pe baza tuturor liniilor din tabel se poate realiza utiliznd funciile NVL, NVL2 sau COALESCE. SELECT FROM AVG(NVL(valoare, 0)) vestimentatie;

Exemplu. S se afieze media valorilor vestimentaiilor pentru fiecare prezentare i, n cadrul acesteia, pentru fiecare creator de mod. Media va fi rotunjit la dou zecimale. SELECT cod_prezentare, cod_creator, ROUND(AVG(valoare), 2) Medie FROM vestimentatie GROUP BY cod_prezentare, cod_creator;

12

Exemplu. S se obin numrul modelelor care au prezentat cel puin 30 de vestimentaii. SELECT COUNT(COUNT(cod_model)) FROM vestimentatie GROUP BY cod_model HAVING COUNT(*) > 30; Interogarea precedent grupeaz liniile dup cod_model, iar pentru fiecare grup numr cte vestimentaii au fost prezentate de modelul respectiv (COUNT(cod_model)). Sunt reinute numai liniile rezultat corespunztoare modelelor care ndeplinesc cerina din enun, iar numrul acestora este reprezentat prin COUNT(COUNT(cod_model)). Exemplu. S se obin maximul dintre valorile medii ale vestimentaiilor realizate de fiecare creator de mod. SELECT MAX(AVG(valoare)) FROM vestimentatie GROUP BY cod_creator; Exemplu. S se obin codurile creatorilor de mod care au realizat cel puin 25 de vestimentaii. SELECT cod_creator, COUNT(*) FROM vestimentatie GROUP BY cod_creator HAVING COUNT(*) > 25; Exemplu. Pentru creatorii de mod care au realizat mai mult de zece vestimentaii, s se afieze codul acestora i suma valorilor vestimentaiilor corespunztoare. Se vor considera doar vestimentaiile care nu au fost prezentate de modelul avnd codul 345, iar rezultatul va fi afiat n ordinea descresctoare a sumelor respective. SELECT cod_creator, SUM(valoare) "Suma vestimentatii" FROM vestimentatie WHERE cod_model <> 345 GROUP BY cod_creator HAVING COUNT(*) > 10 ORDER BY SUM(valoare) DESC;

Cereri pe tabele multiple


Exemplele considerate n paragraful anterior au o limitare major: toate coloanele referite trebuie s provin dintr-un singur tabel. n majoritatea situaiilor practice, acest lucru este insuficient.

13

Pentru a accesa i interoga date din mai multe tabele, se formuleaz cereri multirelaie. Fiecrui tabel i corespunde o mulime de nregistrri, asupra crora se pot realiza att operaiile uzuale asupra mulimilor, ct i operaii specifice bazelor de date.

Operatori pe mulimi
Pentru a implementa operaiile generale ale lucrului cu mulimi, sistemul ofer patru operatori: UNION, UNION ALL, INTERSECT i MINUS Aceti operatori combin rezultatele obinute din dou sau mai multe interogri. Cererile care conin operatori pe mulimi se numesc cereri compuse. Operatorul UNION realizeaz reuniunea a dou mulimi de nregistrri, returnnd toate liniile selectate de dou cereri i eliminnd duplicatele. Acest operator nu ignor valorile null i are preceden mai mic dect operatorul IN. Exemplu. S se afieze, fr duplicate, codurile prezentrilor de mod pentru care s-a fcut publicitate sau au fost protejate de o firm de securitate. SELECT cod_prezentare FROM publicitate UNION SELECT cod_prezentare FROM paza; Spre deosebire de UNION, operatorul UNION ALL nu elimin duplicatele, iar n cererile asupra crora se aplic UNION ALL nu poate fi utilizat cuvntul cheie DISTINCT. Prin operatorul INTERSECT este implementat operaia de intersecie a dou mulimi de nregistrri. Acest operator returneaz toate liniile comune selectate de cererile asupra crora se aplic. Acest operator nu ignor valorile null. Exemplu. S se afieze codul prezentrilor de mod pentru care s-a emis un ordin de plat din partea unui sponsor la data nceperii prezentrii. SELECT cod_prezentare, data_start FROM prezentare INTERSECT SELECT cod_prezentare, data_emitere FROM finanteaza; Operaia de diferen a dou mulimi de nregistrri se poate realiza prin intermediul operatorului MINUS. Acesta determin liniile returnate de prima cerere care nu sunt selectate de ctre a doua cerere. Exemplu. S se determine codul i valoarea vestimentaiilor a cror valoare nu este egal cu valoarea vreunui accesoriu corespunztor.

14

SELECT FROM MINUS SELECT FROM

cod_vestimentatie, valoare vestimentatie cod_vestimentatie, valoare accesoriu;

Observaii: Serverul Oracle elimin liniile duplicat pentru cererile care utilizeaz operatori pe mulimi, cu excepia lui UNION ALL. Rezultatul cererilor compuse, cu excepia celor obinute cu ajutorul operatorului UNION ALL, este ordonat cresctor dup valorile primei coloane din clauza SELECT. Pentru a ordona rezultatul unei cereri, se utilizeaz clauza ORDER BY. Aceasta trebuie plasat la sfritul cererii, putnd aprea numai o singur dat ntr-o cerere compus. n clauza ORDER BY se poate utiliza notaia poziional sau nume de coloane i alias-uri din lista SELECT a primei cereri componente. Lista coloanelor returnate de ctre instruciunile SELECT asupra crora se aplic operatori pe mulimi trebuie s corespund ca numr i tip de date pentru fiecare cerere. Nu este necesar ca numele coloanelor s fie identice. n rezultat, numele coloanelor sunt determinate de numele sau alias-urile care apar n clauza SELECT a primei cereri. Dac interogrile unei cereri compuse selecteaz date de tip caracter, atunci tipul de date al valorii returnate poate fi CHAR, dac valorile selectate de ambele cereri sunt de tip CHAR, sau VARCHAR2, dac valorile selectate de cel puin una dintre cele dou cereri sunt de tip VARCHAR2. n sistemul Oracle, toi operatorii pe mulimi au aceeai preceden. Astfel, o cerere compus care conine mai muli operatori pe mulimi este evaluat de la stnga la dreapta. Ordinea de evaluare poate fi schimbat utiliznd paranteze. Operatorii pe mulimi pot fi utilizai n subcereri. Coloanele care apar n clauza WHERE a interogrii trebuie s corespund, ca numr i tip de date, celor din clauza SELECT a subcererii. Exemplu. S se determine codul creatorilor, codul i denumirea vestimentaiilor a cror valoare este mai mare dect 2000 sau egal cu valoarea unui accesoriu. SELECT cod_creator, cod_vestimentatie, denumire FROM vestimentatie WHERE (cod_vestimentatie, valoare)

15

IN (SELECT FROM WHERE UNION SELECT FROM

cod_vestimentatie, valoare vestimentatie valoare > 2000 cod_vestimentatie, valoare accesoriu);

Pentru a asigura ca listele expresiilor din clauzele SELECT s concorde ca numr i tip de date, se pot utiliza coloane artificiale i funcii de conversie pentru tipurile de date. Exemplu. Utiliznd operatorul UNION, s se listeze codul vestimentaiilor, codul i numele creatorilor de mod. SELECT cod_vestimentatie, cod_creator, TO_CHAR(null) nume FROM vestimentatie UNION SELECT TO_NUMBER(null), cod_creator, nume FROM creator; Se pot utiliza coloane artificiale pentru a schimba ordinea de afiare a rezultatului unei cereri compuse. Pentru a suprima afiarea coloanelor artificiale, se poate utiliza comanda COLUMN, care este specific mediului SQL*Plus i va fi prezentat n capitolul 6. Exemplu. S se afieze propoziia Am nceput s nv Oracle10g utiliznd o cerere compus i o coloan artificial pentru ordonare. COLUMN aux NOPRINT SELECT 'sa invat' Scop, 2 aux FROM dual UNION SELECT 'Am inceput', 1 FROM dual UNION SELECT 'Oracle10g', 3 FROM dual ORDER BY 2;

Operaia de compunere
Dac este necesar obinerea de informaii din mai mult dect un tabel, avem de ales ntre utilizarea unei subcereri sau a unei operaii de compunere (join). Dac tabelul cu rezultatele finale trebuie s conin coloane din tabele diferite, atunci se utilizeaz compunerea.

16

n SQL, operaia de compunere combin informaiile din dou tabele, prin formarea de perechi de linii asociate din acestea. Perechile de nregistrri care formeaz tabelul compus sunt cele n care anumite coloane din cele dou tabele au aceeai valoare. Pentru a efectua o compunere, se include n clauza FROM mai mult dect o denumire de tabel, utiliznd virgula ca separator. Este posibil s se utilizeze un alias pentru tabelele specificate n clauza FROM. Similar alias-urilor pentru coloane, un alias pentru tabel reprezint un nume temporar dat tabelului respectiv, valabil doar pe perioada execuiei cererii. Alias-urile pentru tabele sunt utilizate pentru a asigura claritatea codului SQL. Un alias poate fi utilizat pentru a califica denumirea unei coloane. Calificarea unei coloane cu numele sau alias-ul tabelului se poate face opional, pentru claritate i pentru mbuntirea timpului de acces la baza de date, sau obligatoriu, ori de cte ori exist o ambiguitate privind sursa coloanei. Ambiguitatea const, de obicei, n existena unor coloane cu acelai nume n mai mult de dou tabele. Alias-urile pot fi utilizate oriunde, ca o notaie mai scurt, n locul denumirii tabelului. Ele pot avea lungimea de maxim 30 de caractere, dar este recomandat s fie scurte i sugestive. Dac este atribuit un alias unui tabel din clauza FROM, atunci el trebuie s nlocuiasc apariiile numelui tabelului n instruciunea SELECT. Condiia de join se scrie n clauza WHERE a comenzii SELECT. Pentru a realiza o compunere ntre n tabele, va fi nevoie de cel puin n 1 condiii de join. Exist urmtoarele tipuri de compunere a tabelelor: equijoin, nonequijoin, i outer join. Sintaxa asociat acestor tipuri de compunere este diferit de standardele ANSI. Operaia de tip equijoin corespunde situaiei n care valorile de pe coloanele ce apar n condiia de compunere trebuie s fie egale. O astfel de compunere se mai numete join simplu, join natural sau inner join. Compunerea de tip nonequijoin apare atunci cnd condiia de compunere conine ali operatori dect cel de egalitate. Un caz special al acestor tipuri de compunere l reprezint operaia de self join, care realizeaz compunerea unui tabel cu el nsui. Exemplu. S se afieze codul, denumirea organizatorilor, denumirea prezentrilor coordonate i data de nceput a acestora. Nu se vor utiliza alias-uri pentru tabele. SELECT organizator.cod_organizator, organizator.denumire, prezentare.denumire, prezentare.data_start FROM organizator, prezentare WHERE prezentare.cod_organizator = organizator.cod_organizator;

17

Pe lng condiia de join, n clauza WHERE pot aprea i alte criterii de restricionare a liniilor asupra unuia sau a mai multor tabele din compunere. Interogrile pe tabele multiple, utilizate cel mai frecvent, implic dou tabele ntre care exist o relaie 1:M (one to many) sau printe-copil. Cererea precedent constituie un astfel de exemplu. Fiecare prezentare (copil) are asociat un organizator (printe), iar fiecare organizator (printe) poate avea asociate mai multe prezentri (copii). Perechile de linii care genereaz rezultatul interogrii sunt combinaii de linii printe-copil. ntr-o baz de date relaional, tabelul care conine cheia extern este tabelul copil, iar cel care conine cheia primar este tabelul printe. Pentru a utiliza relaia printe-copil n cadrul unei interogri SQL, se specific o condiie de cutare care compar cheia extern cu cheia primar. n exemplul anterior, am comparat cheia primar o.cod_organizator din tabelul organizator, cu cheia extern p.cod_organizator din tabelul prezentare. Exemplu. S se afieze informaii referitoare la vestimentaiile mai scumpe dect 1000, prezentrile n care au aprut i organizatorii acestor prezentri. SELECT cod_vestimentatie, v.denumire, p.cod_prezentare, p.denumire, o.cod_organizator, o.denumire FROM vestimentatie v, prezentare p, organizator o WHERE v.cod_prezentare = p.cod_prezentare AND p.cod_organizator = o.cod_organizator AND valoare > 1000; Operaia de compunere combin datele din dou tabele, formndu-se perechi de linii legate ntre ele, n care coloanele corespondente din fiecare tabel au aceeai valoare. Dac o linie dintr-un tabel nu are corespondent, aceasta este omis din tabelul rezultant. Operaia de outer join sau compunere extern este utilizat pentru a reine n rezultat i nregistrrile care nu satisfac condiia de compunere. Specificarea unei operaii de compunere extern se poate realiza prin intermediul operatorului (+) n clauza WHERE sau al operatorilor ISO pentru acest tip de compunere. Operatorul (+) poate fi plasat n orice parte a condiiei de join, dar nu n ambele pri simultan. Efectul acestui operator este de a compune liniile tabelului care nu au corespondent n cellalt tabel cu o linie avnd valori null. O condiie care specific un outer join nu poate utiliza operatorul IN i nu poate fi legat de alt condiie prin operatorul OR. Standardul ISO pune la dispoziie operatori specifici compunerii externe, care vor fi prezentai ulterior.

18

Exemplu. S se afieze informaii (cod i denumire) despre organizatori i prezentrile coordonate de acetia. Rezultatul va conine i organizatorii care nu au coordonat nicio prezentare. SELECT o.cod_organizator, o.denumire, p.cod_prezentare, p.denumire FROM organizator o, prezentare p WHERE o.cod_organizator = p.cod_organizator (+);

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