Sunteți pe pagina 1din 15

LUCRUL CU DATE N MySQL I SQL.

..:: Instruciunea SELECT ::..






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:

SELECT prod_nume
FROM Produse;

+-----------------------------------+
| prod_nume |
+-----------------------------------+
| Patch Panel 24 porturi UTP |
| Patch Panel 48 porturi UTP |
| Patch Panel 24 porturi FTP |
| Cabinet metalic 7U Wall Mount 19" |
| Priza simpla ingropata neecranata |
| Priza dubla ingropata neecranata |
| Cleste sertizat |
| Punch down tool |
| LAN Tester |
+-----------------------------------+

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 (*) :

SELECT *
FROM Produse;

+------------+----------+-----------------------------------+-----------+------------+
| prod_id | vanz_id | prod_nume | prod_pret | prod_desc |
+------------+----------+-----------------------------------+-----------+------------|
| QPPPF24UTP | TORBUC01 | Patch Panel 24 porturi UTP | 199.49 |Patch Panel |
| QPPPF48UTP | TORBUC01 | Patch Panel 48 porturi UTP | 274.99 |Patch Panel |
| QPPPF24FTP | TORBUC01 | Patch Panel 24 porturi FTP | 199.49 |Patch Panel |
| EA7UWMSL | TORBUL01 | Cabinet metalic 7U Wall Mount 19" | 319.99 |Cabinet |
| QPPI01N | TORBUL01 | Priza simpla ingropata neecranata | 18.49 |Priza simpla|
| QPPI02N | TORBUL01 | Priza dubla ingropata neecranata | 18.49 |Priza dubla |
| QPTCLS8P6P | TORBUL01 | Cleste sertizat | 199.49 |Cleste |
| QPTPDBODY | TORCRO01 | Punch down tool | 111.99 |Punch down |
| QPTTSCRJ45 | TORCRO01 | LAN Tester | 79.49 |Qubs Basic |
+------------+----------+-----------------------------------+-----------+------------+

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:

SELECT prod_nume
FROM Produse
ORDER BY prod_nume;

+-----------------------------------+
| prod_nume |
+-----------------------------------+
| Cabinet metalic 7U Wall Mount 19" |
| Cleste sertizat |
| LAN Tester |
| Patch Panel 24 porturi FTP |
| Patch Panel 24 porturi UTP |
| Patch Panel 48 porturi UTP |
| Priza dubla ingropata neecranata |
| Priza simpla ingropata neecranata |
| Punch down tool |
+-----------------------------------+

Sortarea dup mai multe coloane
Urmtorul cod regsete trei coloane i sorteaz rezultatele dup dou dintre ele mai
nti dup pre i apoi dup nume:

SELECT prod_id,
prod_pret,
prod_nume
FROM Produse
ORDER BY prod_pret,
prod_nume;

+------------+-----------+-----------------------------------+
| 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" |
+------------+-----------+-----------------------------------+

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;

+----------------------------+-----------+
| prod_nume | prod_pret |
+----------------------------+-----------+
| Patch Panel 24 porturi UTP | 199.49 |
| Patch Panel 24 porturi FTP | 199.49 |
| Cleste sertizat | 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;

+-----------------------------------+-----------+
| prod_nume | prod_pret |
+-----------------------------------+-----------+
| Patch Panel 24 porturi UTP | 199.49 |
| Patch Panel 24 porturi FTP | 199.49 |
| 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 |
+-----------------------------------+-----------+

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';

+----------+----------------------------+
| vanz_id | prod_nume |
+----------+----------------------------+
| TORBUC01 | Patch Panel 24 porturi UTP |
| TORBUC01 | Patch Panel 48 porturi UTP |
| TORBUC01 | Patch Panel 24 porturi FTP |
| TORCRO01 | Punch down tool |
| TORCRO01 | LAN Tester |
+----------+----------------------------+

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;

+----------------------------+-----------+
| prod_nume | prod_pret |
+----------------------------+-----------+
| Patch Panel 24 porturi UTP | 199.49 |
| Patch Panel 48 porturi UTP | 274.99 |
| Patch Panel 24 porturi FTP | 199.49 |
| Cleste sertizat | 199.49 |
| Punch down tool | 111.99 |
| LAN Tester | 79.49 |
+----------------------------+-----------+

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;

+---------+-----------+-----------------------------------+
| prod_id | prod_pret | prod_nume |
+---------+-----------+-----------------------------------+
| QPPI01N | 18.49 | Priza simpla ingropata neecranata |
| QPPI02N | 18.49 | Priza dubla ingropata neecranata |
+---------+-----------+-----------------------------------+

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%';

+---------+-----------------------------------+
| prod_id | prod_nume |
+---------+-----------------------------------+
| QPPI01N | Priza simpla ingropata neecranata |
| QPPI02N | Priza dubla ingropata neecranata |
+---------+-----------------------------------+
12
Urmtorul exemplu folosete dou caractere de nlocuire la extremitile modelului de cutare:
SELECT prod_id, prod_nume
FROM Produse
WHERE prod_nume LIKE '%porturi%';
+------------+----------------------------+
| prod_id | prod_nume |
+------------+----------------------------+
| QPPPF24UTP | Patch Panel 24 porturi UTP |
| QPPPF48UTP | Patch Panel 48 porturi UTP |
| QPPPF24FTP | Patch Panel 24 porturi FTP |
+------------+----------------------------+

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:

SELECT prod_id, cantitate, articol_pret,
Cantitate*articol_pret AS pret_global
FROM ComenziArticole
WHERE comanda_nr = 20008;
+------------+-----------+--------------+-------------+
| prod_id | cantitate | articol_pret | pret_global |
+------------+-----------+--------------+-------------+
| QPTCLS8P6P | 5 | 198.99 | 994.95 |
| QPPPF24FTP | 5 | 199.49 | 997.45 |
| EA7UWMSL | 10 | 319.99 | 3199.90 |
| QPPI01N | 10 | 18.49 | 184.90 |
| QPPI02N | 10 | 18.49 | 184.90 |
+------------+-----------+--------------+-------------+
SQL accept operatorii aritmetici elementari enumerai n tabelul 7. n plus, pot fi folosite
parantezele, pentrua stabili ordinea precedenei.
Tabelul 7 Operatorii aritmetici SQL
Operator Descriere
+ Adunare
- Scdere
* nmulire
/ mprire

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');

+---------------------------------+-----------------+
| cump_nume | cump_contact |
+---------------------------------+-----------------+
| Flamingo Digitalni Ducan d.o.o. | Njaffra 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;

+------------+
| comanda_nr |
+------------+
| 20005 |
| 20006 |
| 20007 |
| 20008 |
| 20009 |
+------------+
15

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

  • Administrarea Bazelor de Date MySQL
    Administrarea Bazelor de Date MySQL
    Document6 pagini
    Administrarea Bazelor de Date MySQL
    Radu
    Încă nu există evaluări
  • Deea A
    Deea A
    Document108 pagini
    Deea A
    Nicolescu Horia
    Încă nu există evaluări
  • Mysql
    Mysql
    Document48 pagini
    Mysql
    Ion Ionescu
    Încă nu există evaluări
  • MPP Constructie Functionare
    MPP Constructie Functionare
    Document21 pagini
    MPP Constructie Functionare
    Gigi Tyirean
    Încă nu există evaluări
  • Laborator
    Laborator
    Document140 pagini
    Laborator
    dumitruieseanu
    Încă nu există evaluări
  • RCCurs 12 PDF
    RCCurs 12 PDF
    Document24 pagini
    RCCurs 12 PDF
    Mădălin George Ionescu
    Încă nu există evaluări
  • Final 02cs
    Final 02cs
    Document66 pagini
    Final 02cs
    Nastase Mihai
    Încă nu există evaluări
  • PM Definitii
    PM Definitii
    Document8 pagini
    PM Definitii
    Zaharia George
    Încă nu există evaluări
  • PM Definitii
    PM Definitii
    Document8 pagini
    PM Definitii
    Zaharia George
    Încă nu există evaluări
  • Final 01cs
    Final 01cs
    Document20 pagini
    Final 01cs
    Mădălin George Ionescu
    Încă nu există evaluări
  • Final 03cs
    Final 03cs
    Document53 pagini
    Final 03cs
    Nastase Mihai
    Încă nu există evaluări
  • Legea Lui Ohm
    Legea Lui Ohm
    Document1 pagină
    Legea Lui Ohm
    Mădălin George Ionescu
    Încă nu există evaluări
  • Masina RC 4x4
    Masina RC 4x4
    Document9 pagini
    Masina RC 4x4
    Mădălin George Ionescu
    Încă nu există evaluări
  • Modulul I. Elemente de Bază Privind Managementul Proiectelor
    Modulul I. Elemente de Bază Privind Managementul Proiectelor
    Document46 pagini
    Modulul I. Elemente de Bază Privind Managementul Proiectelor
    Mădălin George Ionescu
    Încă nu există evaluări
  • Bazele Electrotehnicii
    Bazele Electrotehnicii
    Document16 pagini
    Bazele Electrotehnicii
    Andrei Madalin
    Încă nu există evaluări
  • Cursuri POO
    Cursuri POO
    Document14 pagini
    Cursuri POO
    Mădălin George Ionescu
    Încă nu există evaluări
  • Ma 1 2
    Ma 1 2
    Document42 pagini
    Ma 1 2
    Claudiu Popa
    Încă nu există evaluări