Filtrarea avansata a datelor
- In lectia aceasta ,veti invata cum sa combinati clauzele WHERE pentru a crea conditii de cautare puternice si sofisticate. Veti afla de asemenea cum se folosesc operatorii NOT si IN.
- Combinarea clauzelor WHERE
Toate clauzele WHERE introduse in lectia "Filtrarea datelor",filtreaza datele utilizand un singur criteriu.Pentru un grad superior de control al filtrarii,limbaju SQL va permite sa specificati mai multe clauze WHERE.Acestea pot sa fie folosite in doua modalitati:sub forma de clauze AND,sau OR.OperatoriCuvintele cheie speciale ,folosite pentru unirea sau modificarea clauzelor din interiorul unei clauze WHERE. Cunoscute si ca operatorii logici.
- Operatorul AND Pentru a filtra dupa mai multe coloane ,folositi operatorul AND ca sa adaugati conditii clauzei WHERE,Urmatorul fragment de cod demonstreaza acest lucru:
SELECT prod_id, prod_pret , prod_nume
FORUM Produse
WHERE vanz_id =?DLL01? AND prod_pret <= 4;
Instructiunea de mai sus regaseste numele si pretul produsului pentru toate produsele vandute de vanzatorul DLL01 atata timp cat pretul este de maximum 4$. Clauza WHERE din aceasta instructiune SELECT este alcatuita din doua conditii,iar cuvantul cheie AND este folosit pentru unirea conditiilor specificate.Daca un produs este vandut de vanzatorul DLL01 ,dar costa mai mult de 4$,el nu va fi regasit.In mod similar ,produsele ce costa mai putin de 4$,dar care sunt vandute de alti vanzatori decat cel specificat,nu vor fi regasite.Rezultatul generat de aceasta instructiune SQL este urmatorul:
Prod_id prod_pret prod_nume
........................................................
BNBG01 3.4900 Jucarie tip peste
BNBG02 3.4900 Jucarie tip pasare
BNBG03 3.4900 Jucarie tip impureAND----cuvant cheie folosit intr-o clauza WHERE,pentru a specifica regasirea exclusiv a liniilor ce corespund tuturor conditiilor specificate.
- Operatorul OR
Operatorul OR este exact opusul operatorului AND .El instruieste sistemul de gestionare a bazei de date sa returneze liniile ce corespund oricareia dintre conditii.De fapt ,cele mai multe SGBD-uri bune nici macar nu vor evalua a doua conditie dintr-o clauza OR din WHERE ,daca prima conditie a fost deja indeplinita .(Daca prima conditie a fost indeplinita ,linia va fi regasita ,indiferent care ar fi fost a doua conditie).SELECT prod_nume, prod_pret
FROM Produse
WHERE vanz_id = ?DLL01? OR vanz_id =?BRS01?;
Instructiunea SQL de mai sus regaseste numele si pretul produsului pentru toate produsele detinute de oricare dintre doi vanzatori specificati. Operatorul OR anunta sistemul de gestionare a bazei de date sa caute corespondenta cu orcare dintre conditii ,nu cu amandoua. Daca ar fi fost folosit un operator AND nu ar fi fost returnata nici o data . Rezultatu generat de aceasta instructiune SQL este:prod_nume prod_pret
...................................................
Jucarie tip peste 3.4900
Jucarie tip pasare 3.4900
Jucarie tip iepure 3.4900
Ursulet 8 inch 5.9900
Ursulet 12 inch 8.9900
Ursulet 18 inch 11.9900
Papusa fata 4.9900OR.-Cuvant cheie folosit intr-o clauza WHERE,pentru a specifica regasirea orcaror linii ce corespund indiferent careia dintre conditiile specificate.
- Ordinea de evaluare
Clauzele WHERE pot contine orcat de multi operatori AND si OR .Combinarea celor doua tipuri de operatori va permite sa efectuati filtrari sofisticate si complexe.Totusi combinarea operatorilor AND si OR ridica o problema.Pentru a demonstra acest lucru ,vom examina un exemplu.Aveti nevoie de lista tuturor produselor care costa minimum 10$,detinute de vanzatorii DLL01 si BRS01. Urmatoarea instructiune SELECT foloseste o combinatie de operatori AND si OR pentru a construi o clauza WHERE.SELECT prod_nume, prod_pret
FROM Produse
WHERE vanz_id=?DLL01? OR vanz_id =?BRS01?
AND prod_pret > =10;
prod_nume prod_pret
.....................................................
Jucarie tip peste 3.4900
Jucarie tip pasare 3.4900
Jucarie tip iepure 3.4900
Ursulet 18 inch 11.9900
Papusa fata 4.9900
Priviti rezultatele de mai sus.Patru dintre liniile returnate au preturi mai mici de 10$,asadar este limpede ca ele nu au fost filtrate asa cum se dorea.De ce s-a intamplat asta?Raspunsul il constituie ordinea de evaluare.SQL (ca majoritatea limbajelor)prelucreaza operatorii AND inaintea operatorilor OR .Atunci cand vede clauza WHERE de mai sus ,limbaju SQL o citeste astfel:toate produsele care costa 10$sau mai mult,detinute de vanzatorul DLL01 ,si toate produsele detinute de vanzatorul BRS01, indiferent de pret.Cu alte cuvinte ,deoarece AND are precedenta mai ridicata in ordinea de evaluare ,operatorii au fost uniti in mod eronat. Solutia la aceasta problema este folosirea parantezelor,pentru a grupa in mod explicit operatorii asociati grupurilor.Iata de exemplu ,urmatoarea instructiune SELECT si rezultatu corespunzator:SELECT prod_nume, prod _pret
FROM Produse
WHERE (vanz_id = ?DLL01? OR vanz_id = ?BRS01?)
prod_nume prod_pret
..............................................
Ursulet 18 inch 11.9900
Singura diferenta intre aceasta instructiune SELECT si cea anterioara este ca, acum, primele doua conditii ale clauzei WHERE sunt cuprinse intre paranteze.Deoarece parantezele au precedenta de evaluare mai ridicata decat orcare dintre operatorii AND si OR sistemul de gestionare a bazei de date filtreaza mai intai conditia OR din interiorul lor. Astfel instructiunea SQL devine:toate produsele detinute fie de vanzatorul DLL01 fie de vanzatorul BRS01 care costa 10$ sau mai mult.--adica exact ceea ce doream.Folosirea parantelelor in clauzele WHERE.Ori de cate ori scrieti clauzele WHERE care folosesc simultan operatorii AND si OR utilizati paranteze pentru a grupa operatorii in mod explicit.Nu va bazati niciodata pe ordinea de evaluare prestabilita ,chiar daca este exact ceea ce doreati.Nu exista nici un neajuns in folosirea parantezelor si intodeauna este preferabil sa eliminati orce ambiguitati
- Operatorul IN
Operatorul IN se foloseste pentru a specifica un domeniu de conditii ,oricare dintre ele putand fi indeplinite.IN necesita o lista de valori valide,care sa fie separate prin virgule si cuprinse intre paranteze.Urmatorul exemplu demonstreaza acest lucru:
SELECT prod_nume, prod_pret
FROM Produse
WHERE vanz_id IN (?DLL01? ,?BRS01?)
ORDER BY prod_nume;
prod_nume prod _pret
............................................................
Jucarie tip iepure 3.4900
Jucarie tip pasare 3.4900
Jucarie tip peste 3.4900
Papusa fata 4.9900
Ursulet 8 inch 5.9900
Ursulet 12 inch 8.9900
Ursulet 18 inch 11.9900
Instructiunea SELECT regaseste toate produsele detinute de vanzatorii DLL01 si BRS01.Operatorul IN este urmat de o lista de valori valide despartite prin virgule si intreaga lista este cuprinsa intre paranteze.Daca vi se pare ca operatorul IN obtine acelasi rezultat ca OR, nu va inselati.Urmatoarea instructiune SQL obtine exact acelasi rezultat ca exemplul de mai sus:SELECT prod_nume, prod_pret
FROM Produse
WHERE vanz_id =?DLL01? OR vanz_id = ?BRSO1?
ORDER BY prod_nume;
prod_nume prod_pret
.............................................................
Jucarie tip iepure 3.4900
Jucarie tip pasare 3.4900
Jucarie tip peste 3.4900
Papusa fata 4.9900
Ursulet 8 inch 5.9900
Ursulet 12 inch 8.9900
Ursulet 18 inch 11.9900
Care este atunci utilitatea folosirii operatorului IN?Avantajele sale sunt: -Cand lucrati cu liste lungi de optiuni valide,sintaxa operatorului IN este mai simpla si mai usor de citit. -Ordinea de evaluare este mai simplu de gestionat,cand operatorul IN este folosit in asociatie cu operatorii AND si OR. -Aproape intotdeauna,operatorii IN executa mai repede decat listele de operatori OR . -Avantajul cel mai mare este ca operatorul IN poate sa contina o alta instructiune SELECT, si astfel va permite sa construiti clauzeWHERE foarte dinamice.IN.Cuvant cheie folosit intr-o clauza WHERE pentru specificarea unei liste de valori ce trebuie regasite,folosind o comparatie OR
- Folosirea operatorului NOT
Operatorul NOT al clauzei WHERE are o singura functie-neaga orce conditie care il urmeaza.Deoarece NOT nu este niciodata utilizat in sine(intotdeauna se foloseste in asociatie cu alt operator),sintaxa lui difera de ceilalti operatori.Spre deosebire de alti operatori cuvantul cheie NOT poate fi utilizat inaintea coloanei dupa care se va face filtrarea,nu imediat dupa aceasta.NOT. Cuvant cheie folosit intr-o clauza WHERE pentru a nega o conditie.
Urmatorul exemplu demonstreaza folosirea operatorului NOT .Pentru ca sa afisati produsele detinute de toti vanzatorii, cu exeptia vanzatorului DLL01,puteti scrie:SELECT prod_nume
FROM Produse
WHERE NOT vanz_id =?DLL01?
ORDER BY prod_nume;
prod_nume
........................
Ursulet 8 inch
Ursulet 12 inch
Ursulet 18 inch
Papusa rege
Papusa regina
Operatorul NOT din acest caz neaga conditia care-l urmeaza ;de aceea, in loc sa potriveasca vanz_id cu DLL01 SGBD-ul potriveste vanz _id cu orce identificator care nu este DLL01.Exemplul anterior putea fi de asemenea obtinut prin folosirea operatorului <>asa cum vom vedea:SELECT prod_nume
FROM Produse
WHERE vanz_id <>?DLL01?
ORDER BY prod_nume;
prod_nume
........................
Ursulet 8 inch
Ursulet 12 inch
Ursulet 18 inch
Papusa rege
Papusa regina
De ce atunci sa folositi operatorul NOT?Pentru clauzele WHERE simple,asa cum au fost cele prezentate aici,nu se poate spune ca ar exista vreun avantaj real in folosirea operatorului NOT .Acesta este util in clauzele mai complexe .De exemplu ,daca folositi operatorul NOT in asociatie cu cu un operator IN va fi simplu sa gasiti toate liniile care nu corespund cu o lista de criterii. - Pana aici ati invatat cum sa combinati clauzele WHERE cu operatorii AND si OR Ati aflat de asemenea cum sa gestionati in mod explicit ordinea de evaluare si cum sa folositi operatorii IN si NOT.
Link-ul autorului:
www.avasilcaidaniel.com/
Comentarii
Voteaza acest articol!
Trimite un comentariu!