Contenuto
Una costante sfida nell'uso di SQL è la determinazione dell'uso corretto degli operatori EXISTS e IN. I due operatori possono produrre gli stessi risultati, ma non sempre. Inoltre, vi è un ampio dibattito su come ciascun operatore è ottimizzato per la velocità. Gli utenti dovrebbero comprendere i diversi attributi di ciascun operatore e sperimentare con i due per determinare l'utilizzo appropriato.
Considera i tuoi obiettivi SQL quando scegli EXISTS o IN (Jupiterimages / Photos.com / Getty Images)
Operatore IN
L'operatore IN restituisce una riga se il valore del campo di una tabella soddisfa la condizione WHERE in un elenco di valori IN. Viene in genere utilizzato come parte di una query principale o in combinazione con una sottoquery.
Esempio 1: WHERE table.field IN ('a', 'b', 'c') Esempio 2: WHERE table.field IN (Subquery che restituisce un set)
Operatore ESISTE
L'operatore EXISTS restituisce tutte le righe principali se una sottoquery contiene delle righe. Viene utilizzato solo in combinazione con una sottoquery. Le righe restituite sono determinate dal filtro nella query principale.
Esempio: WHERE EXISTS (Subquery che restituisce un set)
differenza
L'operatore IN non può valutare i valori NULL, quindi tali linee saranno sempre false e non verranno restituite, a differenza dell'operatore EXISTS, che valuta e restituisce le linee con valori NULL.
somiglianze
Sia EXISTS che IN supportano sottoquery correlate e non correlate, ed entrambi possono produrre risultati simili. Se correlati, soddisfano un campo di query principale per un campo di sottoquery (ad esempio: principal.id = subquery.id). La sottoquery valuta riga per riga, per ogni occorrenza rilevata. In questo caso, IN e EXISTS restituiranno le stesse linee in base a condizioni di "id" simili. Se non correlati, i due operatori elaborano le subquery e quindi combinano i risultati per la query principale.
performance
Le prestazioni sono determinate dall'ottimizzatore del database e dal piano di esecuzione utilizzato per il codice eseguito. Per EXISTS e IN, l'ottimizzatore può scegliere diversi percorsi. In Oracle, NOT EXISTS è solitamente più veloce di NOT IN. Alla fine, alcuni tentativi ed errori sono necessari per ordinare il percorso più breve, a seconda del database e della versione utilizzata. Assicurati di utilizzare l'operatore che garantisce i risultati corretti prima, quindi prova a sostituire gli operatori per vedere qual è il più veloce.