Differenze tra EXISTS e IN in SQL

Considera i tuoi obiettivi SQL quando scegli EXISTS o IN.

Operatore IN

L'operatore IN restituisce una riga se un valore di tabella WHERE campo condizionato corrisponde a un elenco di valori IN. IN viene normalmente utilizzato come parte di una query principale o insieme a una sottoquery. Esempio 1: WHERE Table.Field in ('a', 'b', 'c') Esempio 2: WHERE Table.Field in (set di valori restituiti dalla sottoquery)

Operatore ESISTE

L'operatore EXISTS restituisce tutte le righe di query principali se la sottoquery contiene delle righe. EXISTS viene utilizzato solo in combinazione con una sottoquery. Le righe restituite sono determinate dal filtro al livello di query principale. Esempio: WHERE EXISTS (set di valori di ritorno della sottoquery)

differenza

IN non può valutare NULL, quindi le righe sono sempre false e non vengono restituite. EXISTS può valutare NULL, quindi è possibile restituire le righe.

somiglianze

EXISTS e IN supportano entrambi subquery correlate e non correlate, ed entrambi possono produrre risultati principali simili. Se correlato, EXISTS e IN corrispondono a un campo di query principale con un campo di sottoquery (es: main.id = subquery.id). La sottoquery viene valutata riga per riga, per ogni corrispondenza trovata. In questo caso, IN e EXISTS restituiranno le stesse righe basate su identificazioni simili. Quando non sono correlati, EXISTS e IN elaborano prima le loro sottoquery e poi corrispondono ai risultati con la query principale.

Prestazioni di EXISTS e IN

La prestazione è determinata dall'ottimizzatore del database e dal piano di esecuzione che utilizza per il codice che viene eseguito. Per EXISTS e IN, l'ottimizzatore può scegliere diversi percorsi. In Oracle, NO EXISTS evita un anti-join, e in genere si dimostra più veloce di NO IN. In breve, richiede un po 'di prove ed errori per determinare il percorso più veloce a seconda del database e della sua versione in uso. Assicurati di utilizzare l'operatore che garantisce i risultati corretti, se lo stesso, prova a sostituire EXISTS e IN per vedere veramente quale è più veloce.