FINNS
EXISTS är bokstavligen för att kontrollera att det finns specificerade kriterier. I nuvarande standard SQL kommer det att tillåta dig att specificera mer än ett kriterium för jämförelse - IE om du vill veta när col_a och col_b båda matchar - vilket gör det lite starkare än IN-satsen. MySQL IN stöder tupler, men syntaxen är inte portabel, så EXISTS är ett bättre val både för läsbarhet och portabilitet.
En annan sak att vara medveten om med EXISTS är hur det fungerar - EXISTS returnerar en boolean och kommer att returnera en boolean vid den första matchen. Så om du har att göra med dubbletter/multiplar kommer EXISTS att vara snabbare att köra än IN eller JOIN beroende på data och behov.
IN
IN är syntaktisk socker för ELLER-satser. Även om det är väldigt tillmötesgående finns det problem med att hantera många värden för den jämförelsen (norr om 1 000).
INTE
NOT-operatorn vänder bara på logiken.
Subqueries kontra JOINs
Mantrat "använd alltid joins" är felaktigt, eftersom JOINs riskerar att blåsa upp resultatuppsättningen om det finns mer än en underordnad post mot en förälder. Ja, du kan använda DISTINCT eller GROUP BY för att hantera detta, men det är mycket troligt att detta ger prestandafördelarna med att använda en JOIN-moot. Känna till dina data och vad du vill ha för en resultatuppsättning - dessa är nyckeln till att skriva SQL som fungerar bra.
För att upprepa att veta när och varför man ska veta vad man ska använda - LEFT JOIN IS NULL är den snabbaste uteslutningslistan på MySQL om de jämförda kolumnerna INTE är nullbara , annars är INTE I/FINNS INTE bättre val.
Referens:
- MySQL:LEFT JOIN/ÄR NULL, INTE I, FINNS INTE på nullbara kolumner
- MySQL:LEFT JOIN/ÄR NULL, INTE I, FINNS INTE på EJ nullbara kolumner