prodotto cartesiano otteniamo un prodotto cartesiano quando: viene omessa la condizione di join una...
TRANSCRIPT
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
TIPI DI JOIN
Proprietà Oracle
Equijoin
Non-equijoin
Outer join
Self join
TIPI DI JOIN
SQL
Cross join
Natural join
Full or two sider outer join
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.
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.
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
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)
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
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)
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
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.
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)] ;
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;
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
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.
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;
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
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
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;
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
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
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…
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;
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(+);
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.
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;
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