Lors de l'utilisation de SQL, y a-t-il des avantages à utiliser =
dans une WHERE
clause au lieu de LIKE
?
Sans opérateurs spéciaux, LIKE
et =
sont les mêmes, non?
sql
performance
equals
sql-like
Travis
la source
la source
5
votes pour le tag d' opérateur similaire . Puis-je vous demander de suggérer comme sql-like comme synonyme ?Réponses:
Différents opérateurs
LIKE
et=
sont différents opérateurs. La plupart des réponses se concentrent ici sur le support des caractères génériques, ce qui n'est pas la seule différence entre ces opérateurs!=
est un opérateur de comparaison qui opère sur des nombres et des chaînes. Lors de la comparaison de chaînes, l'opérateur de comparaison compare des chaînes entières .LIKE
est un opérateur de chaîne qui compare caractère par caractère .Pour compliquer les choses, les deux opérateurs utilisent un classement qui peut avoir des effets importants sur le résultat de la comparaison.
Exemple de motivation
Identifions d'abord un exemple où ces opérateurs produisent des résultats évidemment différents. Permettez-moi de citer le manuel MySQL:
Veuillez noter que cette page du manuel MySQL est appelée Fonctions de comparaison de chaînes et
=
n'est pas discutée, ce qui implique qu'il=
ne s'agit pas strictement d'une fonction de comparaison de chaînes.Comment ça
=
marche?Le SQL Standard § 8.2 décrit comment
=
compare les chaînes:(Je souligne.)
Qu'est-ce que ça veut dire? Cela signifie que lors de la comparaison de chaînes, l'
=
opérateur n'est qu'un mince wrapper autour du classement actuel. Un classement est une bibliothèque qui a différentes règles pour comparer des chaînes. Voici un exemple de classement binaire de MySQL :Ce classement particulier arrive à comparer octet par octet (c'est pourquoi il est appelé "binaire" - il ne donne aucune signification particulière aux chaînes). D'autres classements peuvent fournir des comparaisons plus avancées.
Par exemple, voici un classement UTF-8 qui prend en charge les comparaisons non sensibles à la casse. Le code est trop long pour être collé ici, mais allez sur ce lien et lisez le corps de
my_strnncollsp_utf8mb4()
. Ce classement peut traiter plusieurs octets à la fois et il peut appliquer diverses transformations (telles que la comparaison insensible à la casse). L'=
opératrice est complètement abstraite des aléas de la collation.Comment ça
LIKE
marche?Le SQL Standard § 8.5 décrit comment
LIKE
compare les chaînes:(Je souligne.)
C'est assez verbeux, alors décomposons-le. Les éléments ii et iii font respectivement référence aux caractères génériques
_
et%
. SiP
ne contient aucun caractère générique, seul l'élément iv s'applique. C'est le cas d'intérêt posé par le PO.Dans ce cas, il compare chaque "sous-chaîne" (caractères individuels) à
M
chaque sous-chaîne enP
utilisant le classement actuel.Conclusions
L'essentiel est que lors de la comparaison de chaînes,
=
compare la chaîne entière tout enLIKE
comparant un caractère à la fois. Les deux comparaisons utilisent le classement actuel. Cette différence conduit à des résultats différents dans certains cas, comme en témoigne le premier exemple de ce post.Lequel devriez-vous utiliser? Personne ne peut vous le dire - vous devez utiliser celui qui convient à votre cas d'utilisation. N'optimisez pas prématurément en changeant d'opérateurs de comparaison.
la source
LIKE
passe, mais cette réponse explique de manière impressionnante que l'utilisationLIKE
sans%
ou_
présent n'est pas du tout la même chose que l'utilisation=
. Que votre réponse reçoive mille votes positifs.'AbCdEfG'
, et je le faisWHERE MyCol = 'abcdefg'
, je récupère toujours cette ligne, même si elles ne sont clairement pas équivalentes octet par octetset charset latin1;
SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
donne 0, etSELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
donne aussi 0.L'opérateur égal (=) est un "opérateur de comparaison compare deux valeurs d'égalité". En d'autres termes, dans une instruction SQL, elle ne retournera true que si les deux côtés de l'équation sont égaux. Par exemple:
L'opérateur LIKE "implémente une comparaison de correspondance de modèle" qui tente de faire correspondre "une valeur de chaîne à une chaîne de modèle contenant des caractères génériques". Par exemple:
LIKE est généralement utilisé uniquement avec des chaînes et égal (je crois) est plus rapide. L'opérateur égal traite les caractères génériques comme des caractères littéraux. La différence dans les résultats retournés est la suivante:
Et
Renverrait le même résultat, bien que l'utilisation de LIKE prenne généralement plus de temps car c'est une correspondance de modèle. cependant,
Et
Renvoyer des résultats différents, où l'utilisation de "=" entraîne uniquement des résultats avec "Chris%" renvoyé et l'opérateur LIKE renvoie tout ce qui commence par "Chris".
J'espère que cela pourra aider. Quelques bonnes informations peuvent être trouvées ici .
la source
Ceci est un copier / coller d'une autre réponse de la mienne pour la question SQL 'like' vs '=' performance :
Un exemple personnel utilisant mysql 5.5: j'avais une jointure interne entre 2 tables, une de 3 millions de lignes et une de 10 000 lignes.
Lors de l'utilisation d'un élément similaire sur un index comme ci-dessous (pas de caractères génériques), cela a pris environ 30 secondes:
en utilisant 'expliquer' j'obtiens:
Lorsque vous utilisez un «=» sur la même requête, cela prend environ 0,1 seconde:
En utilisant «expliquer», j'obtiens:
Comme vous pouvez le voir, la
like
recherche d'index a été complètement annulée, la requête a donc pris 300 fois plus de temps.la source
LIKE
et=
sont différents.LIKE
est ce que vous utiliseriez dans une requête de recherche. Il autorise également les caractères génériques comme_
(caractère générique simple) et%
(caractère générique à plusieurs caractères).=
devrait être utilisé si vous voulez des correspondances exactes et ce sera plus rapide.Ce site explique
LIKE
la source
Une différence - en dehors de la possibilité d'utiliser des caractères génériques avec LIKE - réside dans les espaces de fin: l'opérateur = ignore l'espace de fin, mais LIKE ne le fait pas.
la source
Dépend du système de base de données.
Généralement sans caractères spéciaux, oui, = et LIKE sont identiques.
Cependant, certains systèmes de base de données peuvent traiter les paramètres de classement différemment avec les différents opérateurs.
Par exemple, dans MySQL, les comparaisons avec = sur les chaînes sont toujours insensibles à la casse par défaut, donc LIKE sans caractères spéciaux est le même. Sur certains autres SGBDR, LIKE est insensible à la casse tandis que = ne l'est pas.
la source
Pour cet exemple, nous tenons pour acquis que varcharcol ne contient pas
''
et n'a pas de cellule vide contre cette colonneLe premier produit une sortie de ligne 0 tandis que le second affiche la liste entière. = correspond strictement à la casse tandis que like agit comme un filtre. si le filtre n'a pas de critère, toutes les données sont valides.
like - en vertu de son objectif, fonctionne un peu plus lentement et est destiné à être utilisé avec varchar et des données similaires.
la source
Si vous recherchez une correspondance exacte, vous pouvez utiliser à la fois, = et LIKE.
L'utilisation de "=" est un tout petit peu plus rapide dans ce cas (recherche d'une correspondance exacte) - vous pouvez le vérifier vous-même en ayant deux fois la même requête dans SQL Server Management Studio, une fois en utilisant "=", une fois en utilisant "LIKE" et puis en utilisant la "Requête" / "Inclure le plan d'exécution réel".
Exécutez les deux requêtes et vous devriez voir vos résultats deux fois, plus les deux plans d'exécution réels. Dans mon cas, ils ont été divisés à 50% contre 50%, mais le plan d'exécution "=" a un "coût de sous-arbre estimé" plus petit (affiché lorsque vous survolez la case "SELECT" la plus à gauche) - mais encore une fois, c'est vraiment pas une énorme différence.
Mais lorsque vous commencez à rechercher des caractères génériques dans votre expression LIKE, les performances de recherche diminuent. La recherche "LIKE Mill%" peut toujours être assez rapide - SQL Server peut utiliser un index sur cette colonne, s'il y en a un. La recherche de "LIKE% expression%" est horriblement lente, car la seule façon dont SQL Server peut satisfaire cette recherche consiste à effectuer une analyse complète de la table. Soyez donc prudent avec vos LIKE!
Marc
la source
L'utilisation de = évite les caractères génériques et les conflits de caractères spéciaux dans la chaîne lorsque vous générez la requête au moment de l'exécution.
Cela facilite la vie du programmeur en n'ayant pas à échapper tous les caractères génériques spéciaux qui pourraient se glisser dans la clause LIKE et ne pas produire le résultat souhaité. Après tout, = est le scénario d'utilisation à 99%, ce serait pénible de devoir y échapper à chaque fois.
roule les yeux aux années 90
Je soupçonne également que c'est un peu plus lent, mais je doute que ce soit significatif s'il n'y a pas de caractères génériques dans le modèle.
la source
Pour répondre à la question initiale concernant les performances, il s'agit de l' utilisation de l'index . Lorsqu'un simple scan de table se produit, "LIKE" et "=" sont identiques . Lorsque des index sont impliqués, cela dépend de la façon dont la clause LIKE est formée. Plus précisément, quel est l'emplacement du ou des caractères génériques?
Considérer ce qui suit:
Il peut également y avoir une différence négligeable dans la création du plan de requête lors de l'utilisation de "=" vs "LIKE".
la source
Outre les caractères génériques, la différence entre
=
ANDLIKE
dépendra à la fois du type de serveur SQL et du type de colonne.Prenez cet exemple:
À l'aide de MS SQL Server 2012 , les espaces de fin seront ignorés dans la comparaison, sauf
LIKE
lorsque le type de colonne estVARCHAR
.Avec MySQL 5.5 , les espaces de fin seront ignorés pour
=
, mais pas pourLIKE
, avecCHAR
etVARCHAR
.En utilisant PostgreSQL 9.1 , les espaces sont importants à la fois
=
et l'LIKE
utilisationVARCHAR
, mais pasCHAR
(voir la documentation ).Le comportement avec
LIKE
diffère également avecCHAR
.En utilisant les mêmes données que ci-dessus, en utilisant une explicite
CAST
sur le nom de la colonne fait également une différence :Cela ne renvoie que des lignes pour "CAST both" et "CAST col".
la source
Le mot-clé LIKE est sans aucun doute accompagné d'une "étiquette de prix de performance". Cela dit, si vous avez un champ de saisie qui pourrait potentiellement inclure des caractères génériques à utiliser dans votre requête, je recommanderais d'utiliser LIKE uniquement si l'entrée contient l'un des caractères génériques. Sinon, utilisez la norme égale à comparaison.
Meilleures salutations...
la source
Cela dépend vraiment de ce que vous voulez que la requête fasse. Si vous voulez dire une correspondance exacte, utilisez =. Si vous voulez dire une correspondance plus floue, utilisez LIKE. Dire ce que vous voulez dire est généralement une bonne politique avec du code.
la source
Dans Oracle, un «like» sans caractères génériques renvoie le même résultat qu'un «égal», mais peut nécessiter un traitement supplémentaire. Selon Tom Kyte , Oracle traitera un «comme» sans caractères génériques comme un «égal» lors de l'utilisation de littéraux, mais pas lors de l'utilisation de variables de liaison.
la source
=
etLIKE
n'est pas le même;=
correspond à la chaîne exacteLIKE
correspond à une chaîne pouvant contenir des caractères génériques (%)la source