Al usar SQL, ¿hay algún beneficio de usar =
en una WHERE
cláusula en lugar de LIKE
?
Sin ningún operador especial, LIKE
y =
son lo mismo, ¿verdad?
sql
performance
equals
sql-like
Travis
fuente
fuente
5
votos para la etiqueta de operador similar . ¿Podría solicitar amablemente que sugiera sql-like como sinónimo ?Respuestas:
Diferentes operadores
LIKE
y=
son diferentes operadores. ¡La mayoría de las respuestas aquí se centran en el soporte de comodines, que no es la única diferencia entre estos operadores!=
es un operador de comparación que opera con números y cadenas. Al comparar cadenas, el operador de comparación compara cadenas enteras .LIKE
es un operador de cadena que compara carácter por carácter .Para complicar las cosas, ambos operadores usan una clasificación que puede tener efectos importantes en el resultado de la comparación.
Ejemplo motivador
Primero identifiquemos un ejemplo donde estos operadores producen resultados obviamente diferentes. Permítanme citar el manual de MySQL:
Tenga en cuenta que esta página del manual de MySQL se llama Funciones de comparación de cadenas y
=
no se trata, lo que implica que=
no es estrictamente una función de comparación de cadenas.¿Cómo funciona el
=
trabajo?El Estándar SQL § 8.2 describe cómo
=
compara cadenas:(Énfasis añadido.)
¿Qué significa esto? Significa que al comparar cadenas, el
=
operador es solo una delgada envoltura alrededor de la clasificación actual. Una clasificación es una biblioteca que tiene varias reglas para comparar cadenas. Aquí hay un ejemplo de una colación binaria de MySQL :Esta colación particular se compara para comparar byte por byte (por eso se llama "binario", no le da ningún significado especial a las cadenas). Otras colaciones pueden proporcionar comparaciones más avanzadas.
Por ejemplo, aquí hay una clasificación UTF-8 que admite comparaciones que no distinguen entre mayúsculas y minúsculas. El código es demasiado largo para pegar aquí, pero vaya a ese enlace y lea el cuerpo de
my_strnncollsp_utf8mb4()
. Esta intercalación puede procesar varios bytes a la vez y puede aplicar varias transformaciones (como la comparación entre mayúsculas y minúsculas). El=
operador está completamente abstraído de los caprichos de la colación.¿Cómo funciona el
LIKE
trabajo?El Estándar SQL § 8.5 describe cómo
LIKE
compara cadenas:(Énfasis añadido.)
Esto es bastante prolijo, así que analicemos. Los ítems ii y iii se refieren a los comodines
_
y%
, respectivamente. SiP
no contiene comodines, solo se aplica el elemento iv. Este es el caso de interés planteado por el OP.En este caso, compara cada "subcadena" (caracteres individuales) con
M
cada subcadena alP
usar la colación actual.Conclusiones
La conclusión es que al comparar cadenas,
=
compara toda la cadena mientrasLIKE
compara un carácter a la vez. Ambas comparaciones usan la colación actual. Esta diferencia conduce a resultados diferentes en algunos casos, como se evidencia en el primer ejemplo en esta publicación.¿Cual deberías usar? Nadie puede decirte eso: debes usar el que sea correcto para tu caso de uso. No optimice prematuramente cambiando operadores de comparación.
fuente
LIKE
hace, pero esta respuesta explica asombrosamente que usarLIKE
sin%
o_
presente no es lo mismo que usar=
. Que tu respuesta reciba mil votos a favor.'AbCdEfG'
, y lo hagoWHERE MyCol = 'abcdefg'
, todavía recupero esa fila, a pesar de que claramente no son equivalentes byte a byteset charset latin1;
SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
da 0 y tambiénSELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
da 0.El operador igual (=) es un "operador de comparación compara dos valores para la igualdad". En otras palabras, en una declaración SQL, no devolverá verdadero a menos que ambos lados de la ecuación sean iguales. Por ejemplo:
El operador LIKE "implementa una comparación de coincidencia de patrón" que intenta hacer coincidir "un valor de cadena con una cadena de patrón que contiene caracteres comodín". Por ejemplo:
LIKE generalmente se usa solo con cadenas e iguales (creo) es más rápido. El operador igual trata los caracteres comodín como caracteres literales. La diferencia en los resultados devueltos son los siguientes:
Y
Devolvería el mismo resultado, aunque usar LIKE generalmente llevaría más tiempo ya que es una coincidencia de patrón. Sin embargo,
Y
Devuelve resultados diferentes, donde el uso de "=" da como resultado solo resultados con "Chris%" y el operador LIKE devolverá cualquier cosa que comience con "Chris".
Espero que ayude. Alguna buena información se puede encontrar aquí .
fuente
Esta es una copia / pegar de otra respuesta mía para la pregunta SQL 'like' vs '=' performance :
Un ejemplo personal con mysql 5.5: tenía una unión interna entre 2 tablas, una de 3 millones de filas y una de 10 mil filas.
Al usar un Me gusta en un índice como se muestra a continuación (sin comodines), tardó unos 30 segundos:
usando 'explicar' obtengo:
Al usar un '=' en la misma consulta, tardó aproximadamente 0.1 segundos:
Usando 'explicar' obtengo:
Como puede ver,
like
canceló por completo la búsqueda de índice, por lo que la consulta tomó 300 veces más tiempo.fuente
LIKE
y=
son diferentesLIKE
es lo que usarías en una consulta de búsqueda. También permite comodines como_
(comodín de carácter simple) y%
(comodín de varios caracteres).=
debe usarse si desea coincidencias exactas y será más rápido.Este sitio explica
LIKE
fuente
Una diferencia, aparte de la posibilidad de usar comodines con LIKE, está en los espacios finales: El operador = ignora el espacio final, pero LIKE no.
fuente
Depende del sistema de base de datos.
Generalmente sin caracteres especiales, sí, = y LIKE son iguales.
Sin embargo, algunos sistemas de bases de datos pueden tratar la configuración de intercalación de manera diferente con los diferentes operadores.
Por ejemplo, en MySQL, las comparaciones con = en cadenas siempre distinguen entre mayúsculas y minúsculas, por lo que LIKE sin caracteres especiales es lo mismo. En algunos otros RDBMS, LIKE distingue entre mayúsculas y minúsculas, mientras que = no lo es.
fuente
Para este ejemplo, damos por sentado que varcharcol no contiene
''
y no tiene una celda vacía en esta columnaEl primero da como resultado una salida de 0 filas, mientras que el segundo muestra la lista completa. = es un caso estrictamente coincidente, mientras que like actúa como un filtro. Si el filtro no tiene criterios, todos los datos son válidos.
Me gusta: en virtud de su propósito, funciona un poco más lento y está diseñado para usarse con varchar y datos similares.
fuente
Si busca una coincidencia exacta, puede usar ambos, = y LIKE.
El uso de "=" es un poco más rápido en este caso (buscando una coincidencia exacta): puede verificarlo usted mismo haciendo la misma consulta dos veces en SQL Server Management Studio, una vez usando "=", una vez usando "LIKE", y luego usando "Consulta" / "Incluir plan de ejecución real".
Ejecute las dos consultas y debería ver sus resultados dos veces, más los dos planes de ejecución reales. En mi caso, se dividieron en un 50% frente a un 50%, pero el plan de ejecución "=" tiene un "costo de subárbol estimado" más pequeño (se muestra al pasar el cursor sobre el cuadro "SELECCIONAR" más a la izquierda), pero de nuevo, es realmente No es una gran diferencia.
Pero cuando comienza a buscar con comodines en su expresión LIKE, el rendimiento de la búsqueda disminuirá. La búsqueda "LIKE Mill%" aún puede ser bastante rápida: SQL Server puede usar un índice en esa columna, si hay uno. La búsqueda de "LIKE% expression%" es terriblemente lenta, ya que la única forma en que SQL Server puede satisfacer esta búsqueda es haciendo un escaneo completo de la tabla. ¡Así que ten cuidado con tus LIKE!
Bagazo
fuente
El uso de = evita los comodines y los conflictos de caracteres especiales en la cadena cuando genera la consulta en tiempo de ejecución.
Esto facilita la vida del programador al no tener que escapar de todos los caracteres comodín especiales que pueden entrar en la cláusula LIKE y no producir el resultado deseado. Después de todo, = es el escenario de caso de uso del 99%, sería un dolor tener que escapar de ellos cada vez.
pone los ojos en blanco en los años 90
También sospecho que es un poco más lento, pero dudo que sea significativo si no hay comodines en el patrón.
fuente
Para abordar la pregunta original sobre el rendimiento, todo se reduce a la utilización del índice . Cuando se produce un escaneo de tabla simple, "LIKE" y "=" son idénticos . Cuando los índices están involucrados, depende de cómo se forme la cláusula LIKE. Más específicamente, ¿cuál es la ubicación de los comodines?
Considera lo siguiente:
También puede haber una diferencia insignificante en la creación del plan de consulta al usar "=" vs "LIKE".
fuente
Además de los comodines, la diferencia entre
=
ANDLIKE
dependerá tanto del tipo de servidor SQL como del tipo de columna.Toma este ejemplo:
Con MS SQL Server 2012 , los espacios finales se ignorarán en la comparación, excepto
LIKE
cuando el tipo de columna seaVARCHAR
.Usando MySQL 5.5 , los espacios finales se ignorarán para
=
, pero no paraLIKE
, conCHAR
yVARCHAR
.Usando PostgreSQL 9.1 , los espacios son significativos con ambos
=
y con elLIKE
usoVARCHAR
, pero no conCHAR
(ver documentación ).El comportamiento con
LIKE
también difiere conCHAR
.Usando los mismos datos que arriba, usando un explícito
CAST
en el nombre de la columna también hace una diferencia :Esto solo devuelve filas para "CAST both" y "CAST col".
fuente
La palabra clave LIKE indudablemente viene con una "etiqueta de precio de rendimiento" adjunta. Dicho esto, si tiene un campo de entrada que podría incluir caracteres comodín para su consulta, recomendaría usar LIKE solo si la entrada contiene uno de los comodines. De lo contrario, use el estándar igual a comparación.
Atentamente...
fuente
Realmente se trata de lo que quieres que haga la consulta. Si quiere decir una coincidencia exacta, use =. Si te refieres a un partido más difuso, usa LIKE. Decir lo que quieres decir suele ser una buena política con el código.
fuente
En Oracle, un 'me gusta' sin comodines devolverá el mismo resultado que un 'igual', pero podría requerir un procesamiento adicional. Según Tom Kyte , Oracle tratará un 'me gusta' sin comodines como un 'igual' cuando use literales, pero no cuando use variables de enlace.
fuente
=
yLIKE
no es lo mismo;=
coincide con la cadena exactaLIKE
coincide con una cadena que puede contener comodines (%)fuente