2012-01-26 34 views
7

¿Cuál es la diferencia entre los dos comandos siguientes?Diferencia SQL entre IN y OR en WHERE

SELECT * FROM table WHERE id IN (id1, id2, ..., idn) 

y

SELECT * FROM table WHERE id = id1 OR id = id2 OR ... OR id = idn 

Cuál es más rápido? ¿Y será diferente si id es otro tipo?

+0

También sería bueno saber de qué implementación SQL estamos hablando aquí. – JNK

Respuesta

10

Ellos son semánticamente idénticos.

IN es solo una abreviatura de una cadena de declaraciones de igualdad como en el segundo ejemplo. El rendimiento también debería ser idéntico.

El tipo no debería importar, siempre se evaluará en una cadena de igualdades.

hay una diferencia cuando se utiliza NOT IN y datos que pueden ser NULL, sin embargo - un NULL no evaluará falsa para una comparación NOT IN, por lo que puede obtener los registros que no esperaba en el conjunto de resultados.

A modo de ejemplo:

SELECT 'Passed!' WHERE NULL NOT IN ('foo', 'bar')

La consulta anterior no devolverá una fila a pesar de que su valor nominal NULL es ni 'foo' o 'bar' - esto se debe a NULL es un estado desconocido, y SQL no se puede decir con certeza de que el valor desconocido es NO uno de los valores enumerados IN.

+0

'Hay una diferencia cuando usas NOT IN' - - ¿Cómo es eso? 'NOT IN' ===' f! = 1 AND f! = 2'. Y ambas expresiones nuevamente se optimizan de la misma manera (terrible) – zerkms

+0

@zerkms - no con 'NULL', al menos en SQL Server. 'SELECCIONAR 1 DONDE NULL NOT IN ('foo', 'bar')' - no obtendrá una fila, pero lo esperaría desde 'NULL' no es ni foo ni barra – JNK

+0

ah, creo que quiere decir que hay 2 casos diferentes: cuando se usa 'NOT IN' y cuando hay' NULL' entre paréntesis – zerkms

-3

Creo que IN es más rápido simplemente porque proporciona una consulta más sencilla que el servidor puede manejar. Solo mi pensamiento.

Véase el siguiente comentario de Fernando Giovanini en este artículo, se menciona que en lo hace no sólo más fácil de leer, pero también más rápido: http://www.ajaxline.com/32-tips-to-speed-up-your-mysql-queries#comment-325677194

+1

No es posible decir que algo sea más rápido que cualquier otra cosa cuando usas 'secmatrix like '% 8: 0%' O secmatrix LIKE '% 8: 0%' O secmatrix LIKE '% 4: 0%' O secmatrix LIKE ' % 2: 0% '' en su consulta.Se ve al menos gracioso (o stuid) ;-) – zerkms

+0

personalmente. Te aconsejo que nunca consultes a personas desconocidas con declaraciones sin ninguna prueba (especialmente cuando está completamente equivocado) – zerkms

+0

Nunca dije que lo que dijo era verdad, ni dije que lo que dije era verdad Todo lo que hice fue dar mi opinión y referirme a un artículo. Es por eso que varias personas colocan respuestas, cada uno tiene su propia opinión y/o experiencia. Vea la descripción general y sabrá qué lado está ganando. –

1

Esto depende de la implementación del optimizador DBMS específico y del propio motor.

Pero debería estar bien al pensar que son semánticamente similares y se optimizan de manera similar.

La optimización no dependería del tipo de campo

1

al menos en sqlserver tanto da mismo plan de ejecución !!!

+0

Creo que la pregunta es en términos de sintonización, no de operación. – blong

+0

@Brian está mi carta incompleta? en todos los términos, las consultas son iguales, excepto en legibilidad que es obvia diferente –

+0

@Brian L .: "¿Cuál es más rápido?" --- esta es una pregunta clara y esta respuesta, para ser claro, responde parcialmente (aunque no me gusta ;-) +1 de todos modos – zerkms

0

Cada DBMS es lo suficientemente fiable como para que el operador IN sea mucho mejor debido a la estructura de datos. Además, cuando el db calcula un plan sql, no necesariamente traduce el formulario OR en la forma IN, simplemente porque el operador OR puede combinar diferentes condiciones por completo. Desde una perspectiva lógica, son bastante iguales.

Cuestiones relacionadas