Creeaza.com - informatii profesionale despre


Simplitatea lucrurilor complicate - Referate profesionale unice
Acasa » scoala » informatica » sql
Instructiuni pentru selectarea datelor

Instructiuni pentru selectarea datelor


Instructiuni pentru selectarea datelor

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.

  • ALL

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

  • ANY

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

  • EXISTS

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


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.