160 likes | 298 Views
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
E N D
Obiective În această lecție vom învăța: • Cum se pot preluainformaț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 celemai multe ori în tabele diferite. De aceea atunci când dorim să afișăm diferite rapoarte eposibil să avem nevoie de date din mai multe tabele, folosind o singură comandă SQL. Acestlucru este posibil folosind o operație join sau interogare multiplă. • În Oracle există două modalități de a scrie join-urile: 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 folosindambele sintaxe:
Dobândirea cunoștințelor Reguli de folosire a opțiunii NATURAL JOIN: • Tabelelesunt legate petoatecoloanele cu numecomun • Coloanele cu numecomuntrebuie 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 FROMclienti c,agenti_inchirieri ai WHEREc.numeLIKE 'D%' sau SELECT c.nume, ai.id_ang, ai.nume FROM clienti c CROSS JOIN agenti_inchirieri ai WHEREc.numeLIKE '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 WHEREc.id_adresa=ad.id_adresa sau SELECT nume, strada, nr, bloc,ap, judet, localitatea FROMclienti 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 • Fie tabela categorie_varsta: CREATE TABLE categorie_varsta(varsta_min NUMBER(2), varsta_max NUMBER(2),categorie NUMBER(2)) INSERT INTO categorie_varstaVALUES(20,30,1) INSERT INTO categorie_varstaVALUES(31,40,2) INSERT INTO categorie_varstaVALUES(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 FROMagenti_inchirieri ,categorie_varsta WHERETRUNC((SYSDATE-data_nast)/366)BETWEENvarsta_min AND varsta_max
Dobândirea cunoștințelor sau SELECT nume,TRUNC((SYSDATE-data_nast)/366) varsta ,categorie FROMagenti_inchirieriJOIN categorie_varsta ON(TRUNC((SYSDATE-data_nast)/366)BETWEENvarsta_min AND varsta_max) • Pentru fiecare angajat din tabela altii afişaţi numele acestuia şi al şefului său. SELECT a.numeangajat, b.numesef FROMaltii 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ţiichiardacă nu au asociatniciun agent. SELECT c.nume client, ai.id_ang, ai.nume agent FROM clienti c, agenti_inchirieri ai WHEREc.id_ang=ai.id_ang(+) sau SELECT c.nume client, ai.id_ang, ai.nume agent FROMclienti c LEFT OUTERJOINagenti_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ţiichiardacă nu au asociatniciun client. SELECT c.nume client, ai.id_ang, ai.nume agent FROM clienti c, agenti_inchirieri ai WHEREc.id_ang(+)=ai.id_ang sau SELECT c.nume client, a.id_ang, a.nume agent FROMclienti c RIGHTOUTERJOINagenti_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, indiferentdacă au sau nu corespondentîncealaltătabelă. SELECT c.nume client, a.id_ang, a.nume agent FROMclienti c FULL OUTERJOINagenti_inchirieri a ON( c.id_ang=a.id_ang)