Vantaggi e svantaggi di JOIN vs Sottoquery in SQL
Una sottoquery è una query dentro un'altra query. Può contenere altre sottoquery ("nested"). Un JOIN riferisce due o più tabelle nella clausola FROM. Diversi motori database ottimizzano sottoquery e JOIN differentemente. Es. l'ottimizzatore DB2 trasforma sottoquery in JOIN se certi criteri sono soddisfatti. In alcuni casi, JOIN rende meglio di una sottoquery.
Cosa è una sottoquery
Una sottoquery è uno statement "SELECT" dentro la clausola "WHERE" o "HAVING" di un "INSERT", "UPDATE", "MERGE" o "DELETE" esterno. Chiamata anche "inner query" o "inner select". Può avere clausola "FROM" con una o più tabelle e opzionalmente "WHERE", "GROUP BY" o "HAVING". Sempre racchiusa tra parentesi.
Vantaggi e svantaggi delle sottoquery
Vantaggi: strutturano la query isolando ogni parte, eseguono operazioni che richiederebbero JOIN e UNION complessi, sono più leggibili. Furono la base del nome "Structured Query Language" (SQL) per la loro struttura leggibile. Svantaggio: non si può modificare una tabella e selezionare dalla stessa tabella in una sottoquery nello stesso statement SQL. Le sottoquery possono essere più lente da eseguire di un JOIN per come l'ottimizzatore le processa.
Cosa è un JOIN
La maggior parte delle sottoquery può essere riscritta come JOIN e viceversa. Un JOIN definisce due o più tabelle per una colonna correlata. Solitamente si fa JOIN su chiavi primarie ed esterne. Es. tabella dipendenti con chiave primaria id_dipendente, tabella timesheet con id_dipendente come chiave esterna. JOIN SQL: "WHERE dipendenti.id_dipendente = timesheet.id_dipendente" o "FROM dipendenti JOIN timesheet ON (dipendenti.id_dipendente = timesheet.id_dipendente)".
Vantaggi e svantaggi dei JOIN
Vantaggio principale: esecuzione più veloce. L'aumento prestazioni potrebbe non essere percettibile dall'utente finale. Ma poiché colonne sono nominate, indicizzate e ottimizzate dal motore database, il tempo di recupero è quasi sempre più veloce di una sottoquery. Esistono INNER/OUTER JOIN, LEFT/RIGHT, FULL, CROSS. Svantaggio: meno leggibili delle sottoquery. Un altro svantaggio: può essere confuso scegliere il tipo di JOIN appropriato per ottenere il result set corretto.