ESISTE
EXISTS è letteralmente per verificare l'esistenza di criteri specificati. Nell'attuale SQL standard, ti consentirà di specificare più di un criterio per il confronto - IE se vuoi sapere quando col_a e col_b corrispondono entrambi - il che lo rende un po' più forte della clausola IN. MySQL IN supporta le tuple, ma la sintassi non è portabile, quindi EXISTS è una scelta migliore sia per la leggibilità che per la portabilità.
L'altra cosa da tenere presente con EXISTS è come funziona:EXISTS restituisce un booleano e restituirà un booleano alla prima corrispondenza. Quindi, se hai a che fare con duplicati/multipli, EXISTS sarà più veloce da eseguire rispetto a IN o JOIN a seconda dei dati e delle esigenze.
IN
IN è lo zucchero sintattico per le clausole OR. Sebbene sia molto accomodante, ci sono problemi nell'affrontare molti valori per quel confronto (a nord di 1.000).
NON
L'operatore NOT inverte semplicemente la logica.
Subquery vs JOIN
Il mantra "usa sempre i join" è imperfetto, perché i JOIN rischiano di gonfiare il set di risultati se c'è più di un record figlio contro un genitore. Sì, puoi usare DISTINCT o GROUP BY per affrontare questo problema, ma è molto probabile che ciò renda il vantaggio in termini di prestazioni dell'utilizzo di un JOIN discutibile. Conosci i tuoi dati e cosa vuoi per un set di risultati:questi sono fondamentali per scrivere un SQL che funzioni bene.
Per ribadire sapere quando e perché sapere cosa usare - LEFT JOIN IS NULL è l'elenco di esclusione più veloce su MySQL se le colonne confrontate NON sono annullabili , altrimenti NOT IN/NOT EXISTS sono scelte migliori.
Riferimento:
- MySQL:LEFT JOIN/IS NULL, NOT IN, NOT EXISTS su colonne nullable
- MySQL:LEFT JOIN/IS NULL, NOT IN, NOT EXISTS su colonne NON nullable