Sunteți pe pagina 1din 35

Selecia liniilor (clauza WHERE) De obicei vrem s selectm numai anumite linii dintr-o tabel i s includem numai aceste

linii n rezultatul interogrii. Clauza WHERE este utilizat pentru a specifica liniile pe care dorim s le extragem. n continuare sunt prezentate cteva interogri care utilizeaz clauza WHERE. S se afieze birourile n care de vnzrile depesc planul.

S se afieze numele, vnzrile i cota angajatului cu numrul 105.

S se afieze angajaii care l au ca manager pe Bob Smith (angajatul cu numrul 104).

Clauza WHERE const din cuvntul cheie WHERE urmat de o condiie de selecie care specific liniile care trebuie extrase. n interogarea precedent, condiia de selecie este MANAGER=104. Figura 5.6 ne arat cum lucreaz clauza WHERE.

Figura 5.6 Selecia liniilor cu clauza WHERE Conceptual, SQL parcurge fiecare linie din tabela SALESREPS, un cte una, i aplic fiecreia dintre acestea condiia de selecie. Cnd numele unei coloane apare n condiia de selecie (cum este coloana MANAGER din exemplul precedent), SQL utilizeaz valoarea coloanei respective din linia curent. Pentru fiecare linie, condiia de selecie poate produce unul dintre urmtoarele rezultate: Dac rezultatul evalurii condiiei este TRUE atunci linia este inclus n rezultatul interogrii. Dac rezultatul evalurii condiiei este FALSE, linia respectiv este exclus din rezultatul interogrii. Dac rezultatul evalurii condiiei este NULL (valoare necunoscut), linia respectiv este exclus din rezultatul interogrii. Figura 5.7 ne arat un alt mod de a gndi rolul condiiei de selecie din clauza WHERE. n esen, condiia de selecie acioneaz ca un filtru pentru linii. Liniile care satisfac condiia de selecie trec prin filtru i devin parte component a rezultatului interogrii. Liniile care nu satisfac condiia sunt oprite de ctre filtru i excluse din rezultatul interogrii.

Figura 5.7 Clauza WHERE ca i filtru Condiia de selecie SQL ofer un set bogat de condiii de selecie care ne permit specificarea unei mari varieti de interogri, n mod eficient i natural. Exist cinci condiii de selecie de baz (numite i predicate n standardul ANSI/ISO): Comparaia Verificarea apartenenei la un interval de valori Verificarea apartenenei la o mulime de valori Verificarea potrivirii cu un ablon Testarea valorilor nule Comparaia (=, < >, <, <=, >, >=) Cea mai ntlnit condiie de selecie utilizat n interogrile SQL este comparaia. ntrun test de comparaie, SQL evalueaz i compar valorile a dou expresii SQL pentru fiecare linie n parte. Expresiile pot fi att simple nume de coloane sau constante ct i expresii aritmetice complexe. SQL ofer ase operatori de comparaie: =, < >, <, < =, >, > =. Rezultatul efecturii comparaiei poate fi : TRUE, FALSE sau NULL. Numai liniile pentru care rezultatul comparaiei este TRUE sunt incluse n rezultatul interogrii. S se afieze agenii de vnzri angajai nainte de 1988.

S se afieze toate birourile n care vnzrile sunt mai mici dect 80% din valoarea planului.

S se afieze birourile de vnzri al cror manager nu este angajatul cu numrul 108.

Obinerea unei singure linii Majoritatea testelor de comparaie verific dac valoarea unei coloane este egal cu o constant. Cnd coloana este cheie primar testul identific o singur linie n tabel, furniznd o singur linie n rezultat, ca in exemplul urmtor: S se afieze numele i limita creditului clientului cu numrul 2107.

Consideraii asupra valorilor NULL Am vzut c SQL are o logic bazat pe trei valori de adevr, astfel nct o condiie de selecie poate furniza valorile de adevr TRUE, FALSE sau NULL. Numai liniile pentru care condiia de selecie este evaluat TRUE vor fi incluse n rezultatul interogrii. S se afieze agenii de vnzri care si-au depit cota.

S se afieze agenii de vnzri care nu si-au realizat cota.

Interogrile produc apte, respectiv dou linii, deci n total nou linii, n timp ce n tabela SALESREPS sunt zece linii. Linia lui Tom Snyder are valoarea NULL n coloana QUOTA deoarece lui nu i-a fost nc atribuit o cot. Aceast linie nu apare n rezultatul nici uneia dintre interogrile anterioare deoarece testul comparaiei furnizeaz valoarea NULL.

Verificarea apartenenei la un interval de valori Se verific dac o expesie (expresie_de_testat) este cuprins ntre dou valori specificate (expresie_inf i expresie_sup). expresie_de_testat BETWEEN expresie_inf AND expresie_sup S se afieze comenzile efectuate n ultimul trimestru al anului 1989.

S se afieze comenzile avnd valori cuprinse ntre diferite intervale.

Negaia testului de aparten la un interval de valori, NOT BETWEEN, verific dac o valoare a unei expresii este n afara intervalului respectiv. S se afieze agenii de vnzri ale cror vnzri nu sunt cuprinse ntre 80% i 120% din cot.

Observaii:

Dac expresia de testare produce o valoare NULL sau ambele expresii care stabilesc intervalul sunt NULL, rezultatul testrii este NULL. Dac expresia care precizeaz intervalul inferior este NULL, atunci testul returneaz FALSE- dac valoarea de testare este mai mare dect limita superioar i NULL n caz contrar. Dac expresia care precizeaz intervalul superior este NULL, atunci testul returneaz FALSE- dac valoarea de testare este mai mic mare dect limita inferioar i NULL n caz contrar. Verificarea apartenenei la o mulime Se verific dac o expresie (expresie_de_testat) se regsete (IN) printre elementele unei mulimi specificate prin elementele ei (const1, const2, ..., constn). expresie_de_testat IN (const1, const2, ..., constn) Toate elementele specificate n list trebuie s aib acelai tip de dat i acesta trebuie s fie comparabile cu tipul de dat al expresiei de testat. S se afieze agenii de vnzri care lucreaz n New York, Atlanta, sau Denver.

S se afieze toate comenzile fute n zilele de joi (Thursday ) ale lunii ianuarie a anului 1990.

S se afieze toate comenzile primite de patru ageni de vnzri precizai. 8

Putem verifica dac o valoare nu coincide cu nici unul dintre elementele unei mulimi, utiliznd operatorul NOT IN. Observaii : Dac expresia de testat are valoarea NULL, rezultatul testului IN este NULL. Expresia de testare poate fi orice expresie SQL valid dar, de obicei, este numele unei coloane. Numai liniile pentru care rezultatul testului IN este TRUE vor fi incluse n rezultatul interogrii. Verificarea portivirii cu un abon Testarea "potrivirii" cu un ablon (LIKE) verific dac datele dintr-o coloan corespund parial cu un ablon (pattern) specificat. ablonul este un ir de caractere care poate include unul sau mai multe caractere "de nlocuire". Caracterele de nlocuire sunt interpretate ntr-o manier special. column_name LIKE pattern Caracterele de nlocuire : Caracterul procent (%) nlocuiee o secven de zero sau mai multe caractere SELECT COMPANY, CREDIT_LIMIT FROM CUSTOMERS WHERE COMPANY LIKE Smith% Corp. ; Cuvntul cheie LIKE i arat SQL-ului s compare coloana COMPANY cu ablonul Smith% Corp. Oricare dintre urmtoarele companii se potrivesc ablonului: Smith Corp., Smithson Corp., Smithsen Corp., Smithsonian Corp.. Nu se potrivesc ablonului companiile SmithCorp i Smithson Inc.. 9

Caracterul de subliniere ( _ ) nlocuiete un singur character.

n acest caz Smithson Corp., Smithsen Corp. i Smithsun Corp. vor corespunde ablonului n timp ce Smithsoon Corp. i Smithsn Corp. nu. Caracterele de nlocuire pot s apar oriunde n ablon i mai multe caractere de nlocuire pot fi scrise ca un singur ir de caractere.

Observaii : Putem determina irurile care nu se portivesc cu un ablon utiliznd forma NOT LIKE n testul de verificare. Testul LIKE poate fi aplicat numai unei coloane cu tipul de dat ir de caractere. Dac valoarea datelor din coloana respectiv este NULL, testul LIKE returneaz NULL. Caracterul Escape Una dintre problemele legate de potrivirea la un ablon este includerea caracterelor de nlocuire ca i constante de tip ir de caractere. Pentru a testa prezena unui character procent (%) ntr-o coloan nu putem s includem pur i simplu caracterul % n ablon deoarece SQL l va trata ca pe un caracter de nlocuire. Pentru a rezolva aceast problem se utilizeaz caracterul escape. Cnd un caracter escape apare ntr-un ablon, caracterul imediat urmtor este tratat mai degrab ca o constant de tip ir de caractere dect ca un caracter de nlocuire. S se afieze produsele ale cror ID-uri ncep cu literele: A%BC.

Testarea valorilor nule (IS NULL) Valoarea NULL determin apariia unei logici cu trei valori de adevr n cazul condiiei de selecie. Pentru orice linie dat, rezultatul evalurii acestei condiii poate fi TRUE,

10

FALSE sau NULL. Uneori este util s verificm explicit dac o anumit coloan conine o valoare NULL. nume_coloan IS NULL S se afieze agenii de vnzri care nu au fost repartizai nc nici unui birou.

Forma negat a testrii valorilor nule, NOT NULL, determin liniile care nu conin o valoare NULL. S se afieze agenii de vnzri care au fost repartizai deja unui birou.

Spre deosebire de condiiile de selecie anterioare, testarea valorii nule nu poate furniza rezultatul NULL. Aceast expresie poate avea fie valoarea TRUE fie valoarea FALSE. Nu putem testa valoarea nul printr-o simpl comparaie, ca cea care urmeaz:

Cuvntul cheie NULL nu poate fi utilizat aici deoarece el nu reprezint cu adevrat o valoare ci semnific faptul c valoarea respectiv este necunoscut. Compunerea condiiilor de selecie (AND, OR, i NOT) 11

Utiliznd operatorii logici, AND, OR i NOT, putem combina condiiile de selecie simple a.. s obinem condiii din ce n ce mai complexe. S se afieze agenii de vnzri care au vnzrile mai mici dect cota sau mai mici de $300.000.

S se afieze agenii de vnzri care au vnzrile mai mici dect cota i mai mici de $300.000.

S se afieze agenii de vnzri care au vnzrile mai mici dect cota dar nu mai mici de $150.000.

12

Utiliznd operatorii logici i parantezele putem obine condiii foarte complexe. S se afieze agenii de vnzri care: a) lucreaz n Denver, New York sau Chicago sau b) nu au manager i sunt angajai dup Iunie 1988 sau c) i-au depit cota dar au vnzri mai mici sau egale cu $600.000.

Tabela de adevr pentru operatorul AND

Tabela de adevr pentru operatorul OR

13

Tabela de adevr pentru operatorul NOT

Precedena operatorilor logici este urmtoarea: NOT, AND, OR. Ordonarea rezultatelor interogrilor (clauza ORDER BY) Ca i liniile dintr-o baz de date, liniile din rezultatul unei interogri nu sunt ordonate dup nici un criteriu. Putem ordona liniile din rezultatul unei interogri prin includerea clauzei ORDER BY n instruciunea SELECT. Clauza ORDER BY const din cuvintele cheie ORDER BY urmate de o list de criterii de ordonare separate prin virgul. S se afieze vnzrile de la fiecare birou, ordonate alfabetic dup regiune i, pentru fiecare regiune n parte, dup ora.

14

Primul criteriu de ordonare (REGION) este cheia principal de sortare; celelalte criterii care urmeaz (CITY n acest caz) sunt numite chei secundare de sortare i sunt luate n considerare cnd dou linii ale rezultatului interogrii au aceeai valoare a cheii principale. Utiliznd clauza ORDER BY putem ordina nregistrrile att cresctor ct i descresctor. Implicit, ordonarea se face cresctor; pentru a ordona nregistrrile descresctor se include cuvntul cheie DESC n specificaiile de ordonare, ca n exemplul urmtor. S se afieze birourile de vnzri n ordinea descresctoare a vnzrilor.

Ordonarea nregistrrilor se poate realiza i dup valoarea unei coloane calculate. n acest caz, trebuie specificat numrul coloanei respective n loc de numele acesteia. S se afieze birourile, ordonate descresctor dup performanele n vnzri.

15

Prin combinarea numelor i a numerelor coloanelor, a ordinii de sortare (ASC, DESC) putem exprima criterii complexe de ordonare a rezultatelor interogrii. S se afieze birourile n ordine alfabetic a regiunii, iar pentru fiecare regiune n ordine descresctoare a performanei.

Interogarea mai multor tabele Cea mai bun cale pentru a nelege facilitile oferite de SQL pentru interogarea mai multor tabele este s pornim cu o interogare simpl, care combin date din dou tabele diferite: S se afieze comenzile, artnd numrul comenzii, valoarea comandat, numele i limita creditului clientului care a fcut comanda. Cele patru informaii solicitate sunt stocate n dou tabele diferite, aa cum se arat n Figura 5.8. Tabela ORDERS conine numrul comenzii i valoarea comandat dar nu conine numele clientului i limita creditului acestuia. Tabela CUSTOMERS conine numele i creditul clientului dar nu conine informaii despre comenzi.

16

Exist totui o legtur ntre cele dou tabele. n fiecare linie din tabela ORDERS, coloana CUST conine numrul clientului care a fcut comanda respectiv, numr care corespunde cu valoarea coloanei CUST_NUM din una dintre liniile tabelei CUSTOMERS. Evident, instruciunea SELECT care efectueaz interogarea trebuie s utilizeze aceast legtur pentru a obine rezultatul interogrii.

Figura 5.8 Interogare care presupune mai multe tabele nainte de a examina instruciunea SELECT pentru aceast interogare, este instructiv s vedem cum am efectua manual interogarea, utiliznd creion i hrtie. Figura 5.9 ne arat cum am proceda: 1. ncepem prin a scrie numele celor patru coloane din rezultatul interogrii. Mergem apoi n tabela ORDERS i pornim cu prima comand. 2. Mergem de-a lungul acestei linii pentru a afla numrul comenzii (112961) precum i valoarea comenzii ($31.500,00) apoi copiem cele dou valori n prima linie a rezultatului. 3. Parcurgem linia pentru a afla numrul clientului care a efectuat comanda (2117), i apoi ne mutm n tabela CUSTOMERS pentru a gsi clientul cu numrul 2117, prin analizarea valorilor coloanei CUST_NUM. 4. Mergem de-a lungul liniei respective din tabela CUSTOMERS pentru a determina numele clientului (J. P. Sinclaire) i limita creditului ($35.000,00) apoi copiem cele dou valori n rezultatul interogrii. 5. Am generat o linie n rezultatul interogrii! Mergem napoi n tabela ORDERS i trecem la urmtoarea linie i repetm paii ncepnd de la 2 pn cnd terminm de parcurs toate comenzile. Observaii:

17

Fiecare linie din rezultatul interogrii i obine datele dintr-o pereche de linii, una din tabela ORDERS i una din tabela CUSTOMERS. Perechea de linii este determinat pe baza coninutului coloanelor corespondente din tabelele respective.

Figura 5.9 Procesarea manual a unei interogri cu mai multe tabele Joinul simplu (Equi-Join) Procesul de formare a perechilor de linii pe baza potrivirii valorii coloanelor corespondente este numit joinul tabelelor. Tabela rezultat (care conine date din ambele tabele) se numete tabela join. Un join bazat pe egalitatea valorilor a dou coloane se numete equi-join. Joinul se poate realiza, de asemenea, pe baza altor tipuri de comparaii ale coloanelor. Joinul este fundamentul procesrii interogrilor care presupun mai multe tabele. Toate datele dintr-o baz de date relaional sunt stocate ca valori ale unor coloane astfel nct toate relaiile posibile dintre tabele pot fi realizate pe baza potrivirii coninutului coloanelor corespondente. S se afieze comenzile, artnd numrul comenzii, valoarea comandat, numele i limita creditului clientului care a fcut comanda.

18

Aceast interogarea arat asemntor cu cele din paragraful anterior dar prezint dou noi caracteristici. Mai nti, clauza FROM specific dou tabele n locul unei singure. n al doilea rnd, condiia de selecie CUST=CUST_num compar valori ale colanelor din dou tabele diferite. Numim cele dou coloane corespondente. Ca orice condiie de selecie, condiia anterioar restricioneaz liniile care vor aprea n rezultat. Deoarece aceasta este o interogare care presupune dou tabele, condiia de selecie limiteaz perechile de linii care vor genera rezultatul. Se vor genera linii n rezultatul interogrii numai pentru perechile de linii pentru care numrul clientului (CUST) din tabela ORDERS este acelai cu numrul clientului (CUST_NUM) din tabela CUSTOMERS. Interogri Printe/Copil Cele mai multe dintre interogrile multi-tabele implic dou tabele ntre care exist o relaionare natural de tip printe/copil. Interogarea anterioar, despre clieni i comenzi, este un exemplu n acest sens. Fiecare comand (copil) are un client asociat (printe) i fiecare client (printe) poate avea mai multe comenzi asociate (copii). Perechile de linii care genereaz rezultatul interogrii sunt combinaii de linii printe/copil. Perechile de linii printe/copil se creeaz pe baza corespondenei dintre cheile strine i cheile primare. Tabela care conine cheia strin este tabela copil n relaia respectiv n timp ce tabela care conine cheia primar este tabela printe. n interogare trebuie specificat condiia de selecie care compar egalitatea dinte cheia strin i cheia primar. Figura 5.10 ne arat o relaie printe /copil referitoare la birouri i ageni de vnzri.

19

Figura 5.10 Relaie printe/copil ntre tabelele OFFICES i SALESREPS S se afieze toi agenii de vnzri, mpreun cu oraul i regiunea n care lucreaz.

n tabela SALESREPS (copil) coloana REP_OFFICE este cheie strin care refer cheia primar OFFICE din tabela OFFICES (printe). Relaia este utilizat pentru a gsi liniile din tabela OFFICES care corespund fiecrei linii din tabela SALESREPS astfel nct s putem include oraul i regiunea n rezultatul interogrii. n continuare este prezentat o alt interogare referitoare la aceste tabele dar n care rolurile printe/copil sunt inversate.

20

S se afieze birourile de vnzri mpreun cu numele i gradul managerului biroului respectiv.

Figura 5.11 Relaie printe/copil ntre tabelele SALESREPS i OFFICES

Tabela OFFICES (copil) conine coloana MGR, cheie strin care refer cheia primar EMPL_NUM din tabela SALESREPS (printe). Aceast relaie este utilizat pentru a determina, pentru fiecare birou, agentul de vnzri care este manager astfel nct numele i gradul acestuia s poat fi inclus n rezultatul interogrii. SQl nu cere, n mod obligatoriu, ca n rezultatul interogrii s fie incluse coloanele dup care se face joinul tabelelor. Adeseori, n practic, acestea sunt omise.

21

Join cu criterii de selecie a liniilor Condiia de selecie care precizeaz corespondena dintre coloane ntr-o interogare multitabele poate fi combinat cu alte condiii de selecie, pentru a restriciona coninutul rezultatului interogrii. S se afieze birourile cu planul de vnzri peste $600.000, mpreun cu numele i gradul managerului respectiv.

Cu ajutorul condiiei de selecie suplimentare, liniile care apar n rezultatul interogrii sunt restricionate. Primul test (MGR=EMPL_NUM) selecteaz numai perechile de linii din OFFICES i SALESREPS care satisfac relaia de tip printe/copil; al doilea test selecteaz numai acele perechi de linii n care planul de vnzri este peste limita impus. Corespondene multiple Tabela ORDERS i tabela PRODUCTS sunt asociate pe baza unei perechi de chei (strin/primar) compozite. Coloanele MFR i PRODUCT din tabela ORDERS reprezint o cheie strin compus, care refer cheia primar MFR_ID, PRODUCT_ID din tabela PRODUCTS. Pentru a realiza joinul tabelelor pe baza relaiei de tip printe/copil, trebuie s specificm corespondenele dintre ambele perechi de coloane. S se afieze comenzile, preciznd valoarea acestora i descrierea produselor comandate.

22

Condiia de selecie din interogare, i spune SQL-ului c perechile de linii corespondente din tabelele ORDERS i PRODUCTS sunt cele pentru care ambele perechi de coloane corespondente conin aceeai valoare. Interogrile care presupun un join multi-coloan sunt mai rar ntlnite n practic dect cele n care joinul se realizeaz pe o singur coloan i se ntlnesc n cazul cheilor strine compuse. Interogri care presupun trei sau mai multe tabele SQL poate combina date din trei sau mai multe tabele utiliznd aceeai tehnic de baz ca i n cazul interogrilor care presupun dou tabele. S se afieze comenzile mai mari de $25.000, incluznd numele agentului de vnzri care a preluat comanda i numele clientului care a efectuat-o.

23

Aceast interogare utilizeaz dou chei strine ale tabelei ORDERS, aa cum se arat n Figura 5.12. Coloana CUST este cheie strin pentru tabela ORDERS care refer cheia primar CUST_NUM din tabela CUSTOMERS i leag fiecare comand de clientul care a efectuat-o. Coloana REP este cheie strin n tabela ORDERS care refer cheia primar EMPL_NUM din tabela SALESREPS i care leag fiecare comand de agentul de vnzare care a primit-o. Altfel spus, interogarea leag fiecare comand de clientul i respectiv agentul de vnzri asociai ei.

Figura 5.12 Join ntre trei tabele n continuare este prezentat un alt exemplu de interogare a trei tabele, dar care presupune un alt tip de aranjament al relaiilor printe/copil. S se afieze comenzile mai mari de $25.000, artnd numele clientului care a efectuat comanda i numele agentului de vnzri asignat clientului respectiv.

24

Figura 5.13 ne arat relaiile dintre tabele corespunztoare acestei interogri. Prima relaie utilizeaz coloana CUST ca i cheie strin n tabela ORDERS care refer cheia primar CUST_NUM din tabela CUSTOMERS. Cea de-a doua relaie utilizeaz coloana CUST_REPR ca i cheie strin n tabela CUSTOMERS care refer cheia primar EMPL_NUM din tabela SALESREPS. Aceast interogare leag fiecare comand de clientul care a efectuat-o i fiecare client de reprezentantul lui vnzri.

Figura 5.13 Join ntre trei tabele, cu relaii printe/copil n cascad n practic nu este neobinuit ca o interogare SQL s presupun join ntrei trei sau patru tabele. S se afieze comenzile mai mari de $25.000, artnd clientul care a efectuat comanda, reprezentantul de vnzri al clientului respectiv, i biroul n care acesta lucreaz.

25

Figura 5.14 ne arat relaiile printe/copil corespunztoare acestei interogri. Evident, este extins joinul din exemplul anterior cu nc un pas, legnd comanda de client, clientul de reprezentantul de vnzri i pe acesta de biroul la care lucreaz.

Figura 5.14 Join ntre patru tabele 26

Alte tipuri de Equi-Join Marea majoritate a interogrilor multi-tabele sunt bazate pe relaii de tip printe/copil dar SQL nu impune coloanelor corespondente s fie legate printr-o relaie de tip cheie strin-cheie primar. Oricre dou coloane din dou tabele pot fi corespondente, dac au tipuri de dat comparabile. Urmtorul exemplu ilustreaz o astfel de interogare, n care coloanele corespondente sunt de tipul dat calendaristic. S se afieze toate comenzile nregistrate n zilele n care a fost angajat un nou agent de vnzri.

Rezultatele acestei interogri provin dintr-o pereche de linii din tabelele ORDERS i SALESREPS, n care ORDER_DATE din ORDERS coincide cu HIRE_DATE din SALESREPS, aa cum se arat n Figura 5.15. Niciuna dintre aceste coloane nu este cheie primar sau cheie strin.

27

Figura 5.15 Join ntre coloane care nu sunt chei strine/ chei primare Corespondena coloanelor n acest caz genereaz o relaie de tipul multi-la-multi ntre dou tabele. Mai multe comenzi pot fi efectuate pe data de angajare a unui agent da vnzri i, reciproc, mai muli ageni de vnzare pot avea data angajrii aceeai cu data n care a fost efectuat o comand. De exemplu, observm c trei comenzi diferite (112968, 112975, i 112979) au fost primite pe data de 12 Octombrie 1989 i dou persoane diferite (Larry Fitch and Mary Jones) au fost angajate n aceast zi. Cele trei comenzi i cele dou persoane produc ase linii n rezultatul interogrii. Aceast relaie multi-la-multi difer de relaia unu-la-multi creat n cazul corespondenei pe baza coloanelor cheie strin/ cheie primar. Situatia poate fi rezumat astfel : Joinul care potrivete chei strine cu chei primare ntotdeauna creaz o relaie unu-lamulti. Joinul pe baza unor coloane oarecare genereaz relaii multi-la-multi. Non-Equi Join Termenul de join se aplic oricrei interogri care combin date din dou tabele pe baza comparrii valorilor unei perechi de coloane din tabelele respective. Dei joinul bazat pe egalitatea dintre coloanele corespondente (equi-join) este, de departe, cel mai utilizat join, SQL permite s efectum join ntre tabele i pe baza altor operatori de comparaie. n continuare este prezentat un exemplu de realizare a joinului pe baza utilizrii operatorului < =. S se afieze toate combinaiile dintre agenii de vnzri i birourile n care cota agenilor este mai mare dect planul de vnzri (target) al biroului.

Ca n orice interogare cu dou tabele, fiecare liniie din rezultat provine dintr-o pereche de linii, n acest caz din tabelele SALESREPS i OFFICES. Condiia de selecie, QUOTA > TARGET, selecteaz perechile de linii din SALESREPS i OFFICES n care coloana QUOTA este mai mare dect coloana TARGET. Observm c nu este obligatoriu ca agentul de vnzri corespunztor liniei din SALESREPS s lucreze n biroul corespunztor liniei din OFFICES. Joinul bazat pe inegalitatea unor coloane nu este prea des ntlnit n practic.

28

Consideraii privind interogrile Multi-Tabele Interogrile multi-tabele prezentate pn acum nu au necesitat vreo sintax SQL special sau alte caracteristici ale limbajului fa de cele descrise pentru interogarea unei singure tabele. Totui, anumite interogri multi-tabele nu pot fi exprimate fr anumite caracteristici suplimentare ale limbajului, cum sunt : Calificarea numelor coloanelor este necesar ntr-o interogare multi-tabele pentru a elimina ambiguitile legate de numele coloanelor. Selecia tuturor coloanelor (*) poate avea un neles diferit n cazul interogrilor multi-tabele. Self-joinul poate fi utilizat pentru a exprima o interogare multi-tabel care relaioneaz o tabel cu ea nsi. Aliasurile tabelelor pot fi utilizate n clauza FROM pentru a simplifica calificarea numelor coloanelor i a permite referirea neambigu la numele unor coloane n cazul self-joinului. Calificarea numelor coloanelor Baza de date folosit ca exemplu include cteva exemple de tabele care conin coloane cu acelai nume. Tabelele OFFICES i SALESREPS au fiecare cte o coloan numit SALES. Binenels c nu exist nici o confuzie ntre cele dou coloane deoare clauza FROM prezizeaz despre care dintre coloane este vorba. S se afieze oraele n care vnzrile au depit planul.

S se afieze agenii cu vnzri de peste $350.000.

S se afieze numele, vnzrile i biroul la care lucreaz fiecare agent de vnzri.

29

n aceast interogare, existena numelor duplicat cauzeaz o problem. Dei descrierea interogrii presupune c dorim coloana SALES din tabela SALESREPS, interogarea SQL formulat anterior este ambigu. SGBD-ul nu are cum s tie pe care dintre coloanele SALES o dorim deoarece ambele tabele, SALESREPS i OFFICES, contribuie la obinerea rezultatului. Pentru a elimina aceast ambiguitate, trebuie s calificm numele coloanelor pentru a le identifica. Calificarea numelui unei coloane presupune precizarea numelui tabelei din care face parte coloana respectiv. nume_tabel.nume_coloan Astfel, numele calificate ale celor dou coloane SALES din exemplul anterior sunt SALESREPS.SALES i OFFICES.SALES. Un nume calificat poate fi utilizat ntr-o interogare SQL oriunde se poate utiliza un nume de coloan. Tabela specificat n numele calificat al unei coloane trebuie s coincid cu una dintre tabelele specificate n clauza FROM. n continuare este prezentat formularea corect a interogrii din exemplul anterior: S se afieze numele, vnzrile i biroul la care lucreaz fiecare agent de vnzri.

Utilizarea numelor calificate de coloane ntr-o interogare multi-tabele este ntotdeauna o idee bun. Dezavantajul const n faptul c trebuie s scriem texte mai lungi. Selecia tuturor coloanelor Aa cum am vzut ntr-un paragraf anterior, clauza * din instruciunea SELECT poate fi utilizat pentru a selecta toate coloanele din tabela specificat n clauza FROM. ntr-o interogare multi-tabele asteriscul , *, selecteaz toate coloanele din toate tabelele specificate n clauza FROM. De exemplu, interogarea urmtoare va produce cincisprezece coloane n rezultat nou coloane din tabela SALESREPS i ase coloane din tabela OFFICES.

30

S se afieze toate informaiile despre agenii de vnzri i birourile la care acetia lucreaz.

Bineneles c o clauz SELECT * ntr-o interogare multi-tabel apare mult mai rar n practic dect n cazul interogrilor care implic o singur tabel. Multe dintre dialectele SQL trateaz asteriscul ca pe un tip special de caracter de nlocuire a numelor coloanelor, care va fi nlocuit cu o list cuprinznd toate numele coloanelor. n aceste dialecte, asteriscul poate fi calificat cu numele unei tabele, la fel cum este calificat numele unei coloane. n urmtorul exemplu, lista de selecie SELECT * va fi nlocuit printr-o list cuprinznd toate coloanele din tabela SALESREPS. S se afieze toate informaiile despre agenii de vnzri i locurile n care acetia lucreaz.

Interogarea va produce unsprezece coloane n rezultat cele nou coloane ale tabelei SALESREPS urmate de cele dou coloane din tabela OFFICES, precizate explicit. Self-Joinul Unele interogri multi-tabele presupun relaionarea unei tabele cu ea nsi. De exemplu, presupunem c dorim s afism numele fiecrui agent de vnzri i al managerului acestuia. Fiecare agent de vnzri apare ca o linie n tabela SALESREPS iar coloana MANAGER conine numrul angajatului care este managerul su. n concluzie, coloana MANAGER este cheie strin ctre tabela care conine informaiile despre manageri. De fapt, este cheie stin ctre nsi tabela SALESREPS. Dac ncercm s exprimm aceast interogare ca pe o interogare obinuit care implic o coresponden cheie strin/cheie primar, ar arta astfel:

Aceast instruciune SELECT este ilegal deoarece exist o referin duplicat la tabela SALESREPS n clauza FROM. Putem ncerca s eliminm a doua referin la tabela SALESREPS:

31

Aceast interogare este legal dar nu face ceea ce am dori s fac. Este o interogare cu o singur tabel deci SQL parcurge tabela linie cu linie aplicnd condiia de selecie : Liniile care satisfac condiia sunt acelea n care cele dou coloane au aceeai valoare, adic acele linii n care agentul de vnzri este propriul su manager. Deoarece nu exist astfel de nregistrri, interogarea nu va produce nici un rezultat. Pentru a nelege cum rezolv SQL problema, ne imaginm c avem dou copii identice ale tabelei SALESREPS, una numit EMPS, coninnd angajatii, i una numit MGRS, coninnd managerii, aa cum se arat n Figura 5.16. Coloana MANAGER din tabela EMPS poate atunci s fie cheie strin ctre tabela MGRS i urmtoarea interogare va funciona : S se afieze numele agenilor de vnzri i al managerilor acestora.

Figura 5.16 Self join referitor la tabela SALESREPS

32

Deoarece coloanele din cele dou tabele au nume identice toate numele coloanelor trebuie calificate. Arat ca o interogare multi-tabele obinuit. SQL utilizeaz o tabel imaginar duplicat pentru a realiza joinul unei tabele cu ea nsi. n loc s duplicheze coninutul tabelei, SQL ne permite s ne referim pur i simplu la tabel prin alt nume, numit alias-ul tabelei. n continuare este prezentat interogarea anterioar utiliznd aliasurile EMPS i MGRS pentru tabela SALESREPS. S se afieze numele agenilor de vnzri i al managerilor acestora.

Clauza FROM asociaz cte un alias diferit fiecreia dintre cele dou copii ale tabelei SALESREPS care sunt implicate n interogare, prin specificarea numelui aliasului imediat dup numele tabelei. Ca i n exemplele anterioare, cnd o clauz FROM conine aliasul unei tabele, aliasul trebuie utilizat pentru a califica numele coloanelor. Nu este neaprat necesar s utilizm aliasuri pentru ambele apariii ale tabelei respective n interogare. Aceast interogare poate fi scris i astfel:

n acest caz, aliasul MGRS este atribuit unei copii a tabelei n timp ce numele tabelei iniiale este utilizat pentru cealalt copie. n continuare sunt prezentate alte exemple de self-join. S se afieze agenii de vnzri care au cota mai mare dect a managerului lor.

33

S se afieze agenii de vnzri care nu lucreaz n acelai birou cu managerul lor, preciznd numele i biroul n care lucreaz fiecare dintre acetia.

Aliasurile tabelelor Aa cum am artat n paragraful precedent, aliasurile tabelelor sunt obligatorii n cazul interogrilor care presupun self-join. Totui, putem utiliza un alias n orice interogare. De exemplu, dac o interogare utilizeaz o tabel a altui utilizator sau numele tabelei este foarte lung, este greu de scris numele acesteia pentru a califica numele inei coloane. Considerm urmtoarea interogare, care se refer la tabela BIRTHDAYS care aparine utilizatorului SAM : S se afieze numele, cota i zilelele de natere ale agenilor de vnzri.

34

Aceast interogare devine mai simplu de scris dac se utilizeaz aliasuri pentru cele dou tabele :

35