This shows you the differences between two versions of the page.
bd:laboratoare:08 [2021/04/13 13:42] ciprian.truica |
bd:laboratoare:08 [2023/04/24 12:32] (current) sorin.ciolofan [Subcereri corelate în clauze WHERE] |
||
---|---|---|---|
Line 3: | Line 3: | ||
==== Obiective ==== | ==== Obiective ==== | ||
* Subcereri | * Subcereri | ||
- | * Subcereri în clauze WHERE | + | * Subcereri necorelate în clauze WHERE |
- | * Subcereri corelate | + | * Subcereri corelate în clauze WHERE |
* Subcereri în clauze FROM | * Subcereri în clauze FROM | ||
Line 21: | 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 36: | 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 48: | 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 143: | 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 169: | 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 tuturor angajaților 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 |}} | ||
Line 202: | Line 209: | ||
==== Exerciții individuale ==== | ==== 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 | ||