ProgrammazioneSviluppatore SQL

Spiega la differenza tra l'operatore JOIN e le sottoquery. Quando dovresti utilizzare ciascuno dei due approcci? Fai un esempio di utilizzo.

Supera i colloqui con l'assistente IA Hintsage

Risposta

JOIN consente di unire più tabelle in un'unica query SELECT in base a una determinata condizione, di solito tramite la parola chiave ON. Una sottoquery (o query annidata) è una query inserita all'interno di un'altra query. JOIN funziona meglio per l'unione di tabelle grandi con buoni indici, è più trasparente per l'ottimizzatore e di solito vengono eseguite più rapidamente. Le sottoquery sono utili quando è necessario calcolare aggregati o in presenza di condizioni impossibili tramite JOIN (ad esempio, query correlate).

Esempio di JOIN:

SELECT employees.name, departments.name FROM employees JOIN departments ON employees.dept_id = departments.id;

Esempio di sottoquery:

SELECT name FROM employees WHERE dept_id IN ( SELECT id FROM departments WHERE location = 'Moscow' );

Domanda trabocchetto

"È vero che l'uso delle sottoquery è sempre più lento dell'uso di JOIN?"

Risposta: No, non sempre! Sottoquery scritte correttamente vengono spesso trasformate dall'ottimizzatore in JOIN interni. Inoltre, a volte le sottoquery sono più efficienti — ad esempio, quando la query esterna lavora con un piccolo insieme di dati e la sottoquery restituisce risultati già aggregati.

Esempio:

SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);

Questa sottoquery sarà eseguita una sola volta.


Storia

In un grande progetto, per un report sono state utilizzate sottoquery annidate invece di JOIN. Con l'aumento del volume dei dati, la query è passata da secondi a diversi minuti. Dopo la sostituzione delle sottoquery con JOIN, le prestazioni sono aumentate di 10 volte.


Storia

In un progetto, un analista ha riscritto una query con GROUP BY in una sottoquery, senza accorgersi che in seguito si sono presentate duplicazioni a livello di JOIN. Questo ha portato a dati errati nei report — le somme erano gonfiate a causa del prodotto cartesiano.


Storia

L'utilizzo di una sottoquery correlata nel ciclo esterno (per ogni riga) ha portato a una completa degradazione delle prestazioni con l'aumento della tabella. Si è deciso di utilizzare JOIN con aggregazione — il tempo di elaborazione delle query è sceso da ore a minuti.