Metode JOIN în Baze de Date

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson
Download our mobile app to listen on the go
Get App

Questions and Answers

Ce tip de JOIN este folosit pentru a returna toate liniile din ambele tabele, indiferent dacă există sau nu o potrivire?

  • INNER JOIN
  • FULL OUTER JOIN (correct)
  • LEFT JOIN
  • RIGHT JOIN

În ce situație este potrivit un SELF JOIN?

  • Când dorești să combini date din tabele diferite.
  • Când vrei să calculezi agregări pe grupuri de date.
  • Când dorești să compari date din aceeași tabelă. (correct)
  • Când vrei să excluzi anumite rânduri din rezultat.

Care este rezultatul unui PRODUS CARTEZIAN între două tabele?

  • O tabelă cu rândurile comune ambelor tabele.
  • O tabelă cu rândurile care se potrivesc între cele două tabele bazat pe o condiție specifică.
  • O tabelă cu rândurile din prima tabelă care nu au o potrivire în a doua tabelă.
  • O tabelă cu toate combinațiile posibile de rânduri din cele două tabele. (correct)

Ce operatori sunt utilizați în JOIN-uri verticale?

<p>UNION, INTERSECT, MINUS (D)</p> Signup and view all the answers

Ce se întâmplă dacă omitem clauza WHERE într-o interogare cu JOIN clasic (fără OUTER)?

<p>Se execută un <code>PRODUS CARTEZIAN</code>. (B)</p> Signup and view all the answers

Care dintre următoarele afirmații este adevărată despre un EQUI-JOIN?

<p>Specifică o egalitate între coloanele a două sau mai multe tabele. (C)</p> Signup and view all the answers

Ce tip de JOIN ar trebui folosit pentru a lista angajații și, de asemenea, departamentele care nu au angajați?

<p><code>LEFT OUTER JOIN</code> (A)</p> Signup and view all the answers

Care este funcția clauzei USING în sintaxa JOIN din SQL-3?

<p>Specifică coloanele comune pentru <code>JOIN</code> fără a folosi aliasuri sau nume de tabel prefixate. (D)</p> Signup and view all the answers

Ce reprezintă aliasurile de tabel (table aliases) într-o interogare SQL cu JOIN?

<p>Nume alternative, scurte, atribuite tabelelor pentru a simplifica referirea la ele în interogare. (C)</p> Signup and view all the answers

Ce restricție importantă există în utilizarea clauzei NATURAL JOIN?

<p>Coloanele utilizate pentru <code>JOIN</code> trebuie să aibă același nume în ambele tabele. (C)</p> Signup and view all the answers

Într-un LEFT OUTER JOIN, ce se întâmplă cu rândurile din tabelul din stânga care nu au corespondent în tabelul din dreapta?

<p>Sunt incluse în rezultat, cu valorile coloanelor din tabelul din dreapta setate la <code>NULL</code>. (A)</p> Signup and view all the answers

Care este diferența principală dintre un JOIN implicit (cel cu virgule în clauza FROM și condiția în WHERE) și un JOIN explicit (folosind cuvintele cheie JOIN, ON, USING)?

<p><code>JOIN</code>-urile explicite sunt mai clare și mai ușor de întreținut, permițând separarea condițiilor de <code>JOIN</code> de alte condiții. (B)</p> Signup and view all the answers

În ce situație utilizarea unui FULL OUTER JOIN este deosebit de utilă?

<p>Când doriți să vedeți toate rândurile din ambele tabele, indiferent dacă au sau nu corespondent unele cu altele. (C)</p> Signup and view all the answers

Ce înseamnă că tabela A este "mai săracă dpdv al JOIN-ului" față de tabela B într-un context de OUTER JOIN?

<p>Toate rândurile din <code>tabela A</code> au corespondent în <code>tabela B</code>, dar există rânduri în <code>tabela B</code> fără corespondent în <code>tabela A</code>. (A)</p> Signup and view all the answers

Care este scopul folosirii NVL(A.COMM, 0) în exemplul cu SELF JOIN pentru calculul venitului angajaților versus cel al șefilor?

<p>Pentru a înlocui valorile <code>NULL</code> din coloana <code>COMM</code> cu 0, astfel încât să nu afecteze calculul venitului. (D)</p> Signup and view all the answers

Cum se realizează un JOIN folosind sintaxa SQL-3 pentru a obține toate rândurile din tabela A și numai rândurile corespunzătoare din tabela B, dar folosind sintaxa specifica OUTER JOIN (nu cea cu (+))?

<p><code>SELECT * FROM A LEFT OUTER JOIN B ON A.id = B.id;</code> (D)</p> Signup and view all the answers

Cum se pot combina rezultatele a două interogări SELECT care returnează coloane cu tipuri de date diferite, folosind UNION?

<p>Se pot combina dacă se folosesc funcții de conversie explicită a tipurilor de date (ex: <code>CAST</code>, <code>CONVERT</code>) pentru a le face compatibile. (C)</p> Signup and view all the answers

Care este implicația utilizării incorecte a unui PRODUS CARTEZIAN într-o bază de date mare?

<p>Va rezulta într-un set de date masiv, consumând resurse semnificative și, eventual, blocând serverul. (B)</p> Signup and view all the answers

Care este semnificația marcajului (+) într-o clauză WHERE dintr-un OUTER JOIN (ex: a.id_dep = b.id_dep(+)?

<p>Indică faptul că toate rândurile din tabela respectivă trebuie incluse în rezultat, chiar dacă nu există potrivire în cealaltă tabelă. (D)</p> Signup and view all the answers

Cum ai scrie o interogare echivalentă celei de mai jos, dar folosind sintaxa JOIN implicita? SELECT c.den_dep, a.nume FROM angajati a JOIN departamente c ON a.id_dep=c.id_dep

<p><code>SELECT c.den_dep, a.nume FROM angajati a, departamente c WHERE a.id_dep=c.id_dep</code> (B)</p> Signup and view all the answers

Flashcards

Metode de JOIN

Extragerea datelor din mai multe tabele folosind SELECT.

Ce este un EQUI-JOIN?

Într-un EQUI-JOIN, condiția de JOIN folosește doar egalități.

Ce este un NON EQUI-JOIN?

Permite JOIN-ul chiar și fără coloane comune utilizând operatori, nu doar egalități.

Ce este un SELF JOIN?

Un JOIN al unei tabele cu ea însăși. Util pentru date ierarhice.

Signup and view all the flashcards

Ce este Produsul Cartezian sau CROSS JOIN?

Combină fiecare rând dintr-o tabelă cu fiecare rând din cealaltă, fără condiții.

Signup and view all the flashcards

Ce este un JOIN EXTERN (OUTER JOIN)?

Selecție de linii care îndeplinesc condițiile, plus unele care nu le îndeplinesc.

Signup and view all the flashcards

Ce este LEFT OUTER JOIN?

Un OUTER JOIN care păstrează toate rândurile din tabela din stânga.

Signup and view all the flashcards

Ce este RIGHT OUTER JOIN?

Un OUTER JOIN care păstrează toate rândurile din tabela din dreapta.

Signup and view all the flashcards

Ce este un JOIN VERTICAL?

Combină rezultatele a două sau mai multe SELECT-uri.

Signup and view all the flashcards

Reguli de JOIN

Condițiile de JOIN trebuie să lege toate tabelele între ele.

Signup and view all the flashcards

Lipsa conditiei de JOIN

Când condiția de JOIN lipsește, rezultă un PRODUS CARTEZIAN.

Signup and view all the flashcards

Ce rol are SQL-3?

Permite utilizarea sintaxei standardizate pentru JOIN-uri.

Signup and view all the flashcards

Ce face USING în SQL-3?

O clauză care specifică coloanele comune pentru JOIN.

Signup and view all the flashcards

Ce face ON în SQL-3?

Implementează un JOIN general cu orice condiție și filtre suplimentare.

Signup and view all the flashcards

Ce este un 'NATURAL JOIN' ?

O selecție echivalentă cu echi-join.

Signup and view all the flashcards

La ce folosește OUTER JOIN ?

Păstrează toate rândurile, inclusiv cele fără corespondențe.

Signup and view all the flashcards

Study Notes

Introducere

  • Acest curs practic se concentrează pe metodele JOIN în bazele de date.
  • Sunt incluse metodele Equi JOIN, Non Equi JOIN, Self JOIN, produsul cartezian (CROSS JOIN), reguli de JOIN și metode de JOIN în SQL-3.
  • Cursul se va termina cu o listă de referințe bibliografice.

Anunț Școala de Vară VLDB 2025

  • VLDB Summer School 2025 va avea loc între 28-31 iulie 2025 la Universitatea din Wrocław, Polonia.
  • Tema este "Trustworthy Processing of Very Large Databases: Foundational Topics, Systems, Reliability & Security, Applications".
  • Scopul este de a reuni studenți cercetători și experți internaționali în Database Management Systems.
  • Școala de vară va oferi educație privind subiecte de actualitate și va facilita schimbul de experiență între participanți și experți.
  • Mai multe informații pot fi găsite la https://vldb-sc25.cs.uni.wroc.pl/.

Metode de Join: Sintaxă și Parametri

  • Pentru a extrage date din mai multe tabele, se utilizează metode de JOIN cu comanda SELECT.
  • Sintaxa generală pentru un join simplu este: SELECT [DISTINCT,ALL] [table].expresion expr_alias FROM [schema.table1] table1_alias, [schema.table2] table2_alias, WHERE table1_alias.column=table2_alias.column ORDER BY expresion(position)] [ASC,DESC]

Parametrii comenzii SELECT

  • DISTINCT returnează o linie dacă cererea are linii duplicate
  • ALL returnează toate liniile simple și duplicate
  • schema.table reprezintă schema de identificare tabelară specificată prin user.table_name
  • expresion reprezintă un nume de coloană sau o expresie (* selectează toate coloanele tabelelor din clauza FROM)
  • expr_alias este un nume alocat unei expresii folosită în formatarea coloanei
  • table_alias este un nume alocat unei tabele folosit în cereri corelate
  • WHERE reprezintă o clauză care trebuie îndeplinită pentru criteriul de selecție
  • ORDER BY expresion(position) ordonează liniile selectate după coloanele indicate în expresie

EQUI-JOIN

  • Un equi-join apare când condiția de join include doar egalități între tabele/entități.
  • Pentru a realiza un join pe mai multe tabele, acestea trebuie să aibă coloane de același tip, cu date comune sau corelate.
  • Exemplu: Selectarea id-ului și denumirii departamentului, a numelui, a funcției din tabelele angajati și departamente
  • SELECT a.id_dep, b.den_dep depart, a.nume, a.functie FROM angajati a, departamente b WHERE a.id_dep=b.id_dep and a.id_dep=10;
  • Aliasurile sunt folosite pentru a evita ambiguitatea referirii coloanelor cu același nume.

NON EQUI-JOIN

  • Un Non Equi-Join este folosit atunci când în condiția de join sunt utilizați alți operatori decât cel de egalitate sau două tabele fără coloane comune trebuie relationate.
  • Exemplu: Relația dintre tabelele angajati și grila_salariu este un non-equi-join.
  • Pentru a evalua gradul de salarizare al unui angajat, trebuie sa consultam grila de salarizare pentru a identifica in ce plaja de salariu se incadreaza salariul.
  • Exemplu: SELECT a.nume, a.salariu, b.grad FROM angajati a, grila_salariu b WHERE a.salariu BETWEEN b.nivel_inf AND b.nivel_sup AND a.id_dep=20;

Utilizare Equi-Join și Non Equi-Join Combinat

  • Sunt situatie in care trebuie sa folosim si equi-join si non equi-join intr-o cerere
  • In exemplul anterior, daca dorim sa listam si departamentul, va trebui sa facem join intre trei tabele:
  • SQL> SELECT c.den_dep,a.nume, a.salariu, b.grad FROM angajati a, grila_salariu b, departamente c WHERE a.salariu BETWEEN b.nivel_inf AND b.nivel_sup AND a.id_dep=c.id_dep AND a.id_dep=20;

SELF JOIN

  • Self Join reprezintă joinul unei tabele cu ea însăși.
  • Se folosește când trebuie extrase date corelate din aceeași tabelă.
  • Exemplu: Afișarea sefilor angajatilor
  • SQL> SELECT a.nume nume_ang, a.functie functie_ang, b.nume nume_sef, b.functie functie_sef FROM angajati a, angajati b WHERE a.id_sef=b.id_ang AND a.id_dep=10;

CROSS JOIN (Produsul Cartezian)

  • Produsul cartezian se obține prin concatenarea fiecărei linii a unei tabele cu fiecare linie din cealaltă, rezultând un număr de linii egal cu produsul numărului de linii din fiecare tabelă.
  • SQL> SELECT nume ,functie ,den_dep FROM angajati , departamente WHERE functie='DIRECTOR';
  • Această situație apare când sunt puse greșit condiții în clauza WHERE.
  • Poate aduce în același SELECT date din mai multe instanțe separate ale tabelelor.

JOIN EXTERN (OUTER JOIN)

  • Permite selectarea liniilor care îndeplinesc condițiile din clauza WHERE, dar și a liniilor care nu îndeplinesc toate condițiile.
  • Se realizează un OUTER JOIN pentru a aduce în setul de date întors de SELECT și înregistrarea aferentă departamentului OPPERATIONS (DEPTNO=40)
  • SQL> SELECT a.id_dep, a.den_dep, b.nume, b.functie FROM departamente a, angajati b WHERE a.id_dep=b.id_dep(+);

Variante Outer Join

  • Variantă cu operatorul (+), care se pune în dreptul coloanei tabelei mai sărace dpdv al JOIN-ului și variantă cu sintaxă specifică LEFT OUTER JOIN, LEFT INDICÂND TABELA MAI BOGATĂ.
  • SQL> SELECT b.id_dep departament, a.nume nume_ang, a.data_ang, a.salariu FROM angajati a , departamente b WHERE a.id_dep(+)=b.id_dep;
  • Semnul (+) se pune în dreptul tabelei deficitare ca informații.
  • Se poate folosi și operatorul BETWEEN într-un join extern (SELECT c.den_dep, a.nume, a.salariu3 salariu_nou, a.comision, b.grad FROM angajati a, grila_salariu b, departamente c WHERE a.salariu3+ nvl(a.comision,0) BETWEEN b.nivel_inf(+) AND b.nivel_sup(+) AND a.id_dep=c.id_dep ;)

JOIN VERTICAL

  • Join-ul vertical este folosit pentru prelucrarea liniilor returnate de mai multe cereri SELECT și folosește operatorii UNION (reuniune), INTERSECT (intersectie), MINUS (diferenta).
  • Join-ul se face după coloane de același tip.

Reuniune(UNION)

  • Trebuie retinut ca reuniunea se poate face pe coloane declarate de acelasi tip (number,varchar, date), chiar daca au semnificatii diferite.
  • Exemple:
  • SQL> SELECT id_dep,nume,functie,salariu FROM angajati WHERE id_dep=10 UNION SELECT id_dep,nume,functie,salariu FROM angajati WHERE id_dep=30;
  • SQL> SELECT A.ENAME ANGAJAT, NVL(A.COMM, 0) COMISION, A.SAL+ NVL(A.COMM, 0) VENIT, 'FOARTE BUN' "CALIFICATIV VENIT" FROM EMP A WHERE NVL(A.COMM, 0) >0 AND A.SAL+ NVL(A.COMM, 0)>2500 UNION SELECT A.ENAME ANGAJAT, NVL(A.COMM, 0) COMISION, A.SAL+ NVL(A.COMM, 0) VENIT, 'BUN' "CALIFICATIV VENIT" FROM EMP A WHERE NVL(A.COMM, 0) >0 AND A.SAL+ NVL(A.COMM, 0)<=2500

Diferenta(MINUS)

  • Pentru a afla care sunt functiile din departamentul 10 care nu se regasesc in departamentul 30, folosim operatorul MINUS:
  • SQL> SELECT functie FROM angajati WHERE id_dep = 10 MINUS SELECT functie FROM angajati WHERE id_dep = 30;

Reguli de JOIN

  Atunci cand conditia de join lipseste, fiecare linie a unei tabele din lista FROM este asociata cu fiecare linie a celorlalte tabele, obtinandu-se de fapt produsul cartezian al acestora.
  Daca in conditia de join apar numai egalitati operatia este numita si equi-join. In celelalte cazuri avem un non-equi-join.
  In lista de tabele care participa la join o tabela poate sa apara repetat. O astfel de operatie este numita si joinul unei tabele cu ea insasi (self-join).
  In cazul in care o linie a unei tabele nu se coreleaza prin conditia de join cu nicio linie din celelalte tabele ea nu va participa la formarea rezultatului. Se poate insa obtine ca aceasta sa fie luata in considerare pentru rezultat, folosind un join extern (outer join).
  In cazul general al unui join pe N tabele, conditia de join este compusa din N - 1 subconditii conectate prin AND care relationeaza intreg ansamblul de tabele. Altfel spus, daca se construieste un graf al conditiei in care nodurile sunt tabele si arcele subconditii de join care leaga doua tabele, atunci acest graf trebuie sa fie conex.
  Marcajul de join extern se poate folosi si atunci cand conditia de join este compusa, cu exceptia cazului in care se foloseste OR sau operatorul de incluziune IN urmat de o lista care contine mai mult de o valoare.
  Joinul extern se poate folosi si in conjunctie cu operatorii specifici SQL.

Metode de JOIN în SQL-3

Pana la versiunea Oracle 9i sintaxa joinului in Oracle era diferita de standardul ANSI (American National Standards Institute).
Incepand cu aceasta versiune au fost introduse in limbaj si tipurile de join din standardul SQL-3(anul 1999) printre care cross-join, natural join si mai multe variante de outer join:
  CROSS JOIN – join pe produs cartezian
[INNER] JOIN … USING – join pe coloane comune
[INNER] JOIN … ON – join general
NATURAL JOIN – join natural
OUTER JOIN … ON – join extern
In clauza FROM avem perechi de tabele care participa la join.

CROSS JOIN

  • CROSS JOIN este folosit pentru otinerea produsul cartezian si are sintaxa:
  • SELECT [DISTINCT|ALL] [[table|table_alias].]{column|expression} [column_alias] FROM [schema.]table1 [table1_alias] CROSS JOIN [schema.]table2 [table2_alias] [other clauses]

Join cu USING

  • Utilizarea USING specifică coloanele comune pe care se bazează joinul.
  • SQL> SELECT id_dep, den_dep, nume, data_ang, sediu FROM angajati INNER JOIN departamente USING (id_dep);

Join general(JOIN..ON)

  • Conditia de join se pune in clauza ON. Sintaxa este:
  • SELECT [DISTINCT|ALL] {{table|table_alias}.}{column|expression} [column_alias] FROM [schema.]table1 [table1_alias] [INNER] JOIN [schema.]table2 [table2_alias] ON {{table1|table1_alias}.}column_fromTable1 = {{table2|table2_alias}.}column_fromTable2 [other clauses]

NATURAL JOIN

  In cazul folosirii clauzei NATURAL JOIN coloanele din cele doua tabele, pe care se face JOIN-ul, trebuie sa aiba aceeasi denumire.
  Nu se accepta aliasuri pentru coloanele comune (cele pe care se face NATURAL JOIN-ul).
  Daca coloanele au acelasi nume, nu se tine cont de tipul si semnificatia coloanelor si rezultatele pot fi eronate

OUTER JOIN

 Join-ul extern se foloseste cand se doreste ca in rezultat sa apara si liniile cu valori nule pe coloanele corespondente din tabelele relationate:
 LEFT In cazul join-ului extern stanga (LEFT OUTER JOIN), valorile nule provin din tabela2 (cea deficitara - săracă ca date). Sintaxa este:
 SELECT [DISTINCT|ALL] {{table|table_alias}.}{column|expression} [column_alias]
 FROM [schema.]table1 [table1_alias]
 LEFT [OUTER ] JOIN [schema.]table2 [table2_alias]
 ON {{table1|table1_alias}.}column_fromTable1 =         {{table2|table2_alias}.}column_fromTable2
 [other clauses]

Join-ului extern dreapta

  • In cazul join-ului extern dreapta (RIGHT OUTER JOIN), valorile nule provin din tabela1 (cea deficitara ca date).
  • Sintaxa este similara cu join extern stanga.

Recomandari bibliografice

  • Florin Radulescu, Alexandru Boicea, Baze de date online, Editura Oamenilor de Stiinta din Romania, 2011
  • Alexandru Boicea, Baze de date – Note de curs practic, Universitatea Politehnica din Bucuresti
  • Alexandru Boicea, Oracle SQL, SQLPlus*, Editura Printech, 2007

Studying That Suits You

Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

Quiz Team

Related Documents

More Like This

Use Quizgecko on...
Browser
Browser