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

88
Baze de date Universitatea Constantin Brâncuşi” din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică 2020

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

Page 1: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

Baze de date

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

2020

Page 2: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

Curs 6

Limbajul SQL

29.03.2020 Curs 6 - BAZE DE DATE 2

Page 3: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 4: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 5: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

Page 6: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 7: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 7

Page 8: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 9: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

Page 10: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 11: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[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

29.03.2020 Curs 6 - BAZE DE DATE 11

Page 12: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 13: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

Equijoin

Cheie

străină

(Foreign

key)Cheie

primară

(Primary

key)

29.03.2020 Curs 6 - BAZE DE DATE 13

Page 14: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 14

Page 15: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 15

Page 16: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 16

Page 17: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[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

29.03.2020 Curs 6 - BAZE DE DATE 17

Page 18: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 18

Page 19: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 20: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

Page 21: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

NONEQUIJOINS

29.03.2020 Curs 6 - BAZE DE DATE 21

Page 22: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[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

29.03.2020 Curs 6 - BAZE DE DATE 22

Page 23: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 24: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

Page 25: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 25

Page 26: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 26

Page 27: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 27

Page 28: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

Outer Joins

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

29.03.2020 Curs 6 - BAZE DE DATE 28

Page 29: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 30: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 30

Page 31: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 31

Page 32: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 32

Page 33: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 34: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 34

Page 35: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 35

Page 36: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

Self Joins

29.03.2020 Curs 6 - BAZE DE DATE 36

Page 37: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 38: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 38

Page 39: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 40: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

Page 41: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 42: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[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ş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

Page 43: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 44: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 45: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 45

Page 46: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[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

29.03.2020 Curs 6 - BAZE DE DATE 46

Page 47: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[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

29.03.2020 Curs 6 - BAZE DE DATE 47

Page 48: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 49: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 49

Page 50: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 50

Page 51: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 52: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 52

Page 53: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 53

Page 54: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 54

Page 55: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 56: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 56

Page 57: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[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

29.03.2020 Curs 6 - BAZE DE DATE 57

Page 58: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 58

Page 59: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 59

Page 60: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 60

Page 61: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 62: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[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

29.03.2020 Curs 6 - BAZE DE DATE 62

Page 63: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 63

Page 64: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 64

Page 65: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

Page 66: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 67: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 67

Page 68: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 68

Page 69: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 69

Page 70: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

Page 71: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 71

Page 72: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

Page 73: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 73

Page 74: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 74

Page 75: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 76: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 77: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 77

Page 78: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 79: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 80: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 81: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 82: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 82

Page 83: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 84: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

Page 85: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 85

Page 86: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

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

Page 87: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

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

29.03.2020 Curs 6 - BAZE DE DATE 87

Page 88: Baze de date - runceanu.ro · ORACLE Join-uri SQL 1999 Cartesian Product Cross join Equijoin Natural join Non-equijoin Using clause Outer join Full (two sided) outer joins Self join

[email protected]

Întrebări?

29.03.2020 Curs 6 - BAZE DE DATE 88