#5 sql · 2017-04-05 · 5. interogari din mai multe tabele (join-uri) tipuri de join-uri: join-uri...

87
Proiectarea bazelor de date #5 Adrian Runceanu www.runceanu.ro/adrian 2017 SQL Interogari din mai multe tabele (JOIN-uri)

Upload: others

Post on 28-Jan-2020

25 views

Category:

Documents


1 download

TRANSCRIPT

Proiectarea bazelor de date

#5

Adrian Runceanuwww.runceanu.ro/adrian

2017

SQLInterogari din mai multe tabele (JOIN-uri)

[email protected]

Curs 5

Limbajul SQLInterogari din mai multe tabele

(JOIN-uri)

Curs 5-Proiectarea bazelor de date 205.04.2017

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

Equijoin

Cheie

străină

(Foreign

key)Cheie

primară

(Primary

key)

05.04.2017 Curs 5-Proiectarea bazelor de date 12

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

NONEQUIJOINS

05.04.2017 Curs 5-Proiectarea bazelor de date 20

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

Outer Joins

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

05.04.2017 Curs 5-Proiectarea bazelor de date 27

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

Self Joins

05.04.2017 Curs 5-Proiectarea bazelor de date 35

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

Întrebări?