BESTAAT
EXISTS is letterlijk bedoeld om te controleren op het bestaan van gespecificeerde criteria. In de huidige standaard SQL kun je meer dan één vergelijkingscriterium specificeren - IE als je wilt weten wanneer col_a en col_b beide overeenkomen - wat het iets sterker maakt dan de IN-clausule. MySQL IN ondersteunt tupels, maar de syntaxis is niet overdraagbaar, dus EXISTS is een betere keuze voor zowel leesbaarheid als draagbaarheid.
Het andere ding om op te letten met EXISTS is hoe het werkt - EXISTS retourneert een boolean en retourneert een boolean bij de eerste match. Dus als je te maken hebt met duplicaten/veelvouden, is EXISTS sneller uit te voeren dan IN of JOIN's, afhankelijk van de gegevens en de behoeften.
IN
IN is syntactische suiker voor OR-clausules. Hoewel het erg meegaand is, zijn er problemen met het omgaan met veel waarden voor die vergelijking (ten noorden van 1.000).
NIET
De NOT-operator draait de logica gewoon om.
Subquery's versus JOIN's
De mantra "gebruik altijd joins" is gebrekkig, omdat JOIN's het risico lopen de resultatenset op te blazen als er meer dan één onderliggende record is tegen een ouder. Ja, je kunt DISTINCT of GROUP BY gebruiken om dit aan te pakken, maar het is zeer waarschijnlijk dat dit het prestatievoordeel van het gebruik van een JOIN-moot maakt. Ken uw gegevens en wat u wilt voor een resultatenset - deze zijn de sleutel tot het schrijven van SQL die goed presteert.
Om nogmaals te herhalen dat u weet wanneer en waarom u moet weten wat u moet gebruiken:LEFT JOIN IS NULL is de snelste uitsluitingslijst op MySQL als de vergeleken kolommen NIET nullable zijn , anders zijn NOT IN/NOT EXISTS betere keuzes.
Referentie:
- MySQL:LEFT JOIN/IS NULL, NOT IN, NOT BESTAAT op nullable kolommen
- MySQL:LEFT JOIN/IS NULL, NOT IN, NOT BESTAAT op NIET nullable kolommen