This shows you the differences between two versions of the page.
bd:laboratoare:08 [2019/04/07 17:03] fbratiloveanu [Subcereri necorelate] |
bd:laboratoare:08 [2023/04/24 12:32] (current) sorin.ciolofan [Subcereri corelate în clauze WHERE] |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laborator 08 - Subcereri SQL (I) ===== | ===== Laborator 08 - Subcereri SQL (I) ===== | ||
+ | |||
+ | ==== Obiective ==== | ||
+ | * Subcereri | ||
+ | * Subcereri necorelate în clauze WHERE | ||
+ | * Subcereri corelate în clauze WHERE | ||
+ | * Subcereri în clauze FROM | ||
+ | |||
+ | ==== Materiale ajutătoare ==== | ||
+ | [[bd:resurse:tables|Resurse BD]] | ||
+ | |||
==== Subcereri ==== | ==== Subcereri ==== | ||
Line 11: | Line 21: | ||
<note important>Subcererile pot fi imbricate, adică, o subcerere poate avea propriile ei subcereri. | <note important>Subcererile pot fi imbricate, adică, o subcerere poate avea propriile ei subcereri. | ||
</note> | </note> | ||
- | Din punct de vedere al rolului pe care îl au într-o comandă SQL și a modului de a face construcția comenzii, subcererile pot fi împărțite în: | + | Dacă există o legătură de asociere sau nu între subcere și cererea exterioară, subcererile pot fi de 2 tipuri: |
* Subcereri necorelate | * Subcereri necorelate | ||
- | * Subcereri corelate | + | * Subcereri corelate |
+ | |||
+ | Din punct de vedere al rolului pe care îl au într-o comandă SQL și a modului de a face construcția comenzii, subcererile pot fi împărțite în: | ||
* Subcereri în clauza WHERE | * Subcereri în clauza WHERE | ||
- | * Subcereri pe tabela temporală | + | * Subcereri în clauza FROM (Subcereri pe tabela temporală) |
* Subcereri în clauza HAVING | * Subcereri în clauza HAVING | ||
* Subcereri în clauza SELECT | * Subcereri în clauza SELECT | ||
* Subcereri în clauza ORDER BY | * Subcereri în clauza ORDER BY | ||
+ | |||
Subcererile pot fi împărțite pe mai multe categorii, în funcție de numărul de coloane sau linii pe care le returnează: | Subcererile pot fi împărțite pe mai multe categorii, în funcție de numărul de coloane sau linii pe care le returnează: | ||
* Subcereri care întorc o valoare | * Subcereri care întorc o valoare | ||
Line 26: | Line 39: | ||
<note important>Această împărțire pe categorii (în funcție de numărul de coloane și linii pe care le întoarce subcererea) a subcererilor se aplică atât pentru subcererile necorelate cât și pentru cele corelate. | <note important>Această împărțire pe categorii (în funcție de numărul de coloane și linii pe care le întoarce subcererea) a subcererilor se aplică atât pentru subcererile necorelate cât și pentru cele corelate. | ||
</note> | </note> | ||
+ | |||
+ | Subcererile pot fi împărțite în două categorii, în funcție de modul în care sunt corelate cu cererea principală (cerea care cuprinde subcererea): | ||
+ | * Subcereri necorelate: rezultatul subcererii **nu** este condiționat de valorile din cererea principală | ||
+ | * Subcereri corelate: rezultatul subcererii este condiționat de valorile din cererea principală | ||
Când folosim subcereri, trebuie să respectăm câteva reguli: | Când folosim subcereri, trebuie să respectăm câteva reguli: | ||
Line 38: | Line 55: | ||
* În subcereri se pot folosi operatori de mulțimi; | * În subcereri se pot folosi operatori de mulțimi; | ||
* Subcererile pot fi imbricate până la nivelul 255; | * Subcererile pot fi imbricate până la nivelul 255; | ||
- | * În clauza SELECT o subcerere trebuie să întoarcă o singură linie. | + | * În clauza SELECT o subcerere trebuie să întoarcă o singură valoare. |
- | ==== Subcereri necorelate ==== | + | ==== Subcereri necorelate în clauza WHERE ==== |
* Subcererile necorelate sunt subcereri care nu au o legătură de asociere între expresiile cererii exterioare și cele ale cererii interioare. | * Subcererile necorelate sunt subcereri care nu au o legătură de asociere între expresiile cererii exterioare și cele ale cererii interioare. | ||
* O subcerere necorelată se execută o singură dată și se execută prima în momentul când începe execuția cererii principale. | * O subcerere necorelată se execută o singură dată și se execută prima în momentul când începe execuția cererii principale. | ||
- | === Subcereri necorelate în clauza WHERE === | + | * Subcererea necorelată în clauza WHERE se construiește prima pentru a verifica condiția din caluza WHERE. |
- | * Subcererea necorelată se construiește prima pentru a verifica condiția din caluza WHERE. | + | * Condiția din subcererea necorelată din clauza WHERE se verifică pe datele din tabela folosită în cererea principală. |
- | * Condiția se verifică pe datele din tabela folosită în cererea principală. | + | |
Line 133: | Line 149: | ||
<color red>Ex. 6.</color> Să se afișeze angajatii care au venitul lunar minim pe fiecare departament. | <color red>Ex. 6.</color> Să se afișeze angajatii care au venitul lunar minim pe fiecare departament. | ||
{{ :bd:laboratoare:lab8_ex6_new.png?nolink&450 |}} | {{ :bd:laboratoare:lab8_ex6_new.png?nolink&450 |}} | ||
- | <color red>Ex. 7.</color> Să se afișeze angajații care au salariul mai mare decât salariul maxim din departamentul SALES. | + | <color red>Ex. 7.</color> Să se afișeze angajații care au salariul mai mare decât salariul maxim din departamentul SALES. Acesta este un exemplu de subcereri imbricate (in total 3 nivele), subcererile insa NU intorc mai multe linii in final, ci o singura valoare. |
{{ :bd:laboratoare:lab8_7_new.png?nolink&450 |}} | {{ :bd:laboratoare:lab8_7_new.png?nolink&450 |}} | ||
- | ==== Subcereri corelate ==== | + | |
+ | ==== Subcereri corelate în clauze WHERE ==== | ||
Subcererile corelate se execută o singură dată pentru fiecare linie candidat prelucrată de cererea principală. O subcerere corelată se join-ează cu cererea exterioară prin folosirea unei coloane a cererii exterioare în clauza predicatului cererii interioare. | Subcererile corelate se execută o singură dată pentru fiecare linie candidat prelucrată de cererea principală. O subcerere corelată se join-ează cu cererea exterioară prin folosirea unei coloane a cererii exterioare în clauza predicatului cererii interioare. | ||
Line 159: | Line 176: | ||
Deși o subcerere corelată se execută de mai multe ori, acest lucru nu implică că subcererile corelate sunt mai ineficiente decât subcererile necorelate. | Deși o subcerere corelată se execută de mai multe ori, acest lucru nu implică că subcererile corelate sunt mai ineficiente decât subcererile necorelate. | ||
- | <color red>Ex. 8.</color> Să se afișeze angajații care au salariul peste valoare media a departamentului din care fac parte. | + | <color red>Ex. 8.</color> Să se afișeze angajații care au salariul peste valoarea medie a departamentului din care fac parte. |
{{ :bd:laboratoare:lab8_8_new.png?nolink&450 |}} | {{ :bd:laboratoare:lab8_8_new.png?nolink&450 |}} | ||
- | <color red>Ex. 9.</color> Să se mărească salariile angajaților cu 10% din salariul mediu și să se acorde la toți angajații un comision egal cu comisionul mediu pe fiecare departament, numai pentru persoanele angajate înainte de 1-JUN-1981. | + | <color red>Ex. 9.</color> Să se mărească salariile angajaților cu 10% din salariul mediu și să se acorde tuturor angajaților un comision egal cu comisionul mediu pe departamentul din care face parte angajatul, numai pentru persoanele angajate înainte de 1-JUN-1981. |
{{ :bd:laboratoare:lab8_9_new.png?nolink&450 |}} | {{ :bd:laboratoare:lab8_9_new.png?nolink&450 |}} | ||
- | ==== Subcereri pe tabelă temporară ==== | + | |
+ | ==== Subcereri pe tabelă temporară (în clauza FROM) ==== | ||
* Aceste subcereri se întâlnesc în cazul în care se folosește o subcerere la nivelul clauzei FROM; | * Aceste subcereri se întâlnesc în cazul în care se folosește o subcerere la nivelul clauzei FROM; | ||
* În clauza FROM se pot folosi doar subcereri necorelate; | * În clauza FROM se pot folosi doar subcereri necorelate; | ||
Line 189: | Line 208: | ||
{{ :bd:laboratoare:lab8_10b_new.png?nolink&450 |}} | {{ :bd:laboratoare:lab8_10b_new.png?nolink&450 |}} | ||
+ | ==== Exerciții individuale ==== | ||
+ | |||
+ | Să se selecteze numele angajatului, numele departamentului si salariul pentru angajatii care au salariul egal cu salariul minim din departamentul in care lucreaza. Ordonati dupa nume. | ||
+ | Rezolvati prin 4 metode: | ||
+ | * o metoda care sa foloseasca o subcerere care intoarce o valoare | ||
+ | * o metoda care sa foloseasca o subcerere care intoarce o linie cu mai multe coloane | ||
+ | * o metoda care sa foloseasca o subcerere care intoarce mai multe linii cu mai multe coloane | ||
+ | * o metoda care sa foloseasca o subcerere in clauza from | ||