Indhold
En konstant udfordring i at bruge SQL er at bestemme den korrekte brug af EXISTS og IN operatørerne. De to operatører kan producere de samme resultater, men ikke altid. Derudover er der stor debat om, hvordan hver operatør er optimeret til hastighed. Brugere skal forstå de forskellige attributter for hver operatør og eksperimentere med de to for at bestemme passende brug.
Overvej dine SQL-mål, når du vælger EXISTS eller IN (Jupiterimages / Photos.com / Getty Images)
IN operatør
IN-operatøren returnerer en række, hvis feltværdien af en tabel opfylder WHERE-tilstanden i en liste over IN-værdier. Det bruges typisk som en del af et hovedforespørgsel eller i forbindelse med en underforespørgsel.
Eksempel 1: WHERE table.field IN ('a', 'b', 'c') Eksempel 2: WHERE table.field IN (Subquery, der returnerer et sæt)
EXISTS operatør
EXISTS-operatøren returnerer alle store rækker, hvis en underforespørgsel indeholder nogen rækker. Den bruges kun i forbindelse med en underforespørgsel. De tilbageførte rækker bestemmes af filteret i hovednavnet.
Eksempel: Hvor eksisterer (Subquery, der returnerer et sæt)
forskel
IN-operatøren kan ikke evaluere NULL-værdier, så sådanne linjer vil altid være falske og vil ikke blive returneret, i modsætning til EXISTS-operatøren, som evaluerer og returnerer linjer med NULL-værdier.
ligheder
Både EXISTS og IN understøtter korrelerede og ukorrelerede underundersøgelser, og begge kan producere lignende resultater. Når de korreleres, tilfredsstiller de et hovedforespørgselsfelt for et underforespørgselsfelt (fx: principal.id = subquery.id). Underquery evaluerer række for række, for hver forekomst fundet. I dette tilfælde vil IN og EXISTS returnere de samme linjer baseret på lignende "id" -betingelser. Når de ikke er korrelerede, behandler de to operatører deres underforespørgsler og kombinerer derefter resultaterne for hovednavnet.
ydeevne
Ydeevnen bestemmes af databaseoptimeringsværktøjet og den udførelsesplan, der anvendes til den udførte kode. For EXISTS og IN kan optimatoren vælge forskellige stier. I Oracle er IKKE EXISTS normalt hurtigere end IKKE IN. I sidste ende kræves der nogle forsøg og fejl for at sortere den korteste vej afhængigt af hvilken database og version der bruges. Sørg for at bruge operatøren, der garanterer de rigtige resultater først, og prøv derefter at erstatte operatørerne for at se, hvilken er den hurtigste.