En vedvarende udfordring i at bruge SQL er at fastlægge den korrekte brug af de eksisterer, og IN aktører. De to operatører kan producere de samme resultater , men ikke altid gør det. Også, der er betydelig debat om, hvor hver enkelt operatør er optimeret til hastighed. Brugerne skal forstå de forskellige attributter i hver enkelt erhvervsdrivende og prøve begge til at bestemme den relevante funktion. IN Operator
IN operatør returnerer en række, hvis en WHERE konditioneret table.field værdi matcher en liste med IN værdier. IN anvendes typisk som en del af en hovedforespørgslen eller i forbindelse med en underforespørgsel
Eksempel 1: . WHERE Table.Field in ( 'a ', ' b' , 'c' )
Eksempel 2: WHERE Table.Field in ( Underforespørgsler tilbagevenden sæt af værdier)
EXISTS Operator
EXISTS operatør returnerer alle hovedforespørgslen rækker , hvis underforespørgslen indeholder nogen rækker.
EXISTS bruges kun i forbindelse med en underforespørgsel . Rækker returneret bestemmes ved at filtrere på de vigtigste forespørgslen niveau . Eksempel: WHERE EXISTS ( Underforespørgsler tilbagevenden sæt af værdier)
Forskel
kan ikke vurdere nuller , så de rækker altid er falsk, og ikke vendt tilbage.
EXISTS kan evaluere nuller , så de rækker kan returneres .
ligheder
FINDES , og både støtte korrelerede og ukorrelerede underforespørgsler og både kan producere store lignende resultater. Når korreleret , FINDES og IN matche en hovedforespørgslen felt til en underforespørgsel felt ( tidl. : main.id = subquery.id ) . Underforespørgslen evaluerer rækkevis for hver fundet match . I dette tilfælde vil IN og EXISTS returnerer de samme rækker baseret på tilsvarende id kampe. Når ukorrelerede , FINDES og IN proces deres underforespørgsler først , derefter matche resultaterne til hovedforespørgslen .
Ydeevne eksisterer og IN
ydeevne bestemmes af databasen optimizer og udførelsen planen den beskæftiger for henrettet kode. For FINDES og IN , kan optimizer vælge forskellige stier. I Oracle, er dette ved NOT EXISTS undgå en anti- slutte , og typisk bevise hurtigere end NOT IN. I sidste ende , er nogle trial and error kræves for at benchmarke den hurtigste vej afhængigt af databasen , og det er versionen bliver brugt. Vær sikker på at bruge operatør, der sikrer korrekte resultater først, derefter , hvis alt er det samme , kan du prøve at substituere eksisterer og IN til virkelig se, der er hurtigere.