Differences

This shows you the differences between two versions of the page.

Link to this comparison view

bd:laboratoare:08 [2019/03/02 22:05]
iulia.radulescu [Subcereri corelate]
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-comandă SQL și a modului de a face construcția comenzii, subcererile pot fi împărțite în:+Dacă există ​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
   * Subcereri care întorc o coloană   * Subcereri care întorc o coloană
   * Subcereri care întorc o linie   * Subcereri care întorc o linie
-  * Subcereri care întorc mai multe +  * Subcereri care întorc mai multe linii
 <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 64: Line 80:
 </​code>​ </​code>​
  
-**[table_1.]expr_k** – sunt expresii pe coloanele(sau doar coloane) care aparțin tabelului table_1, k = 1..n ; +**[table_1.]expr_k** – sunt expresii pe coloanele(sau doar o coloană) care aparțin tabelului table_1, k=1..n;\\ 
-**[table_2.]expr_i** – este o expresie pe coloanele(sau doar o coloană) care aparțin tabelului table_2; +**[table_2.]expr_i** – este o expresie pe coloanele(sau doar o coloană) care aparțin tabelului table_2; ​\\ 
-OPERATOR – este mulțimea operatorilor de comparație {>, >=, =, <=, <} ; +OPERATOR – este mulțimea operatorilor de comparație {>, >=, =, <​nowiki>​<=</​nowiki>​, <};\\ 
-**conditions_1** – sunt condițiile din clauza WHERE (opțională) a subcererii;+**conditions_1** – sunt condițiile din clauza WHERE (opțională) a subcererii; ​\\
 **conditions_2** – sunt condițiile din clauza HAVING (opțională) a subcererii; **conditions_2** – sunt condițiile din clauza HAVING (opțională) a subcererii;
  
Line 93: Line 109:
  
 <color red>Ex. 2.</​color>​ Să se selecteze angajații care au funcții similare funcțiilor din departamentul 20 și nu lucrează în acest departament. <color red>Ex. 2.</​color>​ Să se selecteze angajații care au funcții similare funcțiilor din departamentul 20 și nu lucrează în acest departament.
-{{ :​bd:​laboratoare:​lab8_2_new.png?​nolink&​300 |}}+{{ :​bd:​laboratoare:​lab8_2_new.png?​nolink&​450 |}}
 <color red>Ex. 3.</​color>​ Să se selecteze angajații care nu s-au angajat în lunile decembrie, ianuarie și februarie. <color red>Ex. 3.</​color>​ Să se selecteze angajații care nu s-au angajat în lunile decembrie, ianuarie și februarie.
-{{ :​bd:​laboratoare:​lab8_3_new.png?​nolink&​300 |}}+{{ :​bd:​laboratoare:​lab8_3_new.png?​nolink&​450 |}}
 <color red>Ex. 4.</​color>​ Să se selecteze angajații care au salariile in lista de salarii maxime pe departament. <color red>Ex. 4.</​color>​ Să se selecteze angajații care au salariile in lista de salarii maxime pe departament.
-{{ :​bd:​laboratoare:​lab8_4_new.png?​nolink&​300 |}}+{{ :​bd:​laboratoare:​lab8_4_new.png?​nolink&​250 |}}
  
 == Subcereri necorelate care întorc o linie în clauza WHERE == == Subcereri necorelate care întorc o linie în clauza WHERE ==
Line 114: Line 130:
 </​code>​ </​code>​
 <color red>Ex. 5.</​color>​ Să se selecteze angajații care au venit în același an și au aceeași funcție cu angajatul care are numele JONES. <color red>Ex. 5.</​color>​ Să se selecteze angajații care au venit în același an și au aceeași funcție cu angajatul care are numele JONES.
-{{ :​bd:​laboratoare:​lab8_5_new.png?​nolink&​300 |}}+{{ :​bd:​laboratoare:​lab8_5_new.png?​nolink&​450 |}}
  
 == Subcereri necorelate care întorc mai multe linii în clauza WHERE == == Subcereri necorelate care întorc mai multe linii în clauza WHERE ==
Line 132: Line 148:
 </​code>​ </​code>​
 <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&​300 |}} +{{ :​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&​300 |}} +{{ :​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 186: Line 205:
  
 <color red>Ex. 10.</​color>​ Să se afle salariul maxim pentru fiecare departament. <color red>Ex. 10.</​color>​ Să se afle salariul maxim pentru fiecare departament.
-{{ :​bd:​laboratoare:​lab08.ex10a.png?​nolink&​300 |}} +{{ :​bd:​laboratoare:​lab8_10_new.png?​nolink&​450 |}} 
-{{ :​bd:​laboratoare:​lab08.ex10b.png?​nolink&​300 |}}+{{ :​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
  
  
  
bd/laboratoare/08.1551557104.txt.gz · Last modified: 2019/03/02 22:05 by iulia.radulescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0