CE ESTE LIMBAJUL SQL? SQL reprezint abrevierea de la Structured Query Language (Limbaj Structurat de Interogare), un limbaj conceput n mod specific pentru comunicarea cu bazele de date. Avantajele limbajului SQL: Majoritatea SGBD-urilor importante accept limbajul SQL. SQL este un limbaj uor de nvat. Instruciunile lui sunt relativ puine i alctuite din cuvinte descriptive n pofida aparentei simpliti, SQL este un limbaj puternic cu ajutorul cruia se pot efectua operaii complexe i sofisticate asupra bazelor de date.
PROIECTAREA UNUI SISTEM DE GESTIUNE DE INTRRI AL COMENZILOR Pentru a pune n eviden calitile limbajului SQL am pornit la implementarea unui sistem de gestiune de intrri al comenzilor pentru un productor i distribuitor autohton de echipamente i accesorii din domeniul reelelor de calculatoare. Vom pleca de la un caz concret, Tornado Sistems a prezentat la CeBIT 2003 propria linie de echipamente active i pasive de reea, sub marca QUBS. Obiectivul principal l-a constituit dezvoltarea reelei de distribuie prin atacarea unor noi piee europene. Astfel, produsele marca QUBS vor fi comercializate prin parteneri din: Germania, Ungaria, Bulgaria i Croaia (vezi nregistrrile din tabelul Vanzatori). Gama de produse QUBS include printre altele cabinete metalice de 19 (floor standing i wall mount), elemente pasive (patch-panel-uri, patch-cord-uri, cablu de cupru UTP i FTP, prize, conectoare), scule (clete sertizat conectori, punch down tool, universal stripper), dispozitive de test (LAN Tester RJ45, RJ11, RJ 12) i elemente active (plci de reea, switch-uri cu/fr management, echipamente wireless) ; vezi nregistrrile din tabelul Produse. Am luat n calcul ipoteza n care Tornado Sistems furnizez gama de produse QUBS lanului de magazine Flamingo Computers. Dup cum se cunoate Flamingo are cel mai extins lan de retail IT din Romnia, avnd de asemenea subsidiare n Bulgaria, Croatia, Olanda, Ungaria, Macedonia, Moldova, Serbia i Muntenegru (vezi nregistrrile din tabelul Cumparatori).
Scrierea instruciunilor SQL necesit o bun nelegere a felului n care a fost proiectat baza de date. Fr s tii ce informaii sunt stocate n fiecare tabel, cum sunt asociate tabelele ntre ele i care este divizarea real a datelor ntr-o linie, este imposibil s scriei un cod eficient n limbaj SQL. Dup cum am mai precizat tabelele folosite n lucrare fac parte dintr- un sistem de intrri al comenzilor folosit de un distribuitor al unei linii de echipamente active i pasive de reea reunite sub marca QUBS. Trebuie menionat totui faptul c sunt de fapt nite tabele mostre cu nregistrri fictive i nu au nici o legtur cu sistemul de gestiune real deinut de ctre firma Tornado Sistems.
Tabele sunt folosite pentru urmtoarele sarcini: Gestionarea vnztorilor. Gestionarea cataloagelor de produse. Gestionarea listelor de cumprtori. Introducerea comenzilor cumprtorilor.
Pentru ca toate acestea s funcioneze sunt necesare 5 tabele: Vanzatori, Produse, Cumparatori, Comenzi respectiv ComenziArticole. Tabelele sunt strns interconectate, ca parte din proiectul unei baze de date relaionale. 1 n continuare vom prezenta cele 5 tabele cu numele coloanelor componente i descrierile lor. Tabelul Vanzatori stocheaz vnztorii ale cror produse sunt desfcute. Fiecare vnztor are cte o nregistrare n acest tabel, iar coloana identificatorului vnztorului (vanz_id) este pentru stabilirea corespondenei ntre produse i vnztori. Tabelul 1 Coloanele tabelului Vanzatori Coloana Descriere Vanz_id Identificatorul unic al vnztorului. vanz_nume Numele vnztorului. Vanz_adresa Adresa vnztorului. Vanz_oras Oraul vnztorului. Vanz_cod Codul potal al vnztorului. Vanz_tara ara vnztorului. Tabelul Produse conine catalogul de produse, cte un produs pe fiecare linie. Fiecare produs are un identificator unic, coloana (prod_id), i este asociat vnztorului su prin (vanz_id) identificatorul unic al vnztorului. Tabelul 2 Coloanele tabelului Produse Coloana Descriere prod_id Identificatorul unic al produsului. Vanz_id Identificatorul unic al vnztorului produsului (asociat cu vanz _id din tabelul Vanzatori). prod_nume Numele produsului. prod_pret Preul produsului. prod_desc Descrierea produsului. Tabelul Cumparatori stocheaz toate informaiile legate de cumprtori. Fiecare cumprtor are un identificator unic reprezentat de coloana (cump_id). Tabelul 3 Coloanele tabelului Cumparatori Coloana Descriere cump_id Identificatorul unic al cumprtorului. cump_nume Numele cumprtorului. cump_adresa Adresa cumprtorului. cump_oras Oraul cumprtorului. cump_cod Codul potal al cumprtorului. cump_tara ara cumprtorului. cump_contact Numele persoanei de contact. cump_email Adresa e-mail a cumprtorului. Tabelul Comenzi stocheaz comenzile cumprtorilor (dar nu i detaliile comenzilor). Fiecare comand are un numr unic coloana (comanda_nr). Comenzile sunt asociate cumprtorilor corespunztori prin intermediul coloanei (cump_id) care este asociat cu identificatorul unic al cumprtorului din tabelul Cumparatori. Tabelul 4 Coloanele tabelului Comenzi Coloana Descriere comanda_nr Numrul unic al comenzii comanda_data Data comenzii. cump_id Identificatorul unic al cumprtorului care a emis comanda (asociat cu c cump_id din tabelul Cumparatori) 2 Tabelul ComenziArticole stocheaz articolele din fiecare comand - cte o linie pentru un articol dintr-o comand. Pentru fiecare linie din tabelul Comenzi exist una sau mai multe linii n tabelul ComenziArticole. Fiecare articol dintr-o comand este identificat n mod unic prin numrul comenzii plus ordinea articolului (primul articol din comand, al doilea articol din comand, etc.) Articolele sunt asociate cu comenzile corespunztoare prin intermediul coIoanei comanda_nr (care este asociat cu identificatorul unic al comenzii din tabelul Comenzi). n plus, fiecare articol dintr-o comand conine identificatorul de produs al comenzilor (care asociaz articolul cu tabelul Produse).
Tabelul 5 Coloanele tabelului ComenziArticole
Coloana Descriere comanda_nr Numrul comenzii (asociat cu comanda_nr din tabelul Comenzi) comanda_articol Numrul articolului din comand (secvenial ntr-o comand). prod_id Identificatorul produsului (asociat cu prod_id din tabelul Produse) cantitate Cantitatea de articole. articol_pret Preul articolului.
Asignarea cheilor primare Fiecare linie dintr-un tabel trebuie s aib o coloan (sau o serie de coloane) care o identific n mod unic. Tabelul Cumparatori poate folosi n acest scop coloana cu identificatorii cumprtorilor (cump_id), iar tabelul ComenziArticole poate folosi identificatorii comenzilor (comanda_nr) ct i numrul articolului din comand (comanda_articol). Fiecare comand din tabelul Comenzi are un numr unic coloana (comanda_nr) i fiecare produs din tabelul Produse are un identificator unic, coloana (prod_id). Fiecare vnztor are cte o nregistrare n tabelul Vanzatori, iar coloana identificatorului vnztorului (vanz_id) este pentru stabilirea corespondenei ntre produse i vnztori.
------------------------------------ -- Definire chei primare ------------------------------------ ALTER TABLE Cumparatori ADD PRIMARY KEY (cump_id); ALTER TABLE ComenziArticole ADD PRIMARY KEY (comanda_nr, comanda_articol); ALTER TABLE Comenzi ADD PRIMARY KEY (comanda_nr); ALTER TABLE Produse ADD PRIMARY KEY (prod_id); ALTER TABLE Vanzatori ADD PRIMARY KEY (vanz_id);
Chei externe O cheie extern este o coloan dintr-un tabel ale crei valori trebuie declarate ntr-o cheie primar n alt tabel. Cheile externe reprezint o parte foarte important din asigurarea integritii refereniale. De exemplu tabelul Comenzi conine cte o singur linie pentru fiecare comand introdus n sistem. Informaiile despre cumprtori sunt stocate n tabelul Cumparatori. Comenzile din tabelul Comenzi sunt legate de linii specifice din tabelul Cumparatori, prin identificatorul cumprtorului. Identificatorul cumprtorului este cheia primar n tabelul Cumparatori; fiecare cumprtor are un identificator unic. Numrul comenzii este cheia primar n tabelul Comenzi; fiecare comand are un numr unic. Valorile din coloana identificatorului cumprtorului din tabelul Comenzi nu sunt neaprat unice. Dac un cumprtor are mai multe comenzi, ele vor ocupa mai multe linii cu acelai identificator de cumprtor (dei fiecare va avea alt numr de comand). n acelai timp, singurele valori valide n coloana identificatorului cumprtorului din tabelul Comenzi sunt identificatoarele cumprtorilor din tabelul Cumparatori. Acesta este rolul cheii externe. n exemplul nostru, o cheie extern este definit pe coloana identificatorului cumprtorului n tabelul Comenzi, astfel nct coloana poate accepta doar valori care exist n cheia primar a tabelului Cumparatori. 3 Iat o modalitate de a defini aceast cheie extern: ------------------------------------------------- -- Creare tabel Comenzi si definire cheie externa ------------------------------------------------- CREATE TABLE Comenzi ( comanda_nr INTEGER NOT NULL PRIMARY KEY, comanda_data DATETIME NOT NULL, cump_id CHAR(10) NOT NULL REFERENCES Cumparatori(cump_id) );
n cazul acesta, definiia tabelului folosete cuvntul cheie REFERENCES pentru a declara c orice valori din coloana coloana cump_id trebuie s fie n coloana cump_id din tabelul Cumparatori. Acelai lucru se poate obine folosind sintaxa CONSTRAINT ntr-o instruciune ALTER TABLE:
ALTER TABLE Cumparatori CONSTRAINT FOREIGN KEY (cump_id) REFERENCES Cumparatori (cump_id)
Observaie: Cheile externe pot preveni tergerile accidentale ale nregistrrilor din tabele. Dup ce o cheie extern este definit, sistemul de gestionare a bazei de date nu permite tergerea de linii care au linii asociate n alte tabele. De exemplu, nu vi se permite s tergei un cumprtor care are asociate comenzi. Singura modalitate prin care putei terge cumprtorul respectiv este s tergei mai nti comenzile asociate (ceea ce nseamn tergerea articolelor asociate comenzii). ntruct necesit o asemenea tergere metodic, cheile externe pot preveni tergerea accidental a datelor.
Observaie: Unele SGBD-uri accept totui o caracteristic numit tergere n cascad. Dac este activat, aceast caracteristic terge toate datele asociate, atunci cnd o linie este tears dintr-un tabel. De exemplu, dac este este activat tergerea n cascad i un cumprtor este ters din tabelul Cumparatori, orice rnduri din comenzile asociate sunt terse automat.
REGSIREA DATELOR INSTRUCIUNEA SELECT Instruciunile SQL sunt compuse din termeni simpli. Aceti termeni se numesc cuvinte cheie i fiecare instruciune SQL este format din unul sau mai multe cuvinte cheie. Instruciunea SQL pe care o vei utiliza probabil cel mai frecvent este SELECT. Instruciunea SELECT are scopul de regsi informaii din unul sau mai multe tabele. S ncercm s definim noiunea de cuvnt cheie. Cuvnt cheie - cuvnt rezervat care face parte din limbajul SQL. Ca observaie, atunci cnd creai un tabel NU denumii niciodat un tabel sau coloan folosind un cuvnt cheie. Cnd folosii instruciunea SELECT pentru a regsi date dintr-un tabel, trebuie s precizai minimum dou informaii: 1. ce date dorii s regsii? i 2. de unde dorii s le regsii? Este important de reinut c SQL este un limbaj nu o aplicaie. Modul n care specificai instruciunile SQL i afiarea rezultatelor acestora variaz de la o aplicaie la alta. 4 Instruciunile SQL multiple trebuie separate prin punct i virgul ( ; ). Cele mai multe SGBD-uri nu cer folosirea caracterului punct i virgul dup instruciunile unice, n schimb sistemul MySQL nu se conformeaz majoritii sistemelor de gestiune a bazelor de date relaionale i solicit n mod expres utilizarea caracterului punct i virgul ( ; ). Este foarte important de reinut faptul c instruciunile SQL nu sunt case sensitive (sensibile la context) astfel SELECT este totuna cu select sau Select. Majoritatea programatorilor n limbajul SQL apreciaz c folosirea caracterelor MAJUSCULE pentru cuvintele cheie (instruciuni i clauze) din SQL i folosirea caracterelor minuscule pentru numele coloanelor i tabelelor uureaz citirea i depanarea codului. Toate spaiile dintr-o instruciune SQL sunt ignorate la executarea instruciunii. Instruciunile SQLpot fi specificate pe un singur rnd sau pot fi divizate pe mai multe rnduri. Majoritatea programatorilor n limbajul SQL apreciaz c divizarea instruciunilor pe maimulte rnduri uureaz citirea i depanarea codului.
Regsirea coloanelor individuale Vom ncepe cu urmtoare instruciune SELECT simpl pentru regsirea coloanelor individuale:
Observaie: Dac v apare un mesaj de genul:[servernume_server]ERROR1046:No database selected nseamn c nu ai deschis baza de date i prin urmare folosii comanda USE nume_baza unde nume_baza reprezint numele bazei de date corespunztoare tabelului Produse.
Regsirea mai multor coloane Urmtoarea instruciune SELECT regsete trei coloane din tabelul Produse:
SELECT prod_id, prod_nume, prod_pret FROM Produse;
+------------+-----------------------------------+-----------+ | prod_id | prod_nume | prod_pret | +------------+-----------------------------------+-----------+ | QPPPF24UTP | Patch Panel 24 porturi UTP | 199.49 | | QPPPF48UTP | Patch Panel 48 porturi UTP | 274.99 | | QPPPF24FTP | Patch Panel 24 porturi FTP | 199.49 | | EA7UWMSL | Cabinet metalic 7U Wall Mount 19" | 319.99 | | QPPI01N | Priza simpla ingropata neecranata | 18.49 | | QPPI02N | Priza dubla ingropata neecranata | 18.49 | | QPTCLS8P6P | Cleste sertizat | 199.49 | | QPTPDBODY | Punch down tool | 111.99 | | QPTTSCRJ45 | LAN Tester | 79.49 | +------------+-----------------------------------+-----------+ 5 Regsirea tuturor coloanelor Pe lng faptul c pot preciza coloanele dorite (una sau mai multe), instruciunile SELECT pot de asemenea cere toate coloanele, fr a le enumera individual. Pentru aceasta se folosete caracterul asterisc (*) :
SORTAREA DATELOR Pentru a sorta n mod explicit datele regsite folosind o instruciune SELECT se folosete clauza ORDER BY. Aceast clauz sortez rezultatul dup numele uneia sau mai multor coloane:
6 Sortarea dup poziia coloanei Pe lng faptul c se poate specifica ordinea sortrii folosind numele coloanelor, clauza ORDER BY accept i ordonarea specificat prin poziia relativ a coloanelor. SELECT prod_id, prod_pret, prod_nume FROM Produse ORDER BY 2, 3; +------------+-----------+-----------------------------------+ | prod_id | prod_pret | prod_nume | +------------+-----------+-----------------------------------+ | QPPI02N | 18.49 | Priza dubla ingropata neecranata | | QPPI01N | 18.49 | Priza simpla ingropata neecranata | | QPTTSCRJ45 | 79.49 | LAN Tester | | QPTPDBODY | 111.99 | Punch down tool | | QPTCLS8P6P | 199.49 | Cleste sertizat | | QPPPF24FTP | 199.49 | Patch Panel 24 porturi FTP | | QPPPF24UTP | 199.49 | Patch Panel 24 porturi UTP | | QPPPF48UTP | 274.99 | Patch Panel 48 porturi UTP | | EA7UWMSL | 319.99 | Cabinet metalic 7U Wall Mount 19" | +------------+-----------+-----------------------------------+
Specificarea direciei de sortare Urmtorul exemplu sortez produsele dup pre n ordine descendent: SELECT prod_id, prod_pret, prod_nume FROM Produse ORDER BY prod_pret DESC; +------------+-----------+-----------------------------------+ | prod_id | prod_pret | prod_nume | +------------+-----------+-----------------------------------+ | EA7UWMSL | 319.99 | Cabinet metalic 7U Wall Mount 19" | | QPPPF48UTP | 274.99 | Patch Panel 48 porturi UTP | | QPPPF24UTP | 199.49 | Patch Panel 24 porturi UTP | | QPPPF24FTP | 199.49 | Patch Panel 24 porturi FTP | | QPTCLS8P6P | 199.49 | Cleste sertizat | | QPTPDBODY | 111.99 | Punch down tool | | QPTTSCRJ45 | 79.49 | LAN Tester | | QPPI01N | 18.49 | Priza simpla ingropata neecranata | | QPPI02N | 18.49 | Priza dubla ingropata neecranata | +------------+-----------+-----------------------------------+ Dar dac dorii s sortai dup mai multe coloane? Urmtorul exemplu sorteaz produsele n ordine descendent dup pre, apoi dup nume: SELECT prod_id, prod_pret, prod_nume FROM Produse ORDER BY prod_pret DESC, prod_nume; +------------+-----------+-----------------------------------+ | prod_id | prod_pret | prod_nume | +------------+-----------+-----------------------------------+ | EA7UWMSL | 319.99 | Cabinet metalic 7U Wall Mount 19" | | QPPPF48UTP | 274.99 | Patch Panel 48 porturi UTP | | QPTCLS8P6P | 199.49 | Cleste sertizat | | QPPPF24FTP | 199.49 | Patch Panel 24 porturi FTP | | QPPPF24UTP | 199.49 | Patch Panel 24 porturi UTP | | QPTPDBODY | 111.99 | Punch down tool | | QPTTSCRJ45 | 79.49 | LAN Tester | | QPPI02N | 18.49 | Priza dubla ingropata neecranata | | QPPI01N | 18.49 | Priza simpla ingropata neecranata | +------------+-----------+-----------------------------------+ 7 Observaie: Cuvntul cheie DESC se aplic doar numelui de coloan care l precede direct. n exemplul anterior DESC a fist specificat pentru coloana prod_pret, dar nu i pentru coloana prod_nume. Prin urmare, coloana prod_pret este sortat n ordine descendent iar coloana prod_nume (din cadrul fiecrui pre) continu s fie sortat n mod implicit n ordine ascendent. DESC reprezint prescurtarea de la DESCENDING. Opusul lui DESC este ASC (sau ASCENDING).
FILTRAREA DATELOR De obicei, tabelele de date conin volume mari de date i rareori trebuie s regsii toate nregistrrile dintr-un tabel. Frecvent, vei dori s extragei din datele tabelului numai un subset de care avei nevoie pentru operaii sau rapoarte specifice. Regsirea numai a datelor dorite implic specificarea crite iilor de cutare, cunoscut i drept condiie de filtrare. r
Utilizarea clauzei WHERE ntr-o instruciune SELECT, datele sunt filtrate prin specificarea criteriilor de cutare n clauza WHERE.
SELECT prod_nume, prod_pret FROM produse WHERE prod_pret = 199.49;
Operatorii clauzei WHERE Prima clauz WHERE pe care am examinat-o testa egalitatea determina dac o coloan conine o valoare specificat. Limbajul SQL accept mai muli operatori condiionali, enumarai n tabelul urmtor:
Tabelul 6 Operatorii clauzei WHERE
Operator Descriere = Egalitate <> Non-egalitate, diferit != Non-egalitate, diferit < Mai mic dect <= Mai mic sau egal cu !< Nu mai mic dect > Mai mare dect <= Mai mare sau egal cu !> Nu mai mare dect BETWEEN ntre dou valori specificate IS NULL Este o valoare NULL
8 Testarea cu o singur valoare Exemplul urmtor returneaz toate produsele care cost mai puin de 200 RON.
SELECT prod_nume, prod_pret FROM produse WHERE prod_pret < 200;
Testarea pentru non-corespondene Urmtorul exemplu enumer toate articolele care nu aparin vnztorului din Bulgaria, TORBUL01: SELECT vanz_id, prod_nume FROM Produse WHERE vanz_id <> 'TORBUL01';
Testarea pentru un domeniu de valori Pentru a cuta ntr-un domeniu de valori, putei folosi operatorul BETWEEN. Sintaxa lui difer de a altor operatori ai clauzei WHERE, deoarece necesit dou valori: nceputul I sfritul domeniului de testare.
SELECT prod_nume, prod_pret FROM Produse WHERE prod_pret BETWEEN 20 AND 300;
9 Testarea pentru nici o valoare Proiectantul bazei de date poate s specifice dac n coloanele individuale ale unui tabel pot s nu existe valori. SELECT cump_nume FROM Cumparatori WHERE cump_email IS NULL; +----------------------------+ | cump_nume | +----------------------------+ | Flamingo Computers Moldova | +----------------------------+
FILTRAREA AVANSAT A DATELOR COMBINAREA CLAUZELOR WHERE Toate clauzele WHERE prezentate anterior filtreaz datele utiliznd un singur criteriu. Pentru un grad superior al filtrrii, limbajul SQL v permite s specificai mai multe clauze WHERE. Acestea pot fi folosite n dou modaliti: sub form de clauze AND sau clauze OR.
Operatorul AND Pentru a filtra dup mai multe coloane, folosii operatorul AND ca s adugai condiii clauzei WHERE.
SELECT prod_id, prod_pret, prod_nume FROM Produse WHERE vanz_id = 'TORBUL01' AND prod_pret <= 20;
Operatorul OR Operatorul OR este exact opusul operatorului AND. El instruiete SGBD-ul s returneze liniile ce corespund oricreia dintre condiii. De fapt, cele mai multe SGBD-uri nici mcar nu vor evalua a doua condiie dintr-o clauz OR din WHERE, dac prima condiie a fost deja ndeplinit. Dac prima condiie a fost ndeplinit, linia va fi regsit, indiferent care ar fi fost a doua condiie.
SELECT prod_nume, prod_pret FROM Produse WHERE vanz_id = 'TORBUL01' OR vanz_id = 'TORCRO01';
+-----------------------------------+-----------+ | prod_nume | prod_pret | +-----------------------------------+-----------+ | Cabinet metalic 7U Wall Mount 19" | 319.99 | | Priza simpla ingropata neecranata | 18.49 | | Priza dubla ingropata neecranata | 18.49 | | Cleste sertizat | 199.49 | | Punch down tool | 111.99 | | LAN Tester | 79.49 | +-----------------------------------+-----------+ Instruciunea SQL anterioar regsete numele i preul produsului pentru toate produsele deinute de oricare dintre cei doi vnztori specificai.
10 ORDINEA DE EVALUARE Clauzele WHERE pot conine orict de muli operatori AND i OR. Combinarea celor dou tipuri de operatori v permite s efectuai filtrri sofisticate i complexe. Totui combinarea operatorilor AND i OR ridic o problem. Pentru a demonstra acest lucru, vom studia urmtorul exemplu: s considerm c avei nevoie de lista tuturor produselor care cost minimum 100 RON deinute de vnztorii TORBUL01 i TORCRO01.
SELECT prod_nume, prod_pret FROM Produse WHERE vanz_id = 'TORBUL01' OR vanz_id = 'TORCRO01' AND prod_pret >=100; +-----------------------------------+-----------+ | prod_nume | prod_pret | +-----------------------------------+-----------+ | Cabinet metalic 7U Wall Mount 19" | 319.99 | | Priza simpla ingropata neecranata | 18.49 | | Priza dubla ingropata neecranata | 18.49 | | Cleste sertizat | 199.49 | | Punch down tool | 111.99 | +-----------------------------------+-----------+ Analiznd rezultatul anterior se observ faptul c dou dintre liniile returnate au preuri mai mici de 100 RON, aadar este limpede c ele n-au fost filtrate aa cum se dorea. Oare de ce s-a ntmplat asta? Rspunsul l constituie ordinea de evaluare SQL prelucreaz operatorii AND naintea operatorilor OR. Atunci cnd vede clauza WHERE de mai sus, limbajul SQl o interpreteaz astfel: toate produsele care cost 100 RON sau mai mult, deinute de vnztorul TORCRO01 i toate produsele deinute de vnztorul TORBUL01 indiferent de pre. Soluia la aceast problem este folosirea parantezelor, pentru a grupa n mod explicit operatorii asociai grupurilor.
SELECT prod_nume, prod_pret FROM Produse WHERE (vanz_id = 'TORBUL01' OR vanz_id = 'TORCRO01') AND prod_pret >=100; +-----------------------------------+-----------+ | prod_nume | prod_pret | +-----------------------------------+-----------+ | Cabinet metalic 7U Wall Mount 19" | 319.99 | | Cleste sertizat | 199.49 | | Punch down tool | 111.99 | +-----------------------------------+-----------+
Operatorul IN Operatorul IN se folosete pentru a specifica un domeniu de condiii, oricare dintre ele putnd fi ndeplinite. IN necesit o list de valori valide, care s fie separate prin virgule i cuprinse ntre paranteze. SELECT prod_nume, prod_pret FROM Produse WHERE vanz_id IN ('TORBUL01','TORCRO01') ORDER BY prod_nume; +-----------------------------------+-----------+ | prod_nume | prod_pret | +-----------------------------------+-----------+ | Cabinet metalic 7U Wall Mount 19" | 319.99 | | Cleste sertizat | 199.49 | | LAN Tester | 79.49 | | Priza dubla ingropata neecranata | 18.49 | | Priza simpla ingropata neecranata | 18.49 | | Punch down tool | 111.99 | +-----------------------------------+-----------+ 11 Folosirea operatorului NOT Operatorul NOT al clauzei WHERE are o singur funcie neag orice condiie care l urmez. Deoarece NOT nu este niciodat utilizat n sine (ntotdeauna se folosete n asociaie cu alt operator), sintaxa lui difer de toi ceilali operatori.
SELECT prod_nume, prod_pret FROM Produse WHERE NOT (vanz_id = 'TORBUL01') ORDER BY prod_nume;
+----------------------------+-----------+ | prod_nume | prod_pret | +----------------------------+-----------+ | LAN Tester | 79.49 | | Patch Panel 24 porturi FTP | 199.49 | | Patch Panel 24 porturi UTP | 199.49 | | Patch Panel 48 porturi UTP | 274.99 | | Punch down tool | 111.99 | +----------------------------+-----------+ Exemplul anterior putea fi de asemenea obinut prin folosirea operatorului <>, aa cum se prezint n exemplul urmtor:
SELECT prod_nume, prod_pret FROM Produse WHERE vanz_id <> 'TORBUL01' ORDER BY prod_nume;
FOLOSIREA FILTRRII CU CARACTERE DE NLOCUIRE Operatorul LIKE Toi operatorii pe care i-ai utilizat pn acum filtreaz datele bazndu-se pe valori cunoscute. Indiferent dac ei caut corespondena uneia sau mai multor valori, dac sunt n cutarea unor valori mai mari sau mai mici dect altele cunoscute, sau dac verific un domeniu de valori, numitorul lor comun este faptul c se cunosc valorile folosite n filtrare. Filtrarea datelor n acest mod nu este ns posibil ntotdeauna. De exemplu, cum putei s cutai toate produsele ce conin n numele lor textul patch panel? Acest lucru nu se poate realiza cu operatorii simpli de comparare, ci doar cu caracterele de nlocuire. Folosind caracterele de nlocuire, putei crea modele de cutare ce pot fi comparate cu datele existente.
Caracterul de nlocuire procentaj (%) Caracterul de nlocuire cel mai frecvent utilizat este procentajul %. ntr-un ir de cutare, % nseamn corespunde cu oricte apariii ale oricrui caracter. De exemplu, pentru a gsi toate produsele care ncep cu cuvntul priza, putei folosi urmtoarea instruciune SELECT:
SELECT prod_id, prod_nume FROM Produse WHERE prod_nume LIKE 'Priza%';
Caracterul de nlocuire liniu de subliniere ( _ ) Un alt caracter de nlocuire util este liniua de subliniere (_). El este utilizat la fel ca i % dar nu asigur corespondena mai multor caractere, ci numai a unuia singur. SELECT prod_id, prod_nume FROM Produse WHERE prod_nume LIKE '%_TP%'; +------------+----------------------------+ | prod_id | prod_nume | +------------+----------------------------+ | QPPPF24UTP | Patch Panel 24 porturi UTP | | QPPPF48UTP | Patch Panel 48 porturi UTP | | QPPPF24FTP | Patch Panel 24 porturi FTP | +------------+----------------------------+
CREAREA DE CMPURI CU VALORI CALCULATE Concatenarea cmpurilor calculate Pentru a demonstra lucrul cu cmpuri calculate, vom ncepe cu un exemplu simplu. Tabelul Vanzatori conine informaii legate de numele vnztorului i informaii legate de adresele lor i ara de origine.
SELECT CONCAT(vanz_nume, vanz_adresa, ' (', vanz_tara, ')') AS info_vanz FROM Vanzatori ORDER BY vanz_nume; +-------------------------------------------------------------------------------+ | info_vanz | +-------------------------------------------------------------------------------+ | Haicom Systems76185 Gablonzer Str. 11 (Germania) | | Tornado Bucuresti 178424 Bd.Jiului nr.2A, Sector 1 (Romania) | | Tornado Bucuresti 2Piata Unirii nr. 1, Unirea Shopping Center, sect (Romania) | | Tornado Digitalni Franjo d.o.o.Radnicka Cesta 2A, MBS 1895613 (Croatia) | | Tornado SistemsIndustrialna 11 (Bulgaria) | | Tornado Systems Hungary1666 Budapest, Pf.3 (Ungaria) | +-------------------------------------------------------------------------------+
Efectuarea de calcule aritmetice O alt utilizare frecvent a cmpurilor calculate este efectuarea de calcule aritmetice asupra datelor regsite. Tabelul Comenzi conine toate comenzile primite, iar tabelul ComenziArticole conine articole individuale din fiecare comand. Urmtoarea instruciune SQL regsete toate articolele din comanda numrul 20008:
SELECT prod_id, cantitate, articol_pret FROM ComenziArticole WHERE comanda_nr = 20008;
+------------+-----------+--------------+ | prod_id | cantitate | articol_pret | +------------+-----------+--------------+ | QPTCLS8P6P | 5 | 198.99 | | QPPPF24FTP | 5 | 199.49 | | EA7UWMSL | 10 | 319.99 | | QPPI01N | 10 | 18.49 | | QPPI02N | 10 | 18.49 | +------------+-----------+--------------+ 13 Coloana articol_pret conine preul unitar al fiecrui articol dintr-o comand. Pentru a afla preul global (preul unitar nmulit cu cantitatea comandat), procedai astfel:
FUNCIILE PENTRU MANIPULAREA DATELOR nainte de a parcurge acest paragraf i a testa cteva exemple, trebuie reinut faptul c folosirea funciilor SQL poate ridica probleme. Spre deosebire de instruciunile SQL (de exemplu SELECT), care n majoritate sunt acceptate n aceeai msur de toate SGBD-urile, funciile tind s aib o specificitate legat de sistemul de gestionare a bazei de date, numele ei sau sintaxa poate s difere mult. Pentru a demonstra acest aspect Tabelul 8 enumer cteva diferene ntre limbajul SQL folosit de dou dintre cele mai populare sisteme client-server pentru gestionarea bazelor de date Oracle i MySQL.
Tabelul 8 Diferene ntre funcii la Oracle i MySQL Funcia Oracle MySQL Extrage o parte a unui ir SUBSTR() SUBSTRING() Transform tipul de date Folosete mai multe funcii, cte una pentru fiecare tip de transformare ( de exemplu: TO_CHAR() i TO_NUMBER() CONVERT() Returneaz data curent SYSDATE CURDATE()
Funcii pentru manipularea textului Vom folosi de exemplu funcia UPPER() : SELECT vanz_nume, UPPER(vanz_nume) AS vanz_nume_majuscule FROM Vanzatori ORDER BY vanz_nume; +---------------------------------+---------------------------------+ | vanz_nume | vanz_nume_majuscule | +---------------------------------+---------------------------------+ | Haicom Systems | HAICOM SYSTEMS | | Tornado Bucuresti 1 | TORNADO BUCURESTI 1 | | Tornado Bucuresti 2 | TORNADO BUCURESTI 2 | | Tornado Digitalni Franjo d.o.o. | TORNADO DIGITALNI FRANJO D.O.O. | | Tornado Sistems | TORNADO SISTEMS | | Tornado Systems Hungary | TORNADO SYSTEMS HUNGARY | +---------------------------------+---------------------------------+ 14 Dup cum se poate vedea, funcia UPPER() transform textul n majuscule: fiecare vnztor este afiat de doua ori, mai nti cum este nregistrat n tabelul Vanzatori iar apoi transformat n majuscule n coloana vanz_nume_majuscule.
Tabelul 9 Funcii uzuale pentru manipularea textului Funcia Descriere LEFT() Returneaz caracterele numrate din stnga irului. LENGTH() i DATALENGTH() sau LEN() Returneaz lungimea unui ir. LOWER() Transform toate caracterele irului n minuscule. LTRIM() nltur spaiile din stnga irului. RIGHT() Returneaz caracterele numrate din dreapta irului. RTRIM() nltur spaiile din dreapta irului. SOUNDEX() Returneaz valoareaq unui ir codificat cu algoritmul SOUNDEX. UPPER() Transform toate caracterele irului n majuscule.
Un exemplu de utilizare a funciei SOUNDEX(). n cadrul firmei cumprtor din Croaia lucreaz persoana de contact numit Njofra Tudjman. Ce se ntmpl dac ns dac numele a fost scris, n mod greit. Njaffro Tudjman? n mod evident, cutarea numelui corect nu va returna nici o dat, aa cum se prezint n continuare: SELECT cump_nume, cump_contact FROM Cumparatori WHERE cump_contact = 'Njofra Tudjman';
+---------------------------------+---------------------------------+ | cump_nume | cump_contact | +---------------------------------+---------------------------------+ | | | +---------------------------------+---------------------------------+ ncercai acum aceeai cutare, folosind acum funcia SOUNDEX(), pentru a gsi toate numele contactelor ce sun similar cu Njofra Tudjman.
SELECT cump_nume, cump_contact FROM Cumparatori WHERE SOUNDEX(cump_contact) = SOUNDEX('Njofra Tudjman');
Funcii pentru manipularea datei i orei Data calendaristic i ora sunt stocate n tabele folosind tipuri de date specifice i fiecare SGBD folosete varietile sale aparte. Tabelul Comenzi conine toate comenzile primite,, alturi de data comenzii. Pentru a regsi toate comenzile fcute n anul 2005 se procedeaz astfel: SELECT comanda_nr FROM Comenzi WHERE YEAR(comanda_data) = 2005;