Ao usar o SQL, existem benefícios em usar =
uma WHERE
cláusula em vez de LIKE
?
Sem operadores especiais, LIKE
e =
são os mesmos, certo?
sql
performance
equals
sql-like
Travis
fonte
fonte
5
votos para a tag de operador like . Posso pedir que você sugira sql-like como sinônimo ?Respostas:
Operadores diferentes
LIKE
e=
são operadores diferentes. A maioria das respostas aqui se concentra no suporte a caracteres curinga, que não é a única diferença entre esses operadores!=
é um operador de comparação que opera em números e seqüências de caracteres. Ao comparar cadeias, o operador de comparação compara cadeias inteiras .LIKE
é um operador de cadeia que compara caractere por caractere .Para complicar, os dois operadores usam um agrupamento que pode ter efeitos importantes no resultado da comparação.
Exemplo Motivador
Vamos primeiro identificar um exemplo em que esses operadores produzem resultados obviamente diferentes. Permita-me citar o manual do MySQL:
Por favor note que esta página do manual do MySQL se chama String Comparison Functions , e
=
não é discutida, o que implica que=
não é estritamente uma função de comparação de strings.Como
=
funciona?O padrão 8.2 do SQL descreve como
=
compara cadeias:(Enfase adicionada.)
O que isto significa? Isso significa que, ao comparar seqüências de caracteres, o
=
operador é apenas um invólucro fino em torno do agrupamento atual. Um agrupamento é uma biblioteca que possui várias regras para comparar seqüências de caracteres. Aqui está um exemplo de agrupamento binário do MySQL :Esse agrupamento em particular compara byte a byte (e é por isso que é chamado de "binário" - não dá nenhum significado especial às strings). Outros agrupamentos podem fornecer comparações mais avançadas.
Por exemplo, aqui está um agrupamento UTF-8 que suporta comparações que não diferenciam maiúsculas de minúsculas. O código é muito longo para colar aqui, mas vá para esse link e leia o corpo de
my_strnncollsp_utf8mb4()
. Esse agrupamento pode processar vários bytes por vez e aplicar várias transformações (como comparação sem distinção entre maiúsculas e minúsculas). O=
operador é completamente abstraído dos caprichos do agrupamento.Como
LIKE
funciona?O SQL Standard § 8.5 descreve como se
LIKE
comparam as strings:(Enfase adicionada.)
Isso é bastante prolixo, então vamos detalhar. Os itens ii e iii se referem aos caracteres curinga
_
e%
, respectivamente. SeP
não contiver curingas, apenas o item iv será aplicado. Este é o caso de interesse apresentado pelo OP.Nesse caso, ele compara cada "substring" (caracteres individuais)
M
com cada substringP
usando o agrupamento atual.Conclusões
A linha inferior é que, ao comparar cadeias,
=
compara a cadeia inteira enquantoLIKE
compara um caractere de cada vez. Ambas as comparações usam o agrupamento atual. Essa diferença leva a resultados diferentes em alguns casos, como evidenciado no primeiro exemplo neste post.Qual deles você deve usar? Ninguém pode lhe dizer isso - você precisa usar o correto para o seu caso de uso. Não otimize prematuramente alternando operadores de comparação.
fonte
LIKE
faz, mas essa resposta explica incrivelmente que usarLIKE
sem%
ou_
presente não é o mesmo que usar=
. Que sua resposta receba mil votos positivos.'AbCdEfG'
, e eu façoWHERE MyCol = 'abcdefg'
, eu ainda obter essa fileira traseira, embora sejam claramente não byte a byte equivalenteset charset latin1;
SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
dá 0 eSELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
também 0.O operador equals (=) é um "operador de comparação compara dois valores para igualdade". Em outras palavras, em uma instrução SQL, ela não retornará true, a menos que ambos os lados da equação sejam iguais. Por exemplo:
O operador LIKE "implementa uma comparação de correspondência de padrões" que tenta corresponder "a um valor de sequência em relação a uma sequência de caracteres contendo caracteres curinga". Por exemplo:
LIKE geralmente é usado apenas com strings e iguais (acredito) é mais rápido. O operador equals trata caracteres curinga como caracteres literais. A diferença nos resultados retornados é a seguinte:
E
Retornaria o mesmo resultado, embora o uso de LIKE geralmente levasse mais tempo, pois é uma correspondência de padrão. Contudo,
E
Retornaria resultados diferentes, onde o uso de "=" resulta apenas em resultados com "Chris%" sendo retornados e o operador LIKE retornará qualquer coisa que comece com "Chris".
Espero que ajude. Algumas boas informações podem ser encontradas aqui .
fonte
Esta é uma cópia / pasta de outra resposta minha para a pergunta SQL 'like' vs '=' performance :
Um exemplo pessoal usando o mysql 5.5: eu tive uma junção interna entre 2 tabelas, uma de 3 milhões de linhas e uma de 10 mil linhas.
Ao usar um like em um índice como abaixo (sem curingas), demorou cerca de 30 segundos:
usando 'explicar' eu recebo:
Ao usar um '=' na mesma consulta, demorou cerca de 0,1 segundos:
Usando 'explicar' eu recebo:
Como você pode ver, a
like
busca do índice foi completamente cancelada, portanto, a consulta levou 300 vezes mais tempo.fonte
LIKE
e=
são diferentes.LIKE
é o que você usaria em uma consulta de pesquisa. Também permite curingas como_
(curinga de caractere simples) e%
(curinga de vários caracteres).=
deve ser usado se você quiser correspondências exatas e será mais rápido.Este site explica
LIKE
fonte
Uma diferença - além da possibilidade de usar curingas com LIKE - está nos espaços à direita: O operador = ignora o espaço à direita, mas LIKE não.
fonte
Depende do sistema de banco de dados.
Geralmente sem caracteres especiais, sim, = e LIKE são iguais.
Alguns sistemas de banco de dados, no entanto, podem tratar as configurações de agrupamento de maneira diferente com os diferentes operadores.
Por exemplo, no MySQL as comparações com = on strings sempre diferenciam maiúsculas de minúsculas por padrão, então LIKE sem caracteres especiais é o mesmo. Em alguns outros RDBMS, LIKE não diferencia maiúsculas de minúsculas, enquanto = não é.
fonte
Para este exemplo, assumimos que o varcharcol não contém
''
e não possui célula vazia nessa colunaO primeiro resulta na saída de 0 linhas, enquanto o segundo mostra a lista inteira. = é estritamente compatível com maiúsculas e minúsculas, enquanto o tipo age como um filtro. se o filtro não tiver critérios, todos os dados serão válidos.
like - em virtude de sua finalidade, funciona um pouco mais devagar e se destina ao uso com varchar e dados semelhantes.
fonte
Se você procurar uma correspondência exata, poderá usar ambos, = e LIKE.
Usar "=" é um pouquinho mais rápido nesse caso (procurando uma correspondência exata) - você mesmo pode verificar isso fazendo a mesma consulta duas vezes no SQL Server Management Studio, uma vez usando "=", uma vez usando "LIKE" e depois, usando a opção "Consulta" / "Incluir plano de execução real".
Execute as duas consultas e você verá os resultados duas vezes, além dos dois planos de execução reais. No meu caso, eles foram divididos em 50% vs. 50%, mas o plano de execução "=" tem um "custo estimado de subárvore" menor (exibido quando você passa o mouse sobre a caixa "SELECT" mais à esquerda) - mas, novamente, é realmente não é uma diferença enorme.
Mas quando você começa a procurar com curingas na sua expressão LIKE, o desempenho da pesquisa diminui. A pesquisa "LIKE Mill%" ainda pode ser bastante rápida - o SQL Server pode usar um índice nessa coluna, se houver. A pesquisa "LIKE% expression%" é terrivelmente lenta, pois a única maneira de o SQL Server satisfazer essa pesquisa é fazendo uma verificação completa da tabela. Portanto, tenha cuidado com o seu gosto!
Marc
fonte
Usar = evita caracteres curinga e conflitos de caracteres especiais na cadeia quando você cria a consulta em tempo de execução.
Isso facilita a vida do programador por não ter que escapar de todos os caracteres curinga especiais que podem aparecer na cláusula LIKE e por não produzir o resultado pretendido. Afinal, = é o cenário de caso de uso de 99%, seria uma dor ter que escapar deles sempre.
revira os olhos nos anos 90
Também suspeito que seja um pouco mais lento, mas duvido que seja significativo se não houver curingas no padrão.
fonte
Para abordar a questão original sobre desempenho, ela se resume à utilização do índice . Quando ocorre uma simples varredura de tabela, "LIKE" e "=" são idênticos . Quando os índices estão envolvidos, isso depende de como a cláusula LIKE é formada. Mais especificamente, qual é a localização dos caracteres curinga?
Considere o seguinte:
Também pode haver diferença insignificante na criação do plano de consulta ao usar "=" vs "LIKE".
fonte
Além dos curingas, a diferença entre
=
ANDLIKE
dependerá do tipo de servidor SQL e do tipo de coluna.Veja este exemplo:
Usando o MS SQL Server 2012 , os espaços à direita serão ignorados na comparação, exceto
LIKE
quando o tipo de coluna forVARCHAR
.Usando o MySQL 5.5 , os espaços à direita serão ignorados para
=
, mas não paraLIKE
, ambos comCHAR
eVARCHAR
.Usando o PostgreSQL 9.1 , os espaços são significativos com ambos
=
eLIKE
usandoVARCHAR
, mas não comCHAR
(consulte a documentação ).O comportamento com
LIKE
também difere comCHAR
.Usar os mesmos dados acima, usar um explícito
CAST
no nome da coluna também faz a diferença :Isso retorna apenas linhas para "CAST both" e "CAST col".
fonte
A palavra-chave LIKE, sem dúvida, vem com uma "etiqueta de preço de desempenho" anexada. Dito isto, se você tiver um campo de entrada que possa incluir caracteres curinga para serem usados em sua consulta, recomendo usar LIKE apenas se a entrada contiver um dos curingas. Caso contrário, use o padrão igual à comparação.
Cumprimentos...
fonte
Realmente, tudo se resume ao que você deseja que a consulta faça. Se você quer dizer uma correspondência exata, use =. Se você quer dizer uma partida mais confusa, use LIKE. Dizer o que você quer dizer geralmente é uma boa política com código.
fonte
No Oracle, um 'like' sem curingas retornará o mesmo resultado que um 'igual', mas poderá exigir processamento adicional. De acordo com Tom Kyte , a Oracle tratará um 'like' sem curingas como 'igual' ao usar literais, mas não ao usar variáveis de ligação.
fonte
=
eLIKE
não é o mesmo;=
corresponde à string exataLIKE
corresponde a uma sequência que pode conter caracteres curinga (%)fonte