Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin...

Post on 09-Jul-2020

2 views 0 download

Transcript of Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin...

Baze de date

Universitatea “Constantin Brâncuşi” din Târgu-JiuFacultatea de Inginerie Departamentul de Automatică

2020

copyright@www.adrian.runceanu.ro

Curs 6

Limbajul SQL

29.03.2020 Curs 6 - BAZE DE DATE 2

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 3

copyright@www.adrian.runceanu.ro

6. Cereri 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

29.03.2020 Curs 6 - BAZE DE DATE 4

6. Cereri 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 joins29.03.2020 Curs 6 - BAZE DE DATE 5

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 6

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 7

copyright@www.adrian.runceanu.ro

Cartesian Product and the Join Operations

SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column1 = table2.column2;

29.03.2020 Curs 6 - BAZE DE DATE 8

copyright@www.adrian.runceanu.ro

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.29.03.2020 Curs 6 - BAZE DE DATE 9

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 10

copyright@www.adrian.runceanu.ro

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

29.03.2020 Curs 6 - BAZE DE DATE 11

copyright@www.adrian.runceanu.ro

EquijoinExemplu:SELECT angajati.angajati_id, angajati.nume,

angajati.nr_dept, departamente.nr_dept, departamente.id_locatie

FROM angajati, departamenteWHERE angajati.nr_dept = departamente.nr_dept

29.03.2020 Curs 6 - BAZE DE DATE 12

copyright@www.adrian.runceanu.ro

Equijoin

Cheie

străină

(Foreign

key)Cheie

primară

(Primary

key)

29.03.2020 Curs 6 - BAZE DE DATE 13

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 14

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 15

copyright@www.adrian.runceanu.ro

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;

29.03.2020 Curs 6 - BAZE DE DATE 16

copyright@www.adrian.runceanu.ro

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

29.03.2020 Curs 6 - BAZE DE DATE 17

copyright@www.adrian.runceanu.ro

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.)

29.03.2020 Curs 6 - BAZE DE DATE 18

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 19

copyright@www.adrian.runceanu.ro

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…AND29.03.2020 Curs 6 - BAZE DE DATE 20

copyright@www.adrian.runceanu.ro

NONEQUIJOINS

29.03.2020 Curs 6 - BAZE DE DATE 21

copyright@www.adrian.runceanu.ro

NONEQUIJOINS

Exemplu:

SELECT a.nume, a.salariu, g.nivelFROM angajati a, grade_salarizare gWHERE a.salariu BETWEEN

g.sal_min AND g.sal_max

29.03.2020 Curs 6 - BAZE DE DATE 22

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 23

copyright@www.adrian.runceanu.ro

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.29.03.2020 Curs 6 - BAZE DE DATE 24

copyright@www.adrian.runceanu.ro

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 – (+)

29.03.2020 Curs 6 - BAZE DE DATE 25

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 26

copyright@www.adrian.runceanu.ro

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(+)

29.03.2020 Curs 6 - BAZE DE DATE 27

copyright@www.adrian.runceanu.ro

Outer Joins

Nu există angajaţi in departamentele 3,4 şi 5

29.03.2020 Curs 6 - BAZE DE DATE 28

copyright@www.adrian.runceanu.ro

Outer Joins

SELECT a.id_angajat, a.nume, d.id_deptFROM angajati a, departamente dWHERE a.id_dept(+) = d.id_dept;

29.03.2020 Curs 6 - BAZE DE DATE 29

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 30

copyright@www.adrian.runceanu.ro

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(+);

29.03.2020 Curs 6 - BAZE DE DATE 31

copyright@www.adrian.runceanu.ro

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;

29.03.2020 Curs 6 - BAZE DE DATE 32

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 33

copyright@www.adrian.runceanu.ro

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 fiecare angajat.

29.03.2020 Curs 6 - BAZE DE DATE 34

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 35

copyright@www.adrian.runceanu.ro

Self Joins

29.03.2020 Curs 6 - BAZE DE DATE 36

copyright@www.adrian.runceanu.ro

Self Joins

Exemplu:

SELECT lucrator.nume ||’ lucreaza pentru ‘ || manager.nume

FROM angajati lucrator, angajati managerWHERE lucrator.id_manager=manager.id_angajat;

29.03.2020 Curs 6 - BAZE DE DATE 37

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 38

copyright@www.adrian.runceanu.ro

Self Joins1) 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;

29.03.2020 Curs 6 - BAZE DE DATE 39

copyright@www.adrian.runceanu.ro

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;29.03.2020 Curs 6 - BAZE DE DATE 40

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 41

copyright@www.adrian.runceanu.ro

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şi nume din 2 tabele; coloanele respective trebuie să aibă acelaşi tip de date.

• Sunt selectate liniile care au valori egale în toate coloanele corespondente.

29.03.2020 Curs 6 - BAZE DE DATE 42

copyright@www.adrian.runceanu.ro

Cross Joins and Natural Joins

Exemplu:

SELECT id_angajat, nume, id_dept, locatieFROM angajati NATURAL JOIN departamente

29.03.2020 Curs 6 - BAZE DE DATE 43

copyright@www.adrian.runceanu.ro

Cross Joins and Natural Joins

CROSS JOINRealizează produsul cartezian pentru douătabele.

Exemplu:SELECT nume, denumireFROM angajati CROSS JOIN departamenteeste echivalentă cu instrucţiunea:SELECT nume, denumireFROM angajati, departamente29.03.2020 Curs 6 - BAZE DE DATE 44

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 45

copyright@www.adrian.runceanu.ro

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

29.03.2020 Curs 6 - BAZE DE DATE 46

copyright@www.adrian.runceanu.ro

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

29.03.2020 Curs 6 - BAZE DE DATE 47

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 48

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 49

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 50

copyright@www.adrian.runceanu.ro

Join Clauses

Exemplu:

SELECT a.id_angajat, a.nume. d.id_locatieFROM angajati aJOIN departmente dUSING (id_dept)

29.03.2020 Curs 6 - BAZE DE DATE 51

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 52

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 53

copyright@www.adrian.runceanu.ro

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%';

29.03.2020 Curs 6 - BAZE DE DATE 54

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 55

copyright@www.adrian.runceanu.ro

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)

29.03.2020 Curs 6 - BAZE DE DATE 56

copyright@www.adrian.runceanu.ro

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

29.03.2020 Curs 6 - BAZE DE DATE 57

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 58

copyright@www.adrian.runceanu.ro

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;

29.03.2020 Curs 6 - BAZE DE DATE 59

copyright@www.adrian.runceanu.ro

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);

29.03.2020 Curs 6 - BAZE DE DATE 60

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 61

copyright@www.adrian.runceanu.ro

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

29.03.2020 Curs 6 - BAZE DE DATE 62

copyright@www.adrian.runceanu.ro

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);

29.03.2020 Curs 6 - BAZE DE DATE 63

copyright@www.adrian.runceanu.ro

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);

29.03.2020 Curs 6 - BAZE DE DATE 64

copyright@www.adrian.runceanu.ro

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);29.03.2020 Curs 6 - BAZE DE DATE 65

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 66

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 67

copyright@www.adrian.runceanu.ro

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)

29.03.2020 Curs 6 - BAZE DE DATE 68

copyright@www.adrian.runceanu.ro

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)

29.03.2020 Curs 6 - BAZE DE DATE 69

copyright@www.adrian.runceanu.ro

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);29.03.2020 Curs 6 - BAZE DE DATE 70

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 71

copyright@www.adrian.runceanu.ro

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';29.03.2020 Curs 6 - BAZE DE DATE 72

copyright@www.adrian.runceanu.ro

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);

29.03.2020 Curs 6 - BAZE DE DATE 73

copyright@www.adrian.runceanu.ro

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;

29.03.2020 Curs 6 - BAZE DE DATE 74

copyright@www.adrian.runceanu.ro

Limbajul SQL6. Cereri din mai multe tabele (JOIN-uri)

6.1. JOIN-urile proprietatea ORACLE

6.1.1. Cartesian Product

6.1.2. Equijoin

6.1.3. Non-equijoin

6.1.4. Outer join

6.1.5. Self join6.2. JOIN-urile ANSI/ISO SQL99

6.2.1. Cross join6.2.2. Natural join6.2.3. Using clause 6.2.4. Full (two sided) outer joins6.2.5. Arbitrary join conditions for outer joins

6.3. Operatorii pe mulţimi29.03.2020 Curs 6 - BAZE DE DATE 75

copyright@www.adrian.runceanu.ro

Operatorii pe mulţimi

Operatorii pe mulţimi combină rezultatele obţinute din două sau mai multe interogări.

Cererile care conţin operatori pe mulţimi se numesc cereri compuse.

Există patru operatori pe mulţimi: 1. UNION2. UNION ALL3. INTERSECT4. MINUS

29.03.2020 Curs 6 - BAZE DE DATE 76

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 77

copyright@www.adrian.runceanu.ro

Operatorii pe mulţimi

Operatorul UNION returnează toate liniile selectate de două cereri, eliminând duplicatele.

Acest operator nu ignoră valorile null şi are precedenţă mai mică decât operatorul IN.

29.03.2020 Curs 6 - BAZE DE DATE 78

copyright@www.adrian.runceanu.ro

Operatorii pe mulţimi

Operatorul UNION ALL returnează toate liniile selectate de două cereri, fără a elimina duplicatele.

Precizările făcute asupra operatorului UNIONsunt valabile şi în cazul operatorului UNION ALL.

În cererile asupra cărora se aplică UNION ALLnu poate fi utilizat cuvântul cheie DISTINCT.

29.03.2020 Curs 6 - BAZE DE DATE 79

copyright@www.adrian.runceanu.ro

Operatorii pe mulţimi

Operatorul INTERSECT returnează toate liniile comune cererilor asupra cărora se aplică.

Acest operator nu ignoră valorile null.

29.03.2020 Curs 6 - BAZE DE DATE 80

copyright@www.adrian.runceanu.ro

Operatorii pe mulţimi

Operatorul MINUS determină liniile returnate de prima cerere care nu apar în rezultatul celei de-a doua cereri.

Pentru ca operatorul MINUS să funcţioneze, este necesar ca toate coloanele din clauza WHERE să se afle şi în clauza SELECT.

29.03.2020 Curs 6 - BAZE DE DATE 81

copyright@www.adrian.runceanu.ro

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.

29.03.2020 Curs 6 - BAZE DE DATE 82

copyright@www.adrian.runceanu.ro

Operatorii pe mulţimi

1. În instrucţiunile SELECT asupra cărora se aplică operatori pe mulţimi, coloanele selectate trebuie să corespundă ca număr şi tip de date.

2. Nu este necesar ca numele coloanelor să fie identice.

3. Numele coloanelor din rezultat sunt determinate de numele care apar în clauza SELECT a primei cereri.

29.03.2020 Curs 6 - BAZE DE DATE 83

copyright@www.adrian.runceanu.ro

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%';29.03.2020 Curs 6 - BAZE DE DATE 84

copyright@www.adrian.runceanu.ro

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, celor din clauza SELECT a subcererii.

29.03.2020 Curs 6 - BAZE DE DATE 85

copyright@www.adrian.runceanu.ro

Operatorii pe mulţimi

Soluţia 1

SELECT id_dept "Cod departament"FROM departamenteMINUSSELECT id_deptFROM angajati;

29.03.2020 Curs 6 - BAZE DE DATE 86

copyright@www.adrian.runceanu.ro

Operatorii pe mulţimi

Soluţia 2

SELECT id_deptFROM departamente WHERE id_dept NOT IN

(SELECT DISTINCT NVL(id_dept,0) FROM angajati);

29.03.2020 Curs 6 - BAZE DE DATE 87

copyright@www.adrian.runceanu.ro

Întrebări?

29.03.2020 Curs 6 - BAZE DE DATE 88