Forskjeller mellom EXISTS og IN operatører i SQL

Forfatter: Peter Berry
Opprettelsesdato: 12 August 2021
Oppdater Dato: 16 November 2024
Anonim
Forskjeller mellom EXISTS og IN operatører i SQL - Artikler
Forskjeller mellom EXISTS og IN operatører i SQL - Artikler

Innhold

En konstant utfordring i å bruke SQL er å bestemme riktig bruk av EXISTS og IN operatørene. De to operatørene kan produsere de samme resultatene, men ikke alltid. I tillegg er det betydelig diskusjon om hvordan hver operatør er optimalisert for fart. Brukere bør forstå de ulike egenskapene til hver operatør og eksperimentere med de to for å bestemme riktig bruk.


Vurder dine SQL-mål når du velger EXISTS eller IN (Jupiterimages / Photos.com / Getty Images)

IN operatør

IN-operatøren returnerer en rad hvis feltverdien til et bord tilfredsstiller WHERE-tilstanden i en liste over IN-verdier. Den brukes vanligvis som en del av et hovedforespørsel eller i forbindelse med en underforespørsel.

Eksempel 1: WHERE table.field IN ('a', 'b', 'c') Eksempel 2: WHERE table.field IN (Subquery som returnerer et sett)

EXISTS operatør

EXISTS-operatøren returnerer alle hovedrader hvis en subquery inneholder noen rader. Den brukes kun i forbindelse med en subquery. Rammene som returneres bestemmes av filteret i hovedspørsmålet.

Eksempel: Hvor eksisterer (Subquery som returnerer et sett)

forskjellen

IN-operatøren kan ikke evaluere NULL-verdier, slik at slike linjer alltid vil være falske, og vil ikke bli returnert, i motsetning til EXISTS-operatøren, som evaluerer og returnerer linjer med null-verdier.


likheter

Både EXISTS og IN støtter korrelerte og ukorrelerte undersøkelser, og begge kan produsere lignende resultater. Når de korreleres, tilfredsstiller de et hovedfeltfelt for et underkursfelt (f.eks .: principal.id = subquery.id). Underquery evaluerer rad for rad, for hver forekomst funnet. I dette tilfellet vil IN og EXISTS returnere de samme linjene basert på lignende "id" -betingelser. Når de er ukorrelerte, bearbeider de to operatørene sine undersøkelser og kombinerer deretter resultatene for hovedspørsmålet.

ytelse

Ytelsen bestemmes av databaseoptimereren og utførelsesplanen som brukes for den utførte koden. For EXISTS og IN, kan optimalisereren velge forskjellige baner. I Oracle, IKKE EXISTS er vanligvis raskere enn IKKE IN. Til slutt er det nødvendig med noen forsøk og feil for å sortere den korteste banen, avhengig av hvilken database og versjon som brukes. Sørg for å bruke operatøren som garanterer de riktige resultatene først, og prøv å erstatte operatørene for å se hvilken som er raskest.