Upload
others
View
25
Download
1
Embed Size (px)
Citation preview
Proiectarea bazelor de date
#5
Adrian Runceanuwww.runceanu.ro/adrian
2017
SQLInterogari din mai multe tabele (JOIN-uri)
Curs 5
Limbajul SQLInterogari din mai multe tabele
(JOIN-uri)
Curs 5-Proiectarea bazelor de date 205.04.2017
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE5.1.1. Cartesian Product5.1.2. Equijoin5.1.3. Non-equijoin5.1.4. Outer join5.1.5. Self join
5.2. JOIN-urile ANSI/ISO SQL995.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 3
5. Interogari din mai multe tabele (JOIN-uri)
Scopul acestui curs este de a studiamodalitatea preluării de date din mai multetabele.
Pentru a putea realiza acest lucru, făcândlegături între tabelele unei baze de date, putemfolosi:
1. JOIN-urile proprietate ORACLE
2. JOIN-urile ANSI/ISO SQL99
05.04.2017 Curs 5-Proiectarea bazelor de date 4
5. Interogari din mai multe tabele (JOIN-uri)Tipuri de JOIN-uri:
Join-uri proprietateORACLE
Join-uriSQL 1999
Cartesian Product Cross join
Equijoin Natural join
Non-equijoin Using clause
Outer join Full (two sided) outer joins
Self joinArbitrary join conditions for
outer joins05.04.2017 Curs 5-Proiectarea bazelor de date 5
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE
5.1.1. Cartesian Product
5.1.2. Equijoin
5.1.3. Non-equijoin
5.1.4. Outer join
5.1.5. Self join5.2. JOIN-urile ANSI/ISO SQL99
5.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 6
Cartesian Product and the Join Operations
JOIN-uri proprietatea OraclePentru a prelua date din mai multe tabele,
forma de bază a unei instrucţiuni SELECT constăîn adăugarea unei condiţii de legătură (join) în clauza WHERE
Numele coloanei trebuie prefixat de numele tabelei în situaţiile când acelaşi nume de coloanăapare în mai multe tabele.
05.04.2017 Curs 5-Proiectarea bazelor de date 7
Cartesian Product and the Join Operations
SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column1 = table2.column2;
05.04.2017 Curs 5-Proiectarea bazelor de date 8
Cartesian Product and the Join Operations
PRODUSUL CARTEZIAN (CARTESIAN PRODUCT)
Presupune că toate liniile din prima tabelă să fie unite (legate) cu toate liniile din tabela a doua.
Se produce atunci când:1) condiţia de join este omisă2) condiţia de join nu este validă
Pentru a evita produsul cartezian trebuie adăugată o condiţie de join validă.
Produsul cartezian generează foarte multe linii şi estefolosit foarte rar.05.04.2017 Curs 5-Proiectarea bazelor de date 9
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE
5.1.1. Cartesian Product
5.1.2. Equijoin
5.1.3. Non-equijoin
5.1.4. Outer join
5.1.5. Self join5.2. JOIN-urile ANSI/ISO SQL99
5.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 10
EquijoinEQUIJOINUneori denumit simple join sau inner join, un equijoin este o legătură între tabele care combină linii ce au valori echivalente pentru coloanele specificate.
Exemplu:SELECT angajati.angajati_id, angajati.nume,
angajati.nr_dept, departamente.nr_dept, departamente.id_locatie
FROM angajati, departamenteWHERE angajati.nr_dept = departamente.nr_dept
05.04.2017 Curs 5-Proiectarea bazelor de date 11
Equijoin
Cheie
străină
(Foreign
key)Cheie
primară
(Primary
key)
05.04.2017 Curs 5-Proiectarea bazelor de date 12
Equijoin
FOLOSIREA OPERATORULUI AND
Ca şi la interogările care folosesc o singură tabelă, se poate folosi operatorul AND pentru a restricţiona liniile selectate.
05.04.2017 Curs 5-Proiectarea bazelor de date 13
EquijoinALIAS-URI
Atunci când denumirile coloanelor şi tabelelor sunt mari, devine incomod de lucrat cu acestea.
Pentru a scurta denumirile respective, se folosesc alias-urile.
Se pot folosi alias-uri atât pentru coloane cât şi pentru tabele.
Dacă este precizat un alias pentru o tabelă în clauza FROM, atunci alias-ul respectiv trebuie să înlocuiascănumele tabelei în clauza SELECT.
05.04.2017 Curs 5-Proiectarea bazelor de date 14
Equijoin
Exemplu:SELECT a.id_angajat, a.nume, a.id_dept, d.id_dept,
d.locatieFROM angajati a, departamente dWHERE a.id_dept = d.id_dept;
05.04.2017 Curs 5-Proiectarea bazelor de date 15
Equijoin
1) Realizaţi un produs cartezian care afişează coloanele tabelelor d_play_list şi d_track_listings din baza de date DJ.
SELECT d.id_concert, d.id_cantec, d.comentarii, t.numar_cd, t.track
FROM d_play_list d, d_track_listings t;
Lipseste clauzaWHERE
05.04.2017 Curs 5-Proiectarea bazelor de date 16
Equijoin
2) Scrieţi o interogare pentru a extrage informaţii din trei tabele ale bazei de date DJ: d_clients, d_evenimente si d_job.
SELECT c.nume, e.nume, j.job_dateFROM d_clients c , d_evenimente e , d_job jWHERE c.client_number = e.client_number AND e.id =
j.event_id;(Solutia nu este unica.)
05.04.2017 Curs 5-Proiectarea bazelor de date 17
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE
5.1.1. Cartesian Product
5.1.2. Equijoin
5.1.3. Non-equijoin
5.1.4. Outer join
5.1.5. Self join5.2. JOIN-urile ANSI/ISO SQL99
5.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 18
NONEQUIJOINS
Este posibil să dorim să extragem date dintr-o tabelă ce nu are coloană corespondentă în cealaltătabelă (exemplu – când datele se înregistrează ca domenii de valori).
În această situaţie se foloseşte nonequijoin-ul.În acest tip de join, deoarece nu există o potrivire
exactă între 2 coloane din fiecare tabelă, nu se foloseşte operatorul de egalitate.
Se pot folosi operatorii:
<=, >=, BETWEEN…AND05.04.2017 Curs 5-Proiectarea bazelor de date 19
NONEQUIJOINS
Exemplu:
SELECT a.nume, a.salariu, g.nivelFROM angajati a, grade_salarizare gWHERE a.salariu BETWEEN
g.sal_min AND g.sal_max
05.04.2017 Curs 5-Proiectarea bazelor de date 21
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE
5.1.1. Cartesian Product
5.1.2. Equijoin
5.1.3. Non-equijoin
5.1.4. Outer join
5.1.5. Self join5.2. JOIN-urile ANSI/ISO SQL99
5.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 22
Outer Joins
Join-urile studiate până în acest moment au avut ca rezultat linii care:
1. fie au avut o valoare care să corespundă în ambele tabele
2. fie o valoare într-o tabelă se regăsea în intervaluldintre 2 valori ale celeilalte tabele
Liniile care nu îndeplineau condiţiile nu erauselectate.05.04.2017 Curs 5-Proiectarea bazelor de date 23
Outer Joins
Uneori, dorim să extragem toate datele dintr-o tabelă, chiar dacă nu au valori care să se potrivească în cealaltă tabelă (“missing data”).
Acest lucru se realizează folosind outer join-ul.
Operatorul pentru outer join este semnul plus pus între paranteze rotunde – (+)
05.04.2017 Curs 5-Proiectarea bazelor de date 24
Outer Joins
Un outer join este folosit pentru a vizualiza toate liniile care au valoare corespondentă în cealaltă tabelă şi liniile dintr-o tabelă care nu au valoare corespondentă în cealaltă tabelă.Pentru a indica tabela deficitară (care
poate avea date lipsă – “missing data”), se pune operatorul (+) după numele coloanei din tabelă, în clauza WHERE.
05.04.2017 Curs 5-Proiectarea bazelor de date 25
Outer JoinsOBSERVAŢIE:
Un outer join nu poate folosi operatorul IN şi nu poate fi legat la altă condiţie prin operatorul OR.
SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column(+) = table2.column
SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column = table2.column(+)
05.04.2017 Curs 5-Proiectarea bazelor de date 26
Outer Joins
Nu există angajaţi in departamentele 3,4 şi 5
05.04.2017 Curs 5-Proiectarea bazelor de date 27
Outer Joins
SELECT a.id_angajat, a.nume, d.id_deptFROM angajati a, departamente dWHERE a.id_dept(+) = d.id_dept;
05.04.2017 Curs 5-Proiectarea bazelor de date 28
Outer Joins
APLICAŢII:
1) Creaţi o interogare care are ca rezultat afişareanumelui (nume) şi id-ul şi numele departamentuluipentru angajaţi. Includeţi toţi angajaţii, chiar dacă nusunt asignaţi unui departament.
2) Modificaţi interogarea din problema anterioarăpentru a afişa toate id-urile departamentelor, chiardacă nu au angajaţi asociaţi lor.
05.04.2017 Curs 5-Proiectarea bazelor de date 29
Outer Joins
1) Creaţi o interogare care are ca rezultat afişarea numelui (nume) şiid-ul şi numele departamentului pentru angajaţi. Includeţi toţiangajaţii, chiar dacă nu sunt asignaţi unui departament.
SELECT a.nume, a.id_dept, d.denumireFROM angajati a, departamente dWHERE a.id_dept = d.id_dept(+);
05.04.2017 Curs 5-Proiectarea bazelor de date 30
Outer Joins
2) Modificaţi interogarea din problema anterioară pentru a afişa toateid-urile departamentelor, chiar dacă nu au angajaţi asociaţi lor.
SELECT a.nume, a.id_dept, d.denumireFROM angajati a, departamente dWHERE a.id_dept(+) = d.id_dept;
05.04.2017 Curs 5-Proiectarea bazelor de date 31
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE
5.1.1. Cartesian Product
5.1.2. Equijoin
5.1.3. Non-equijoin
5.1.4. Outer join
5.1.5. Self join5.2. JOIN-urile ANSI/ISO SQL99
5.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 32
Self Joins
În modelarea de date, uneori este necesar săpunem în evidenţă o entitate în relaţie cu eaînsăşi.
Un exemplu este entitatea angajat.Un angajat poate fi şi manager. Odată ce avem tabela Angajati, devine
necesară o relaţie specială numită self join (un join de la tabela Angajati la ea însăşi), pentru a afla numele managerului pentru fiecareangajat.
05.04.2017 Curs 5-Proiectarea bazelor de date 33
Self Joins
Pentru a face join de la o tabelă la ea însăşi, tabelei îi sunt asociate 2 alias-uri.
Astfel, pentru baza de date, există în aparenţă 2 tabele.
05.04.2017 Curs 5-Proiectarea bazelor de date 34
Self Joins
Exemplu:
SELECT lucrator.nume ||’ lucreaza pentru ‘ || manager.nume
FROM angajati lucrator, angajati managerWHERE lucrator.id_manager=manager.id_angajat;
05.04.2017 Curs 5-Proiectarea bazelor de date 36
Self Joins
APLICAŢII
1) Afişaţi numele şi numărul pentru fiecare angajat împreună cu numele şi numărul managerului. Denumiţi coloanele: Angajat, Ang#, Manager şi Mgr#.
2) Modificaţi interogarea 1 pentru a afişa toţi angajaţii şi managerii lor chiar dacă un angajat nu are un manager. Ordonaţi lista obţinută alfabetic, dupănumele angajaţilor.
05.04.2017 Curs 5-Proiectarea bazelor de date 37
Self Joins
1) Afişaţi numele şi numărul pentru fiecare angajat împreună cu numele şi numărul managerului.
Denumiţi coloanele: Angajat, Ang#, Manager şi Mgr#.
SELECT a.nume AS "Angajat", a.id_angajat AS "Ang#", m.nume AS "Manager", m.id_angajat AS "Mgr#"
FROM angajati a, angajati mWHERE a.id_angajat = m.id_angajat;
05.04.2017 Curs 5-Proiectarea bazelor de date 38
Self Joins2) Modificaţi interogarea 1 pentru a afişa toţi
angajaţii şi managerii lor chiar dacă un angajat nu are un manager.
Ordonaţi lista obţinută alfabetic, după numele angajaţilor.
SELECT a.nume AS "Angajat", a.id_angajat AS "Ang#", m.nume AS "Manager", m.id_angajat AS "Mgr#"
FROM angajati a, angajati mWHERE a.id_angajat = m.id_angajat(+)ORDER BY a.nume;
05.04.2017 Curs 5-Proiectarea bazelor de date 39
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE
5.1.1. Cartesian Product
5.1.2. Equijoin
5.1.3. Non-equijoin
5.1.4. Outer join
5.1.5. Self join5.2. JOIN-urile ANSI/ISO SQL99
5.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 40
Cross Joins and Natural Joins
NATURAL JOIN
Este un ANSI/ISO SQL:1999 join echivalent cu equijoin-ul.
Se face pe baza tuturor coloanelor care au acelaşinume din 2 tabele; coloanele respective trebuie să aibă acelaşi tip de date.
Sunt selectate liniile care au valori egale în toatecoloanele corespondente.
05.04.2017 Curs 5-Proiectarea bazelor de date 41
Cross Joins and Natural Joins
Exemplu:
SELECT id_angajat, nume, id_dept, locatieFROM angajati NATURAL JOIN departamente
05.04.2017 Curs 5-Proiectarea bazelor de date 42
Cross Joins and Natural Joins
CROSS JOINRealizează produsul cartezian pentru douătabele.
Exemplu:SELECT nume, denumireFROM angajati CROSS JOIN departamente
este echivalentă cu instrucţiunea:
SELECT nume, denumireFROM angajati, departamente
05.04.2017 Curs 5-Proiectarea bazelor de date 43
Cross Joins and Natural Joins
APLICAŢII
1) Creaţi un cross-join care afişează numele şi denumirea departmentului din tabelele angajati şi departamente.
2) Creaţi o interogare care foloseşte un natural join pentru a pune în legătură tabelele departamente şi locatii cu ajutorul coloanei id_locatie. Afişaţi id-ul şi denumirea departamentului, id-ului locaţiei şi oraşul.
05.04.2017 Curs 5-Proiectarea bazelor de date 44
Cross Joins and Natural Joins
1) Creaţi un cross-join care afişează numele şi denumirea departmentului din tabelele angajati şi departamente.
SELECT nume, denumireFROM angajatiCROSS JOIN departamente
05.04.2017 Curs 5-Proiectarea bazelor de date 45
Cross Joins and Natural Joins
2) Creaţi o interogare care foloseşte un natural join pentru a pune în legătură tabelele departamente şi locatii cu ajutorul coloanei id_locatie. Afişaţi id-ul şi denumirea departamentului, id-ului locaţiei şi oraşul.
SELECT id_dept, denumire, id_locatie, orasFROM departamenteNATURAL JOIN locatii
05.04.2017 Curs 5-Proiectarea bazelor de date 46
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE
5.1.1. Cartesian Product
5.1.2. Equijoin
5.1.3. Non-equijoin
5.1.4. Outer join
5.1.5. Self join5.2. JOIN-urile ANSI/ISO SQL99
5.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 47
Join Clauses
În această parte vom studia:1. folosirea clauzelor USING şi ON2. realizarea unui join cu 3 tabele
1. Clauza USINGÎntr-un natural join, dacă tabelele au coloane cu
acelaşi nume dar tipuri diferite, se produce eroare. Pentru a evita această situaţie, clauza JOIN se
înlocuieşte cu clauza USING.
05.04.2017 Curs 5-Proiectarea bazelor de date 48
Join Clauses
Clauza USING specifică coloanele care ar trebui folosite pentru pentru equijoin.
Coloana specificată în clauza USING nu trebuie să aibă nici un specificator (nume de tabela sau alias), în nici o parte din instrucţiunea SELECT.
05.04.2017 Curs 5-Proiectarea bazelor de date 49
Join Clauses
Exemplu:
SELECT a.id_angajat, a.nume. d.id_locatieFROM angajati aJOIN departmente dUSING (id_dept)
05.04.2017 Curs 5-Proiectarea bazelor de date 50
Join Clauses
Clauza ONDacă coloanele folosite pentru join au denumiri
diferite sau dacă sunt folosiţi operatorii: <, > sau BETWEEN, atunci nu putem folosi clauza USING.
În această situaţie se foloseşte clauza ON. Aceasta permite specificarea unei game variate de
condiţii pentru join-uri.De asemenea, clauza ON ne permite să folosim
WHERE pentru a restricţiona linii dintr-o tabelă sau din ambele tabele.
05.04.2017 Curs 5-Proiectarea bazelor de date 51
Join Clauses
Exemple:
1) SELECT a.nume as "ANG", d.nume as "MGR" FROM angajati a JOIN angajati dON (a.manager_id = d.angajat_id);
Se realizează un self-join pentru a selecta acei angajaţi care sunt şi manageri.
05.04.2017 Curs 5-Proiectarea bazelor de date 52
Join Clauses
2) – folosirea clauzei WHERE
SELECT a.nume as "ANG", m.nume as "MGR"FROM angajati a JOIN angajati mON (a.manager_id = m.angajat_id)WHERE a.nume like 'V%';
05.04.2017 Curs 5-Proiectarea bazelor de date 53
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE
5.1.1. Cartesian Product
5.1.2. Equijoin
5.1.3. Non-equijoin
5.1.4. Outer join
5.1.5. Self join5.2. JOIN-urile ANSI/ISO SQL99
5.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 54
Join Clauses
Realizarea unui join cu 3 tabeleAmbele clauze (ON si USING) se pot folosi
pentru un astfel de join.
SELECT id_angajat, oras, denumireFROM angajati a JOIN departamente dON (d.id_dept = a.id_dept)JOIN locatii lON (d.id_locatie = l.id_locatie)
05.04.2017 Curs 5-Proiectarea bazelor de date 55
Join Clauses
Join-uri proprietateORACLE
Join-uri ANSI/ISO SQL 1999
Produs cartezian Cross Join
Equijoin
Natural Join (daca coloanele de join au acelasi nume si acelasi tip de date)
Clauza USING (daca coloanele de join au acelasi nume dar tipuri de date diferite)
Clauza ON (daca coloanele au numediferite)
Non-equijoin Clauza ON
Comparatie intre join-urile proprietate ORACLE si join-urile ANSI/ISO SQL 1999
05.04.2017 Curs 5-Proiectarea bazelor de date 56
Join Clauses
APLICAŢII
1) Realizaţi un join între tabelele locatii şi departmentefolosind coloana id_locatie. Limitaţi rezultatele doar pentru locaţia 1400.
2) Afişaţi: oraşul, numele departamentului, id-ul locaţiei şi id-ul departamentului pentru departamentele 10, 20 şi 30, pentru oraşul Târgu-Jiu.
05.04.2017 Curs 5-Proiectarea bazelor de date 57
Join Clauses
1) Realizaţi un join între tabelele locatii şi departmentefolosind coloana id_locatie. Limitaţi rezultatele doar pentru locaţia 1400.
SELECT l.oras, d.denumireFROM locatii l JOIN departamente dUSING (id_locatie)WHERE id_locatie = 1400;
05.04.2017 Curs 5-Proiectarea bazelor de date 58
Join Clauses
2) Afişaţi: oraşul, numele departamentului, id-ul locaţiei şi id-ul departamentului pentru departamentele 10, 20 şi 30, pentru oraşul Târgu-Jiu.
SELECT l.oras, d.denumire, id_locatie, d.id_deptFROM locatii l JOIN departamente dUSING (id_locatie)WHERE oras = ‘Targu-Jiu' AND id_dept IN (10, 20, 30);
05.04.2017 Curs 5-Proiectarea bazelor de date 59
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE
5.1.1. Cartesian Product
5.1.2. Equijoin
5.1.3. Non-equijoin
5.1.4. Outer join
5.1.5. Self join5.2. JOIN-urile ANSI/ISO SQL99
5.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 60
Inner vs. Outer Joins
În ANSI-99 SQL, un join cu 2 sau mai multetabele care returnează doar liniile care se potrivesc se numeşte inner join.
Atunci când un join returnează atât liniile care se potrivesc cât şi cele care nu se potrivesc, acestase numeşte outer join.
Sunt trei tipuri de outer join în ANSI/ISO SQL: 1. LEFT OUTER JOIN2. RIGHT OUTER JOIN3. FULL OUTER JOIN
05.04.2017 Curs 5-Proiectarea bazelor de date 61
Inner vs. Outer Joins
1. LEFT OUTER JOINSunt afişaţi şi acei angajaţi care nu au
desemnat un id_dept (tabela departamenteeste cea deficitară).
SELECT a.nume, a.id_dept, d.denumireFROM angajati aLEFT OUTER JOIN departamente dON (a.id_dept = d.id_dept);
05.04.2017 Curs 5-Proiectarea bazelor de date 62
Inner vs. Outer Joins
2. RIGHT OUTER JOINSunt afişate şi acele departamente care nu au angajaţi.
SELECT a.nume, a.id_dept, d.denumireFROM angajati aRIGHT OUTER JOIN departamente dON (a.id_dept = d.id_dept);
05.04.2017 Curs 5-Proiectarea bazelor de date 63
Inner vs. Outer Joins
3. FULL OUTER JOINReturnează atât liniile care se potrivesc cât şi cele
care nu se potrivesc din ambele tabele.Spre deosebire de outer join-ul proprietatea
Oracle, care nu permitea folosirea operatorului (+) în ambele părţi ale clauzei WHERE, full outer join-ulpermite acest lucru.
SELECT a.nume, a.id_dept, d.denumireFROM angajati aFULL OUTER JOIN departamente dON (a.id_dept = d.id_dept);
05.04.2017 Curs 5-Proiectarea bazelor de date 64
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE
5.1.1. Cartesian Product
5.1.2. Equijoin
5.1.3. Non-equijoin
5.1.4. Outer join
5.1.5. Self join5.2. JOIN-urile ANSI/ISO SQL99
5.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 65
Inner vs. Outer Joins
APLICAŢII1) Afişaţi numele, prenumele, şi denumirea departamentului
pentru toţi angajaţii, inclusiv pentru cei care nu sunt desemnaţi la nici un departament.
2) Afişaţi numele, prenumele, şi denumirea departamentului pentru toţi angajaţii, inclusiv acele departamente care nu au nici un angajat asociat.
3) Afişaţi numele, prenumele, şi denumirea departamentului pentru toţi angajatii, inclusiv acele departamente care nu au nici un angajat asociat şi acei angajaţi care nu sunt desemnaţi nici unui departament.
05.04.2017 Curs 5-Proiectarea bazelor de date 66
Inner vs. Outer Joins
1) Afişaţi numele, prenumele, şi denumirea departamentului pentru toţi angajaţii, inclusiv pentru cei care nu sunt desemnaţi la nici un departament.
SELECT a.nume, a.prenume, d.denumireFROM angajati aLEFT OUTER JOIN departamente dON (a.id_dept = d.id_dept)
05.04.2017 Curs 5-Proiectarea bazelor de date 67
Inner vs. Outer Joins
2) Afişaţi numele, prenumele, şi denumirea departamentului pentru toţi angajaţii, inclusiv acele departamente care nu au nici un angajat asociat.
SELECT a.nume, a.prenume, d.denumireFROM angajati aRIGHT OUTER JOIN departamente dON (a.id_dept = d.id_dept)
05.04.2017 Curs 5-Proiectarea bazelor de date 68
Inner vs. Outer Joins
3) Afişaţi numele, prenumele, şi denumirea departamentului pentru toţi angajatii, inclusiv acele departamente care nu au nici un angajat asociat şi acei angajaţi care nu sunt desemnaţi nici unui departament.
SELECT a.nume, a.prenume, d.denumireFROM angajati aFULL OUTER JOIN departamente dON (a.id_dept = d.id_dept);05.04.2017 Curs 5-Proiectarea bazelor de date 69
Inner vs. Outer Joins
ALTE APLICAŢII:
1. Să se afişeze: id_functie, funcţia, numele, prenumele,şi id-ul departamentului pentru toţi angajaţii cuid_functie corespunzător pentru IT_PROG.
2. Afişaţi numele şi numărul pentru angajaţi împreună cunumele şi numărul managerului. Denumiţi coloaneleastfel: Angajat, Ang#, Manager, şi Mgr#.
3. Modificaţi rezultatul de la problema 2 astfel încât săfie afişaţi toţi angajaţii, inclusiv aceia care nu aumanager. Ordonaţi rezultatele după numărulangajatului.
05.04.2017 Curs 5-Proiectarea bazelor de date 70
Inner vs. Outer Joins
1. Să se afişeze: id_functie, funcţia, numele,prenumele, şi id-ul departamentului pentru toţi angajaţii cu id_functie corespunzător pentru IT_PROG.
SELECT f.id_functie, f.functia, a.nume, a.prenume, a.id_dept
FROM functii f JOIN angajati aON( f.id_functie = a.id_functie)WHERE f.id_functie = 'IT_PROG';
05.04.2017 Curs 5-Proiectarea bazelor de date 71
Inner vs. Outer Joins
2. Afişaţi numele şi numărul pentru angajaţi împreună cunumele şi numărul managerului. Denumiţi coloaneleastfel: Angajat, Ang#, Manager, şi Mgr#.
SELECT w.nume AS “Angajat", w.id_angajat AS “Ang#", m.nume AS "Manager", m. id_angajat AS "Mgr#"
FROM angajat w JOIN angajat mON (w.id_manager = m.id_angajat);
05.04.2017 Curs 5-Proiectarea bazelor de date 72
Inner vs. Outer Joins
3. Modificaţi rezultatul de la problema 2 astfel încât să fieafişaţi toţi angajaţii, inclusiv aceia care nu au manager.Ordonaţi rezultatele după numărul angajatului.
SELECT w.nume AS “Angajat", w.id_angajat AS “Ang#", m.nume AS "Manager", m.id_angajat AS "Mgr#"
FROM angajati w LEFT OUTER JOIN angajati mON (w.id_manager = m.id_angajat)ORDER BY w.id_angajat;
05.04.2017 Curs 5-Proiectarea bazelor de date 73
Limbajul SQL5. Interogari din mai multe tabele (JOIN-uri)
5.1. JOIN-urile proprietatea ORACLE
5.1.1. Cartesian Product
5.1.2. Equijoin
5.1.3. Non-equijoin
5.1.4. Outer join
5.1.5. Self join5.2. JOIN-urile ANSI/ISO SQL99
5.2.1. Cross join5.2.2. Natural join5.2.3. Using clause 5.2.4. Full (two sided) outer joins5.2.5. Arbitrary join conditions for outer joins
5.3. Operatorii pe mulţimi05.04.2017 Curs 5-Proiectarea bazelor de date 74
Operatorii pe mulţimi
Operatorii pe mulţimi combină rezultateleobţinute din două sau mai multe interogări.
Interogarile care conţin operatori pe mulţimise numesc Interogari compuse.
Există patru operatori pe mulţimi: 1. UNION2. UNION ALL3. INTERSECT4. MINUS
05.04.2017 Curs 5-Proiectarea bazelor de date 75
Operatorii pe mulţimi
Toţi operatorii pe mulţimi au aceeaşi precedenţă.
Dacă o instrucţiune SQL conţine mai mulţi operatori pe mulţimi, server-ul Oracle evaluează cererea de la stânga la dreapta (sau de sus în jos).
Pentru a schimba această ordine de evaluare, se pot utiliza paranteze.
05.04.2017 Curs 5-Proiectarea bazelor de date 76
Operatorii pe mulţimi
Operatorul UNION returnează toate liniileselectate de două interogari, eliminândduplicatele.
Acest operator nu ignoră valorile null şi are precedenţă mai mică decât operatorul IN.
05.04.2017 Curs 5-Proiectarea bazelor de date 77
Operatorii pe mulţimi
Operatorul UNION ALL returnează toate liniileselectate de două interogari, fără a eliminaduplicatele.
Precizările făcute asupra operatorului UNIONsunt valabile şi în cazul operatorului UNION ALL.
În Interogarile asupra cărora se aplică UNION ALL nu poate fi utilizat cuvântul cheieDISTINCT.
05.04.2017 Curs 5-Proiectarea bazelor de date 78
Operatorii pe mulţimi
Operatorul INTERSECT returnează toate liniilecomune interogarilor asupra cărora se aplică.
Acest operator nu ignoră valorile null.
05.04.2017 Curs 5-Proiectarea bazelor de date 79
Operatorii pe mulţimi
Operatorul MINUS determină liniile returnatede prima cerere care nu apar în rezultatul celeide-a doua interogari.
Pentru ca operatorul MINUS să funcţioneze, este necesar ca toate coloanele din clauzaWHERE să se afle şi în clauza SELECT.
05.04.2017 Curs 5-Proiectarea bazelor de date 80
Operatorii pe mulţimi
Observaţii:1. În mod implicit, pentru toţi operatorii cu excepţia
lui UNION ALL, rezultatul este ordonat crescător după valorile primei coloane din clauza SELECT.
2. Pentru o cerere care utilizează operatori pe mulţimi, cu excepţia lui UNION ALL, server-ul Oracle elimină liniile duplicat.
05.04.2017 Curs 5-Proiectarea bazelor de date 81
Operatorii pe mulţimi
1. În instrucţiunile SELECT asupra cărora se aplicăoperatori pe mulţimi, coloanele selectatetrebuie să corespundă ca număr şi tip de date.
2. Nu este necesar ca numele coloanelor să fie identice.
3. Numele coloanelor din rezultat suntdeterminate de numele care apar în clauzaSELECT a primei Interogari.
05.04.2017 Curs 5-Proiectarea bazelor de date 82
Operatorii pe mulţimi
APLICAŢII:
1. Să se afişeze: codurile departamentelor al căror numeconţine şirul “re” sau în care lucrează angajaţi avândcodul job-ului “ing”.
SELECT id_dept "Cod departament"FROM angajatiWHERE UPPER(id_functie)='ing'UNION SELECT id_deptFROM departamenteWHERE LOWER(denumire) LIKE '%re%';
05.04.2017 Curs 5-Proiectarea bazelor de date 83
Operatorii pe mulţimi
2. Să se obţină codurile departamentelor în care nu lucrează nimeni (nu este introdus nici un salariat în tabelul angajati). Se cer două soluţii.
Obs: Operatorii pe mulţimi pot fi utilizaţi în subcereri. Coloanele care apar în clauza WHERE a interogării
trebuie să corespundă, ca număr şi tip de date, celordin clauza SELECT a subcererii.
05.04.2017 Curs 5-Proiectarea bazelor de date 84
Operatorii pe mulţimi
Soluţia 1
SELECT id_dept "Cod departament"FROM departamenteMINUSSELECT id_deptFROM angajati;
05.04.2017 Curs 5-Proiectarea bazelor de date 85
Operatorii pe mulţimi
Soluţia 2
SELECT id_deptFROM departamente WHERE id_dept NOT IN
(SELECT DISTINCT NVL(id_dept,0) FROM angajati);
05.04.2017 Curs 5-Proiectarea bazelor de date 86