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.colonna FROM tabella1, tabella2 WHERE 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 unuguaglianza. 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_NAMEDEPARTMENT_ID Administration10 Marketing20 Shipping50 IT60 Contracting190 DEPARTMENT_IDLAST_NAME 90King 90Hunold 60Rajs 50Matos 80Zlotkey
OUTER JOINS Occorre usare lOUTER JOIN per vedere anche le righe che non soddisfano la condizione di join. Loperatore di outer join è il (+) SELECT tabella1.colonna, tabella2.colonna FROM tabella1, tabella2 WHERE tabella1.colonna1(+) = tabella2.colonna2; SELECT tabella1.colonna, tabella2.colonna FROM tabella1, tabella2 WHERE tabella1.colonna1 = tabella2.colonna2(+); Il (+) è posizionato dalla parte del join in cui mancano le righe
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_id DEPARTMENT_NAMEDEPARTMENT_ID Administration10 Marketing20 Shipping50 IT60 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.colonna FROM 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 Lequivalente 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 allequijoin 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 lequijoin 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); È lquivalente 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 sullequijoin 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 lequijoin 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 ORACLESQL Equi-joinNatual Join Outer-joinLeft Outer Join Self-joinJoin ON Non-Equi-JoinJoin USING Prodotto CartesianoCross Join