Construirea blocului de cerere
O cerinta a utilizatorului de selectare a datelor din baza de date relationala se exprima prin ceea ce numim un bloc de cerere.
Un bloc de cerere in SQL prezinta urmatoarea sintaxa:
SELECT [ALL/DISTINCT/DISTINCTROW] lista atribute
FROM lista-tabele
[WHERE criteriu-de-cautare]
[GROUP BY criteriu-de-grupare]
[HAVING criteriu-de-grupare]
[ORDER BY criteriu-de-ordonare [ASC DESC] ];
Unde: lista-atribute- specifica atributele ale caror valori vor ii returnate;
FROM lista-tabele -specifica tabelele din care se vor extrage datele;
WHERE- permite prin precizarea unei expresii exprimarea criteriului de selectie;
ORDER BY - precizeaza atributul dupa care se va face ordonarea;
GROUP BY - folosit pentru a partitiona o tabela in grupuri acordand acestora valori pe un atribut sau lista de atribute;
HAVING specifica criterii de selectie pe grupuri de tupluri.
Daca dorim sa vizualizam toate tuplurile tabelei Produse, blocul de cerere va prezenta urmatoarea forma:
SELECT DISTINCTROW * FROM PRODUSE
In cazul in care doriti sa vizualizati doar numele si pretul produselor avand pretul mai mare de 500 de blocul de cerere va prezenta urmatoarea forma:
SELECT DISTINCTROW [DEN PROD], PRET FROM PRODUSE WHERE PRET>500;
Daca doriti sa aflati ce calitate au produsele achizitionate puteti construi urmatorul bloc de cerere:
SELECT DISTINCTROW CALITATE FROM PRODUSE;
Inconvenientul consta in faptul ca toate realizarile celor n tupluri ale tabelei, pentru atributul calitate, sunt returnate. Acelasi rezultat il obtinem si daca inlocuim in blocul de cerere clauza DISTINCTROW cu ALL. Pentru a extrage valorile neduplicate pentru atributul calitate, blocul de cerere va fi:
SELECT DISTINCT CALITATE FROM PRODUSE;
Daca doriti sa aflati care din produsele de calitatea I-a au preturi mai mari de 500 in clauza WHERE veti utiliza o expresie compusa:
SELECT DISTINCTROW * FROM PRODUSE WHERE PRET>500 AND CALITATE=1;
In cazul in care doriti sa cunoasteti denumirea produselor cu preturi intre 190 si 1000 lei puteti fie sa introduceti o expresie compusa in clauza WHERE, fie sa utilizati operatorul between:
SELECT [DEN PROD] FROM PRODUSE WHERE PRET >=190 AND PRET=<1000;
sau:
SELECT [DEN PROD] FROM PRODUSE WHERE PRET BETWEEN 190 AND 1000;
In cazul in care doriti sa cunoasteti produsele ale caror preturi sunt fie 1000, fie 1500, in clauza WHERE se va folosi operatorul IN:
SELECT [DEN PROD] FROM PRODUSE WHERE PRET IN (1000,1500);
Poate fi utila solicitarea ordonarii tuplurilor dupa calitate si pret, pornind de la pretul cel mai mare din grupa de calitate respectiva:
SELECT DISTINCTROW * FROM PRODUSE ORDER BY CALITATE, PRET DESC;
In cazul in care se doreste aflarea pretului maxim, minim si mediu al produselor, blocul de cereri va utiliza functiile corespunzatoare:
SELECT DISTINCTROW MAX(PRET) AS [PRET MAX], MIN(PRET) AS [PRET MIN], AVG(PRET) AS [PRET MEDIU] FROM PRODUSE;
Observam ca prin clauza AS, in exemplul de mai sus, am putut modifica eticheta coloanelor ce returneaza valoarea functiilor specificate.
Daca doriti sa stabiliti pretul maxim al produselor grupandu-le pe calitati, utilizati in blocul de cerere clauza GROUP BY:
SELECT DISTINCTROW MAX(PRET) AS [PRET MAXIM], CALITATE
FROM PRODUSE
GROUP BY CALITATE;
De cele mai multe ori insa, este necesar sa extragem date stocate in mai multe tabele. Sa presupunem ca dorim sa cunoastem in ce cantitati am livrat produse clientilor si care este valoarea facturata a fiecarui produs:
SELECT DISTINCTROW PRODFACT.[NR FACT], PRODUSE.[DEN PROD], PRODFACT.[CANT FACT], PRODUSE.PRET,
PRODUSE.PRET*PRODFACT.[CANT FACT] AS VALOARE
FROM PRODUSE, PRODFACT
WHERE PRODUSE.[COD PRODUS]= PRODFACT. [COD PRODUS];
In acest bloc de cerere, se poate observa utilizarea calificarii atributelor (precedarea numelui lor de numele tabelei careia ii apartin) si precizarea numelor celor doua tabele sursa in clauza FROM. Criteriul de compunere al celor doua tabele este precizat in clauza WHERE.
Realizarea unor cautari complexe in baza de date presupune construirea unor subcereri in cadrul cererii initiale. Daca dorim de exemplu sa cunoastem care sunt produsele cu pretul mai mare decat al merelor:
SELECT DISTINCTROW [DEN PROD], PRET
FROM PRODUSE
WHERE PRET > (SELECT PRET FROM PRODUSE WHERE [DEN PROD]='MERE');
Utilizarea predicatelor ALL, ANY, EXIST
Domeniul de obtinere a rezultatelor unei subinterogari poate fi influentat prin precizarea unuia din cuvintele cheie: ALL, ANY si respectiv EXIST.
Se preiau rezultatele subinterogarii si, daca acestea indeplinesc conditia ceruta, se returneaza valoarea logica True.
Exemplu : Daca dorim sa cunoastem numele produselor de calitatea intai cu pretul mai mic decat al tuturor produselor de calitatea a 2-a cererea va avea urmatoarea forma:
SELECT [DEN PROD] FROM PRODUSE
WHERE CALITATEA='1' AND PRET< ALL
(SELECT PRET FROM PRODUSE WHERE CALITATEA='
Are in vedere compararea valorii de iesire a subinterogarii cu fiecare inregistrare din interogarea externa. Daca pentru fiecare inregistrare din interogare exista un rezultat al subinterogarii, se va returna valoarea logica True. Spre deosebire de clauza IN poate fi folosit cu diversi operatori relationali. Cuvantul cheie SOME are acelasi rol si caracteristici ca ANY.
Exemplu: Sa se returneze lista cartilor din biblioteca care apartin unuia din domeniile abordate de editura ALL in anul 2007:
SELECT TITLUL_CARTII, DOMENIUL, ANUL_APARITIEI, PRET
FROM CARTI .
WHERE DOMENIUL= ANY (SELECT DOMENIUL FROM CARTI WHERE EDITURA='ALL' AND [ANUL APARITIEI]=2007);
Inlocuirea lui ANY cu SOME produce un rezultat identic:
SELECT TTLUL_CARTII, DOMENIUL, ANUL_APARITIEI, PRET
FROM CARTI
WHERE DOMENIUL= SOME (SELECT DOMENIUL FROM CARTI WHERE DOMENIUL ="INFORMATICA");
Foloseste subinterogarea ca pe o conditie, analizand setul de rezultate al acesteia si returnand valoarea False daca nu exista nici o iesire. Se poate astfel verifica existenta anumitor inregistrari si controla ansamblul raspunsurilor date de interogare.
Exemplu: Sa se verifice daca in cadrul bibliotecii exista si carti aparute inainte de anul 2007:
SELECT TITLUL_CARTII, ANUL_APARITIEI
FROM CARTI
WHERE EXISTS (SELECT * FROM CARTI WHERE ANUL_APARITIEI<2007);
Fiecare dintre cuvintele cheie ANY, ALL si EXISTS poate sa fie utilizat pentru restrictionarea interogarilor si in forma cu negatie - adica prin folosirea operatorului logic NOT.
Interogari folosind operatorul UNION
Cand utilizatorul doreste sa vada rezultatele mai multor interogari SELECT in acelasi timp, prin combinarea iesirilor lor, poate utiliza facilitatea UNION a limbajului de interogare SQL. Sintaxa generala pentru interogarile UNION este:
SELECT lista_campuri FROM tabela1
UNION SELECT lista_campuri FROM tabela2
[GROUP BY camp_de_grupare]
[HAVING criteriul_de_agregare]
[UNION SELECT lista__campuri FROM tabela3
[GROUP BY camp_de_grupare ]
[HAVING criteriul_de_grupare]
[UNION. ]
[ORDER BY camp_criteriu_de_sortare];
Exista mai multe restrictii pentru instructiunile care genereaza interogari UNION si anume:
numarul de campuri din lista de campuri asociata fiecarei instructiuni SELECT si UNION SELECT trebuie sa fie acelasi;
este permisa doar o data utilizarea clauzei ORDER BY, dupa ultima instructiune UNION SELECT;
secventa de nume din fiecare lista de campuri trebuie sa corespunda unor intrari identice. Cand se foloseste UNION, automat se vor elimina duplicatele ce apar in urma combinarii. In cazul folosirii domeniului ALL se vor lua in considerare si valorile duplicate.
Exemple:
a) Care a fost media salariilor colaboratorilor studenti si ingineri ?
SELECT CATEGORIE, AVG(SALARIU) AS MEDIE FROM COLABORATORI
GROUP BY CATEGORIE
HAVING CATEGORIE = 'STUDENT'
UNION SELECT CATEGORIE, AVG(SALARIU) AS MEDIE FROM COLABORATORI
GROUP BY CATEGORIE
HAVING CATEGORIE = 'ING';
b) Fie tabelele Clienti (cod, nume, localitate) si Furnizori (cod, nume, localitate). Prin utilizarea operatorului UNION putem obtine lista comuna a clientilor si furnizorilor:
SELECT * FROM CLIENTI
UNION
SELECT* FROM FURNIZORI
ORDER BY NUME;
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |