Regsirea datelor din mai multe tabele Obiective n
Regăsirea datelor din mai multe tabele
Obiective În această lecție vom învăța: • Cum se pot prelua informații din mai multe tabele simultan • Care sunt tipurile de join existente • Cum se realizează fiecare tip de join folosind sintaxa Oracle • Cum se realizează fiecare tip de join folosind sintaxa ANSI
Dobândirea cunoștințelor • În capitolele anterioare am aflat cum putem afișa informații din baza de date, folosind o singură tabelă. • Unul din rezultatele procesului de normalizare este acela că datele sunt memorate de cele mai multe ori în tabele diferite. De aceea atunci când dorim să afișăm diferite rapoarte e posibil să avem nevoie de date din mai multe tabele, folosind o singură comandă SQL. Acest lucru este posibil folosind o operație join sau interogare multiplă. • În Oracle există două modalități de a scrie joinurile: folosind sintaxa specifică Oracle și folosind sintaxa ANSI/OSI.
Dobândirea cunoștințelor • În tabelul de mai jos vom arăta că există mai multe moduri de legare a tabelelor folosind ambele sintaxe:
Dobândirea cunoștințelor Reguli de folosire a opțiunii NATURAL JOIN: ü Tabelele sunt legate pe toate coloanele cu nume comun ü Coloanele cu nume comun trebuie să aibă același tip ü În clauza SELECT coloanele comune celor două tabele NU vor fi prefațate de alias-ul tabelei
Dobândirea cunoștințelor • Pentru a lega două tabele folosind sintaxa ANSI, dar condiția de egalitate să fie pusă doar pe anumite coloane, nu pe toate coloanele cu nume comun, se va folosi în loc de NATURAL JOIN clauza JOIN, iar coloanele pe care se face join-ul se precizează în opțiunea USING, separate prin virgulă. • Coloanele din clauza USING trebuie să aibă același nume, dar tipuri diferite în cele două tabele.
Dobândirea cunoștințelor • Dacă în cele două tabele nu există coloane cu același nume, se va folosi clauza JOIN în conjuncție cu ON. • Exemple: Creaţi un produs cartezian care afişează numele clienţilor, id_ul agenţilor de închirieri şi numele acestora. SELECT c. nume, ai. id_ang, ai. nume FROM clienti c, agenti_inchirieri ai WHERE c. nume LIKE 'D%' sau SELECT c. nume, ai. id_ang, ai. nume FROM clienti c CROSS JOIN agenti_inchirieri ai WHERE c. nume LIKE 'D%'
Dobândirea cunoștințelor Pentru fiecare client afişaţi numele şi adresa. SELECT nume, strada, nr, bloc, ap, judet, localitatea FROM clienti c, adrese ad WHERE c. id_adresa=ad. id_adresa sau SELECT nume, strada, nr, bloc, ap, judet, localitatea FROM clienti NATURAL JOIN adrese sau SELECT nume, strada, nr, bloc, ap, judet, localitatea FROM clienti c JOIN adrese ad USING(id_adresa) sau SELECT nume, strada, nr, bloc, ap, judet, localitatea FROM clienti c JOIN adrese ad ON(c. id_adresa=ad. id_adresa)
Dobândirea cunoștințelor
Dobândirea cunoștințelor
Dobândirea cunoștințelor • Fie tabela categorie_varsta: CREATE TABLE categorie_varsta(varsta_min NUMBER(2), varsta_max NUMBER(2), categorie NUMBER(2)) INSERT INTO categorie_varsta VALUES(20, 30, 1) INSERT INTO categorie_varsta VALUES(31, 40, 2) INSERT INTO categorie_varsta VALUES(41, 60, 3) • Afişaţi numele, vârsta şi categoria de vârstă pentru toţi agentii de închirieri. SELECT nume, TRUNC((SYSDATE-data_nast)/366) varsta , categorie FROM agenti_inchirieri , categorie_varsta WHERE TRUNC((SYSDATE-data_nast)/366)BETWEEN varsta_min AND varsta_max
Dobândirea cunoștințelor sau SELECT nume, TRUNC((SYSDATE-data_nast)/366) varsta , categorie FROM agenti_inchirieri JOIN categorie_varsta ON(TRUNC((SYSDATE-data_nast)/366)BETWEEN varsta_min AND varsta_max) • Pentru fiecare angajat din tabela altii afişaţi numele acestuia şi al şefului său. SELECT a. nume angajat, b. nume sef FROM altii a, altii b WHERE(a. id_sef=b. id_ang)
Dobândirea cunoștințelor Pentru fiecare client afişaţi numele, id-ul şi numele agentului de închirieri. Includeţi toţi clienţii chiar dacă nu au asociat niciun agent. SELECT c. nume client, ai. id_ang, ai. nume agent FROM clienti c, agenti_inchirieri ai WHERE c. id_ang=ai. id_ang(+) sau SELECT c. nume client, ai. id_ang, ai. nume agent FROM clienti c LEFT OUTER JOIN agenti_inchirieri ai ON( c. id_ang=ai. id_ang)
Dobândirea cunoștințelor Pentru fiecare client afişaţi numele, id-ul şi numele agentului de închirieri. Includeţi toţi agenţii chiar dacă nu au asociat niciun client. SELECT c. nume client, ai. id_ang, ai. nume agent FROM clienti c, agenti_inchirieri ai WHERE c. id_ang(+)=ai. id_ang sau SELECT c. nume client, a. id_ang, a. nume agent FROM clienti c RIGHT OUTER JOIN agenti_inchirieri a ON( c. id_ang=a. id_ang)
Dobândirea cunoștințelor • Afişaţi toate înregistrările din tabela clienti şi din tabela agenti_inchirieri, indiferent dacă au sau nu corespondent în cealaltă tabelă. SELECT c. nume client, a. id_ang, a. nume agent FROM clienti c FULL OUTER JOIN agenti_inchirieri a ON( c. id_ang=a. id_ang)
- Slides: 15