EXISTS
viene utilizzato per restituire un valore booleano, JOIN
restituisce un'intera altra tabella
EXISTS
viene utilizzato solo per verificare se una sottoquery restituisce risultati e va in cortocircuito non appena lo fa. JOIN
viene utilizzato per estendere un set di risultati combinandolo con campi aggiuntivi di un'altra tabella a cui esiste una relazione.
Nel tuo esempio, le query sono semanticamente equivalenti.
In generale, usa EXISTS
quando:
- Non è necessario restituire i dati dalla tabella correlata
- Hai duplicati nella tabella correlata (
JOIN
può causare righe duplicate se i valori vengono ripetuti) - Vuoi verificare l'esistenza (usare invece di
LEFT OUTER JOIN...NULL
condizione)
Se disponi di indici appropriati, il più delle volte EXISTS
funzionerà in modo identico a JOIN
. L'eccezione riguarda le sottoquery molto complicate, dove normalmente è più veloce usare EXISTS
.
Se il tuo JOIN
chiave non è indicizzata, potrebbe essere più veloce usare EXISTS
ma dovrai fare un test per la tua circostanza specifica.
JOIN
la sintassi è più facile da leggere e anche più chiara normalmente.