Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Subconsultari

sql



+ Font mai mare | - Font mai mic



Subconsultari

Una dintre cele mai importante facilitati oferite de SQL consta in includerea unei consultari in alta, pe doua sau mai multe niveluri - cu alte cuvinte, utilizarea subconsultarilor. Prin aceste subconsultari se obtin tabele temporare intermediare ce vor fi folosite drept "argumente" in frazele SELECT superioare.



In materie de subconsultari, cel mai utilizat operator este IN, pe care deja l-am intalnit in capitolul precedent, dar intr-o cu totul alta ipostaza - testarea incadrarii valorii unui atribut intr-o lista de constante.

In continuare, domeniul de testare este alcatuit din liniile unei tabele.

Revenim la exemplul din algebra relationala: Ce studenti studiaza la aceeasi sectie cu "Dinescu Monica"?

SELECT nume

FROM STUDENT

WHERE sectia IN

(SELECT sectia

FROM STUDENT

WHERE nume = "Dinescu Monica")

In cazul acestei interogari, executia se realizeaza in doi timpi. Mai intai se executa subconsultarea

SELECT sectia

FROM STUDENT

WHERE nume = "Dinescu Monica"

obtinandu-se o tabela intermediara ce contine o singura linie (pe care apare CIG) si o singura coloana (sectia), ca in figura 4.24.

sectia

CIG

Figura 4.24. Sectia la care studiaza Dinescu Monica

In cel de-al doilea pas sunt selectate liniile tabelei STUDENT care indeplinesc conditia sectia = "CIG"

nume

Popescu Ion Octavian

Popescu Marilena

Danciu Monica

Dinescu Monica

Cristea Roxana

Goia Simona

Stanciu Maria

Figura 4.25. Studentii care studiaza la aceeasi sectie cu Dinescu Monica

Observam ca in rezultat a fost inclus si studentul de referinta - Dinescu Monica. Daca se doreste excluderea din rezultat a acestui student, fraza SELECT se modifica astfel:

SELECT nume

FROM STUDENT

WHERE sectia IN

(SELECT sectia

FROM STUDENT

WHERE nume = "Dinescu Monica")

AND nume < > "Dinescu Monica"

Ce studenti studiaza la alte sectii decat "Dinescu Monica"?

SELECT nume

FROM STUDENT

WHERE sectia NOT IN

(SELECT sectia

FROM STUDENT

WHERE nume = "Dinescu Monica")

nume

Radu Laurentiu

Tudorache Octavian

Chivu Mihai

Barbu Elena

Petrescu Daniel

Croitoru Sebastian

Danciu Mihaela

Stan Adrian

Moraru Octavian

Balasa Maria

Simionescu Dorin

Delca Simona

Radu Denisa

Figura 4.26. Studentii care studiaza la alte sectii

decat la cea la ca studiaza Dinescu Monica

In ce camin sunt cazati studentii care studiaza la aceeasi sectie cu "Dinescu Monica"?

SELECT DISTINCT nume_camin

FROM STUDCAMIN

WHERE nr_matricol IN

(SELECT nr_matricol

FROM STUDENT

WHERE sectia IN

SELECT sectia

FROM STUDENT

WHERE nume = "Dinescu Monica"))

nume_camin

Caminul nr. 2

Miclas

Sportiv

Figura 4.27. Caminul in care stau studentii care

studiaza la aceeasi sectie cu Dinescu Monica

Rezultatul prezentat in figura 4.27. este obtinut prin folosirea a trei niveluri de interogare (fraza principala, o subconsultare si o sub-subconsultare).

In Visual Fox Pro aceasta ultima interogare face simtita prezenta uneia dintre cele mai serioase limitari SQL - maxim 2 niveluri de consultare (fraza principala si o interogare subordonata). Mesajul de eroare are numarul 1842: SQL: Subquery nesting in too deep.

Astfel, pentru a raspunde la intrebare, solutia de interogare trebuie reformulata:

SELECT nume_camin

FROM STUDENT INNER JOIN STUDCAMIN;

ON STUDENT.nr_matricol = STUDCAMIN.nr_matricol;

WHERE sectia IN

(SELECT sectia

FROM STUDENT

WHERE nume = "Dinescu Monica")

Din ce judete sunt studentii care au imprumutat carti scrise de autori de nationalitate romana?

Am ales acest exemplu pentru a folosi in subconsultari cat mai multe tabele ale bazei de date

SELECT judet

FROM LOCALITATE

WHERE cod_localitate IN

(SELECT cod_localitate

FROM STUDENT

WHERE nr_matricol IN

(SELECT nr_matricol

FROM STUDCARTE

WHERE cota_carte IN

(SELECT cota_carte

FROM CARTE

WHERE cota_carte IN

(SELECT cota_carte

FROM AUTOR_CARTE

WHERE nume_autor IN

SELECT nume_autor

FROM AUTOR

WHERE nationalitate = "roman")))))

Atunci cand rezultatul unei subconsultari se concretizeaza intr-o tabela cu o singura coloana si o singura linie, corelarea poate fi facuta si cu operatorii de comparatie obisnuiti: =, >, >=, <, <=.

In continuare vom ilustra aceasta facilitate prin cateva exemple.

Care este cel mai mic pret unitar la care s-a cumparat o carte?

SELECT MIN (pret_unitar) AS maxim

FROM CARTE

minim

Figura 4.28. Cel mai mic pret unitar

Care este cel mai mic pret unitar si care este cartea, respectiv studentul care a imprumutat cartea cu pretul respectiv?

SELECT titlu, pret_unitar, nume

FROM CARTE C, STUDCARTE SC, STUDENT S

WHERE S.nr_matricol = SC.nr_matricol

AND SC.cota_carte=C.cota_carte AND

pret_unitar =(SELECT MIN (pret_unitar)

FROM CARTE)

titlu

pret_unitar

nume

Politici si optiuni contabile

Petrescu Daniel

Figura 4.29. Titlu cartii cu cel mai mic pret

Care sunt cele mai mari cinci preturi unitare, cartile si studentii care au imprumutat cartile care au cele cinci preturi maxime?

SELECT titlu, pret_unitar, nume

FROM STUDENT INNER JOIN STUDCARTE ON STUDENT.nr_matricol = STUDCARTE.nr_matricol

INNER JOIN CARTE ON STUDCARTE.cota_carte = CARTE.cota_carte

WHERE pret_unitar >

(SELECT MAX (pret_unitar)

FROM CARTE

WHERE pret_unitar <

(SELECT MAX (pret_unitar)

FROM CARTE

WHERE pret_unitar <

(SELECT MAX (pret_unitar)

FROM CARTE

WHERE pret_unitar <

(SELECT MAX (pret_unitar)

FROM CARTE

WHERE pret_unitar <

(SELECT MAX (pret_unitar)

FROM CARTE)

)

)

)

)

ORDER BY pret_unitar DESC

Avand in vedere nivelurile de interogare, pentru exemplul de mai sus, in Visual FoxPro nu se poate formula interogarea in aceasta forma.  Avem insa la indemana o solutie neverosimil de simpla bazata pe clauza TOP

SELECT TOP 5 titlu, pret_unitar, nume

FROM STUDENT INNER JOIN STUDCARTE ON STUDENT.nr_matricol = STUDCARTE.nr_matricol

INNER JOIN CARTE ON STUDCARTE.cota_carte = CARTE.cota_carte

ORDER BY pret_unitar DESC

titlu

pret_unitar

nume

Database Transaction Models

Petrescu Daniel

Database Transaction Models

Chivu Mihai

Merise vers OMT et UML

Popescu Ion Octavian

Informatica de gestiune

Stanciu Maria

Informatica de gestiune

Tudorache Octavian

Figura 4.30. Primele 5 preturi unitare

Liniile tabelei sunt ordonate descrescator dupa pretul unitar, iar in rezultatul final sunt extrase doar primele cinci (prin TOP 5)



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1749
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved