PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una...

27
PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della prima tabella sono in join con tutte le righe della seconda tabella Per evitare il prodotto cartesiano occorre SEMPRE mettere la clausola di

Transcript of PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una...

Page 1: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

PRODOTTO CARTESIANO

Otteniamo un prodotto cartesiano quando:

• viene omessa la condizione di join

• una condizione di join non è valida

• tutte le righe della prima tabella sono in

join con tutte le righe della seconda tabella

Per evitare il prodotto cartesiano occorre

SEMPRE mettere la clausola di join nella where

condition

Page 2: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

TIPI DI JOIN

Proprietà Oracle

Equijoin

Non-equijoin

Outer join

Self join

Page 3: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

TIPI DI JOIN

SQL

Cross join

Natural join

Full or two sider outer join

Page 4: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

JOIN

SELECT tabella1.colonna, tabella2.colonnaFROM tabella1, tabella2WHERE tabella1.colonna1 = tabella2.colonna2;

• la condizione di join deve essere scritta nella clausola WHERE

• usare il nome della tabella davanti alla colonna quando la stessa colonna compare in più tabelle

• se si vogliono mettere in join n tabelle, occorrà creare almeno n-1 condizioni di join.

Page 5: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

EQUIJOIN

SELECT employee_id

FROM employees, departments

WHERE employees.department_id =

departments.department_id

La relazione tra le tabelle è un equijoin ovvero i valori

della colonna department_id di entrambe le tabelle

devono essere uguali.

Page 6: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

JOIN SU PIU’ DI DUE TABELLE

SELECT e.employee_id, d.department_name, l.city

FROM employees e, departments d,locations l

WHERE e.department_id = d.department_id AND

d.location_id = l.location_id;

Il join fra n tabelle implica un minimo di n-1 condizioni di join.

Per esempio, un join tra 3 tabelle implica almeno 2 condizioni di

join.

ALIAS :

-un alias può avere almeno 30 caratteri (è consigliabile un alias

breve)

- se un alias viene attribuito ad una tabella nella clausola

FROM, occorrerà sostituirlo ai nomi di tabella nella cluasola

SELECT

Page 7: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

NON-EQUIJOIN

E’ una relazione che non contiene un’uguaglianza.

SELECT e.last_name,

e.salary

FROM employees e, jobs j

WHERE (e.salary BETWEEN j.min_salary AND j.max_salary)

Page 8: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

OUTER JOINS

DEPARTMENTS EMPLOYEES

Se una riga non soddisfa la condizione, non apparirà nel result set.

DEPARTMENT_NAME DEPARTMENT_ID

Administration 10

Marketing 20

Shipping 50

IT 60

Contracting 190

DEPARTMENT_ID LAST_NAME

90 King

90 Hunold

60 Rajs

50 Matos

80 Zlotkey

Page 9: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

OUTER JOINS

• Occorre usare l’OUTER JOIN per vedere anche le righe che

non soddisfano la condizione di join.

• L’operatore di outer join è il (+)

SELECT tabella1.colonna, tabella2.colonnaFROM tabella1, tabella2WHERE tabella1.colonna1(+) = tabella2.colonna2;

SELECT tabella1.colonna, tabella2.colonnaFROM tabella1, tabella2WHERE tabella1.colonna1 = tabella2.colonna2(+);

Il (+) è posizionato dalla parte del join in cui mancano le righe(aggiunge delle righe NULL)

Page 10: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

OUTER JOINS

• Crea una o più righe nulle con le quali andare in join con le

righe della tabella con cui va in join.

SELECT e.last_name, d.department_name

FROM employees e, departments d

WHERE e.department_id(+) = d.department_idDEPARTMENT_NAME DEPARTMENT_ID

Administration 10

Marketing 20

Shipping 50

IT 60

Contracting

Page 11: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

SELF JOINS

SELECT worker.last_name || ‘ lavora per ‘ || manager.last_name

FROM employees worker, employees manager

WHERE worker.manager_id = manager.employee_id;

Si usa per poter mettere in join una tabella con se stessa.

Ad esempio per trovare il nome del manager di ogni impiegato.

Alla prima passata nella tabella trovo il nome nella colonna

LAST_NAME (Whalen) e il MANAGER_ID (101). Alla seconda

passata guarda nella EMPLOYEE_ID per trovare il MANAGER_ID

che era 101 e nella LAST_NAME trova il nome Kochhar.

Page 12: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

JOIN CON SQL

SELECT tabella1.colonna, tabella2.colonnaFROM tabella1, tabella2[CROSS JOIN tabella2] |[NATURAL JOIN tabella 2] |[JOIN table2 USING (colonna)] |[JOIN table2 ON (tabella1.colonna = tabella2.colonna)] |[LEFT|RIGHT|FULL OUTER JOIN tabella2 ON (tabella1.colonna = tabella2.colonna)] ;

Page 13: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

CROSS JOINS

E’ L’equivalente del prodotto cartesiano

SELECT last_name, department_name

FROM employees

CROSS JOIN departments;

SELECT last_name, department_name

FROM employees, departments;

Page 14: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

NATURAL JOINS

• è basato su tutte le colonne delle due tabelle che hanno gli

stessi nomi di colonne

• seleziona le righe fra le due tabelle che valori uguali

• se le colonne hanno lo stesso nome ma sono di tipo

differente, ritorna un errore.

• prima della 9i non era possibile fare un join senza specificare i

nomi di colonna delle singole tabelle

Page 15: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

NATURAL JOINS

SELECT department_id, department_name, location_id, city

FROM departments

NATURAL JOIN locations;

Locations e departments sono in join sulla colonna location_id

che è la sola colonna che ha lo steso nome tra le due tabelle.

Se altre colonne avessero avuto lo stesso nome (e tipo) il join

sarebbe stato su tutte le colonne.

Page 16: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

NATURAL JOINS

SELECT department_id, department_name, location_id, city

FROM departments

NATURAL JOIN locations;

È equivalente all’equijoin

SELECT department_id,

department_name,departments.location_id, city

FROM departments,locations

WHERE departments.location_id = locations.location_id;

Page 17: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

CLAUSOLA USING

• se diverse colonne hanno lo stesso nome ma tipo differente, il

NATURAL JOIN deve essere modificato con la clausola USING

specificando le colonne che devono essere usate per l’equijoin

• non usare nomi di tabella o alias nella clausola using in

nessuna clausola della query

• NATURAL JOIN e USING sono mutualmente esclusivi

Page 18: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

CLAUSOLA USING

VALIDO:

SELECT d.department_name, l.city

FROM locations l JOIN departments d USING (location_id)

WHERE location_id = 1400;

NON VALIDO:

SELECT d.department_name, l.city

FROM locations l JOIN departments d USING (location_id)

WHERE d.location_id = 1400;

ORA-25154: column part of USING clause cannot have qualifier

Page 19: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

CLAUSOLA USING

SELECT e.employee_id, e.last_name, d.location_id

FROM employees e JOIN departments d

USING (department_id);

È l’quivalente del equijoin

SELECT e.employee_id, e.last_name, d.location_id

FROM employees e, departments d

WHERE e.department_id = d.departments_id;

Page 20: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

CLAUSOLA ON

• la condizione di join per il natural join è basata sull’equijoin di

tutte le colonne con lo stesso nome

• per specificare condizioni arbitrarie o specificare colonne di

join occorre usare la clausola ON

Page 21: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

CLAUSOLA ON

SELECT e.employee_id, e.last_name, e.department_id,

d.department_id, d.location_id

FROM employees e JOIN departments d

ON (e.department_id = d.department_id);

Può essere usata con colonne con nomi differenti

SELECT e.last_name emp, m.last_name mgr,

FROM employees e JOIN employees m

ON (e.manager_id = m.employee_id);

Corrisponde con il SELFJOIN

Page 22: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

JOIN SU TRE TABELLE

SELECT employee_id, city, department_name

FROM employees e

JOIN departments d

ON d.department_id = e.department_id

JOIN locations l

ON d.location_id = l.location_id;

Corrisponde con l’equijoin a tre tabelle…

Page 23: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

LEFT OUTER JOIN

SELECT e.last_name, e.department_id, d.department_name

FROM employees e

LEFT OUTER JOIN departments d

ON (e.department_id = d.department_id);

La query ritorna tutti i record della tabella EMPLOYEES che sono

nella tabella di sinistra del join anche se non ci sono

corrispondenze nella DEPARTMENTS.

Corrisponde con la notazione:

SELECT e.last_name, e.department_id, d.department_name

FROM employees e, departments d

WHERE d.department_id(+) = e.department_id;

Page 24: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

RIGHT OUTER JOIN

SELECT e.last_name, e.department_id, d.department_name

FROM employees e

RIGHT OUTER JOIN departments d

ON (e.department_id = d.department_id);

La query ritorna tutti i record della tabella DEPARTMENTS che

sono nella tabella di destra del join anche se non ci sono

corrispondenze nella EMPLOYEES.

Corrisponde con la notazione:

SELECT e.last_name, e.department_id, d.department_name

FROM employees e, departments d

WHERE d.department_id = e.department_id(+);

Page 25: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

FULL OUTER JOIN

SELECT e.last_name, e.department_id, d.department_name

FROM employees e

FULL OUTER JOIN departments d

ON (e.department_id = d.department_id);

La query restituisce tutte le righe della EMPLOYEES anche se

non ci sono righe corrispondenti nella DEPARTMENTS, inoltre

restituisce tutte le righe della tabella DEPARTMENTS anche se

non c’è corrispondenza nella tabella EMPLOYEES.

Page 26: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

CONDIZIONI AGGIUNTIVE

SELECT e.employee_id, e.last_name, e.department_id,

d.department_id. d.location_id

FROM employees e JOIN departments d

ON (e.department_id = d.department_id)

AND e.manager_id = 149;

Page 27: PRODOTTO CARTESIANO Otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una condizione di join non è valida tutte le righe della.

ORACLE - SQL

ORACLE SQL

Equi-join Natual Join

Outer-join Left Outer Join

Self-join Join ON

Non-Equi-Join Join USING

Prodotto Cartesiano Cross Join