Gibt es bei der Verwendung von SQL Vorteile bei der Verwendung =
in einer WHERE
Klausel anstelle von LIKE
?
Ohne spezielle Operatoren LIKE
und =
gleich, oder?
sql
performance
equals
sql-like
Travis
quelle
quelle
5
Stimmen für das Like-Operator- Tag. Könnte ich Sie bitten , SQL-like als Synonym vorzuschlagen ?Antworten:
Verschiedene Operatoren
LIKE
und=
sind verschiedene Operatoren. Die meisten Antworten konzentrieren sich auf die Wildcard-Unterstützung, die nicht der einzige Unterschied zwischen diesen Operatoren ist!=
ist ein Vergleichsoperator, der mit Zahlen und Zeichenfolgen arbeitet. Beim Vergleichen von Zeichenfolgen vergleicht der Vergleichsoperator ganze Zeichenfolgen .LIKE
ist ein Zeichenfolgenoperator, der Zeichen für Zeichen vergleicht .Um die Sache zu verkomplizieren, verwenden beide Operatoren eine Kollatierung, die wichtige Auswirkungen auf das Vergleichsergebnis haben kann.
Motivierendes Beispiel
Lassen Sie uns zunächst ein Beispiel identifizieren, bei dem diese Operatoren offensichtlich unterschiedliche Ergebnisse liefern. Lassen Sie mich aus dem MySQL-Handbuch zitieren:
Bitte beachten Sie, dass diese Seite des MySQL-Handbuchs als String-Vergleichsfunktionen bezeichnet wird und
=
nicht behandelt wird, was dies impliziert=
es sich nicht ausschließlich um eine String-Vergleichsfunktion handelt.Wie funktioniert das
=
?Der SQL-Standard § 8.2 beschreibt, wie
=
Zeichenfolgen verglichen werden:(Betonung hinzugefügt.)
Was bedeutet das? Dies bedeutet, dass der
=
Operator beim Vergleichen von Zeichenfolgen nur ein dünner Wrapper um die aktuelle Sortierung ist. Eine Kollatierung ist eine Bibliothek, die verschiedene Regeln zum Vergleichen von Zeichenfolgen enthält. Hier ist ein Beispiel für eine binäre Zusammenstellung von MySQL :Diese bestimmte Kollatierung vergleicht Byte für Byte (weshalb sie "binär" genannt wird - sie gibt Zeichenfolgen keine besondere Bedeutung). Andere Kollatierungen bieten möglicherweise erweiterte Vergleiche.
Hier ist beispielsweise eine UTF-8-Kollatierung , die Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung unterstützt. Der Code ist zu lang, um ihn hier einzufügen, aber gehen Sie zu diesem Link und lesen Sie den Text von
my_strnncollsp_utf8mb4()
. Diese Sortierung kann mehrere Bytes gleichzeitig verarbeiten und verschiedene Transformationen anwenden (z. B. Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung). Der=
Operator ist vollständig von den Launen der Kollatierung abstrahiert.Wie funktioniert das
LIKE
?Der SQL-Standard § 8.5 beschreibt, wie
LIKE
Zeichenfolgen verglichen werden:(Betonung hinzugefügt.)
Das ist ziemlich wortreich, also lasst es uns zusammenfassen. Artikel II und III beziehen sich auf die Platzhalter
_
und%
, respectively. WennP
keine Platzhalter enthalten sind, gilt nur Punkt iv. Dies ist der Fall von Interesse, das vom OP gestellt wird.In diesem Fall wird jeder "Teilstring" (einzelne Zeichen) mit
M
jedem Teilstring unterP
Verwendung der aktuellen Sortierung verglichen .Schlussfolgerungen
Die Quintessenz ist, dass beim Vergleichen von Zeichenfolgen
=
die gesamte Zeichenfolge verglichen wird, während jeweilsLIKE
ein Zeichen verglichen wird. Beide Vergleiche verwenden die aktuelle Sortierung. Dieser Unterschied führt in einigen Fällen zu unterschiedlichen Ergebnissen, wie das erste Beispiel in diesem Beitrag zeigt.Welches solltest du verwenden? Niemand kann Ihnen das sagen - Sie müssen diejenige verwenden, die für Ihren Anwendungsfall richtig ist. Optimieren Sie nicht vorzeitig, indem Sie die Vergleichsoperatoren wechseln.
quelle
LIKE
tut, aber diese Antwort erklärt auf beeindruckende Weise, dass das VerwendenLIKE
ohne%
oder_
vorhanden überhaupt nicht dasselbe ist wie das Verwenden=
. Möge Ihre Antwort tausend positive Stimmen erhalten.'AbCdEfG'
, und das tueWHERE MyCol = 'abcdefg'
ich, bekomme ich diese Zeile immer noch zurück, obwohl sie eindeutig nicht byteweise äquivalent sindset charset latin1;
SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
gibt 0 undSELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
gibt auch 0.Der Operator equals (=) ist ein "Vergleichsoperator, der zwei Werte auf Gleichheit vergleicht". Mit anderen Worten, in einer SQL-Anweisung wird true nur zurückgegeben, wenn beide Seiten der Gleichung gleich sind. Beispielsweise:
Der LIKE-Operator "implementiert einen Mustervergleichsvergleich", der versucht, "einen Zeichenfolgenwert mit einer Musterzeichenfolge abzugleichen, die Platzhalterzeichen enthält". Beispielsweise:
LIKE wird im Allgemeinen nur mit Strings verwendet und Equals (glaube ich) sind schneller. Der Operator equals behandelt Platzhalterzeichen als Literalzeichen. Der Unterschied in den zurückgegebenen Ergebnissen ist wie folgt:
Und
Würde das gleiche Ergebnis zurückgeben, obwohl die Verwendung von LIKE im Allgemeinen länger dauern würde, da es sich um eine Musterübereinstimmung handelt. Jedoch,
Und
Würde unterschiedliche Ergebnisse zurückgeben, wobei die Verwendung von "=" nur zu Ergebnissen führt, wobei "Chris%" zurückgegeben wird und der LIKE-Operator alles zurückgibt, was mit "Chris" beginnt.
Hoffentlich hilft das. Einige gute Infos finden Sie hier .
quelle
Dies ist ein Kopieren / Einfügen einer anderen Antwort von mir auf die Frage SQL 'wie' vs '=' Leistung :
Ein persönliches Beispiel mit MySQL 5.5: Ich hatte eine innere Verknüpfung zwischen zwei Tabellen, einer von 3 Millionen Zeilen und einer von 10.000 Zeilen.
Bei Verwendung eines Like für einen Index wie unten (keine Platzhalter) dauerte es ungefähr 30 Sekunden:
mit 'erklären' bekomme ich:
Bei Verwendung eines '=' für dieselbe Abfrage dauerte es ungefähr 0,1 Sekunden:
Mit 'EXPLAIN' bekomme ich:
Wie Sie sehen können, hat die
like
Indexsuche vollständig abgebrochen, sodass die Abfrage 300-mal länger dauerte.quelle
LIKE
und=
sind anders.LIKE
ist das, was Sie in einer Suchabfrage verwenden würden. Es erlaubt auch Platzhalter wie_
(einfacher Platzhalter für Zeichen) und%
(Platzhalter für mehrere Zeichen).=
sollte verwendet werden, wenn Sie genaue Übereinstimmungen wünschen und es wird schneller sein.Diese Seite erklärt
LIKE
quelle
Ein Unterschied - abgesehen von der Möglichkeit, Platzhalter mit LIKE zu verwenden - besteht in nachgestellten Leerzeichen: Der Operator = ignoriert nachfolgende Leerzeichen, LIKE jedoch nicht.
quelle
Hängt vom Datenbanksystem ab.
Im Allgemeinen ohne Sonderzeichen sind yes, = und LIKE gleich.
Einige Datenbanksysteme können jedoch die Sortiereinstellungen bei den verschiedenen Operatoren unterschiedlich behandeln.
Zum Beispiel wird bei MySQL-Vergleichen mit = on Strings standardmäßig immer zwischen Groß- und Kleinschreibung unterschieden, sodass LIKE ohne Sonderzeichen dasselbe ist. Bei einigen anderen RDBMS wird bei LIKE nicht zwischen Groß- und Kleinschreibung unterschieden, bei = nicht.
quelle
In diesem Beispiel nehmen wir an, dass varcharcol
''
keine leere Zelle für diese Spalte enthält und keine hatDie erste führt zu einer Ausgabe von 0 Zeilen, während die zweite die gesamte Liste anzeigt. = ist ein streng übereinstimmender Fall, während like wie ein Filter wirkt. Wenn der Filter keine Kriterien hat, sind alle Daten gültig.
like - arbeitet aufgrund seines Zwecks etwas langsamer und ist für die Verwendung mit Varchar und ähnlichen Daten vorgesehen.
quelle
Wenn Sie nach einer genauen Übereinstimmung suchen, können Sie sowohl = als auch LIKE verwenden.
Die Verwendung von "=" ist in diesem Fall etwas schneller (Suche nach einer genauen Übereinstimmung). Sie können dies selbst überprüfen, indem Sie dieselbe Abfrage zweimal in SQL Server Management Studio ausführen, einmal mit "=", einmal mit "LIKE" und Verwenden Sie dann "Abfrage" / "Tatsächlichen Ausführungsplan einschließen".
Führen Sie die beiden Abfragen aus, und Sie sollten Ihre Ergebnisse zweimal sehen, plus die beiden tatsächlichen Ausführungspläne. In meinem Fall wurden sie zu 50% gegenüber 50% aufgeteilt, aber der Ausführungsplan "=" hat geringere "geschätzte Teilbaumkosten" (wird angezeigt, wenn Sie mit der Maus über das Feld "SELECT" ganz links fahren) - aber auch hier ist es wirklich so kein großer Unterschied.
Wenn Sie jedoch mit Platzhaltern in Ihrem LIKE-Ausdruck suchen, nimmt die Suchleistung ab. Die Suche "LIKE Mill%" kann immer noch recht schnell sein - SQL Server kann einen Index für diese Spalte verwenden, falls vorhanden. Die Suche nach "LIKE% expression%" ist schrecklich langsam, da SQL Server diese Suche nur durch einen vollständigen Tabellenscan erfüllen kann. Also sei vorsichtig mit deinen LIKE's!
Marc
quelle
Mit = werden Platzhalter- und Sonderzeichenkonflikte in der Zeichenfolge vermieden, wenn Sie die Abfrage zur Laufzeit erstellen.
Dies erleichtert dem Programmierer das Leben, da nicht alle speziellen Platzhalterzeichen, die in der LIKE-Klausel enthalten sein könnten, entkommen müssen und nicht das beabsichtigte Ergebnis erzielt werden. Immerhin ist = das 99% -Anwendungsszenario, es wäre ein Schmerz, jedes Mal entkommen zu müssen.
rollt die Augen in den 90ern
Ich vermute auch, dass es etwas langsamer ist, aber ich bezweifle, dass es wichtig ist, wenn das Muster keine Platzhalter enthält.
quelle
Um die ursprüngliche Frage zur Leistung zu beantworten, kommt es auf die Indexnutzung an . Wenn ein einfacher Tabellenscan durchgeführt wird, sind "LIKE" und "=" identisch . Wenn es sich um Indizes handelt, hängt dies davon ab, wie die LIKE-Klausel gebildet wird. Wo befinden sich die Platzhalter?
Folgendes berücksichtigen:
Bei Verwendung von "=" vs "LIKE" kann es auch zu vernachlässigbaren Unterschieden bei der Erstellung des Abfrageplans kommen.
quelle
Neben den Platzhaltern hängt der Unterschied zwischen
=
UNDLIKE
sowohl von der Art des SQL-Servers als auch vom Spaltentyp ab.Nehmen Sie dieses Beispiel:
Bei Verwendung von MS SQL Server 2012 werden die nachgestellten Leerzeichen im Vergleich ignoriert, außer
LIKE
wenn der Spaltentyp lautetVARCHAR
.Mit MySQL 5.5 werden die hinteren Räume außer Acht gelassen werden
=
, aber nicht fürLIKE
, beide mitCHAR
undVARCHAR
.Bei Verwendung von PostgreSQL 9.1 sind Leerzeichen sowohl für
=
als auch fürLIKE
using von BedeutungVARCHAR
, jedoch nicht fürCHAR
(siehe Dokumentation) ).Das Verhalten mit
LIKE
unterscheidet sich auch mitCHAR
.Die Verwendung der gleichen Daten wie oben und die Verwendung eines expliziten
CAST
Spaltennamens machen ebenfalls einen Unterschied :Dies gibt nur Zeilen für "CAST sowohl" als auch "CAST col" zurück.
quelle
Das Schlüsselwort LIKE ist zweifellos mit einem "Leistungspreisschild" versehen. Wenn Sie jedoch ein Eingabefeld haben, das möglicherweise Platzhalterzeichen enthalten kann, die in Ihrer Abfrage verwendet werden sollen, würde ich die Verwendung von LIKE nur empfehlen, wenn die Eingabe einen der Platzhalter enthält. Verwenden Sie andernfalls den Standard, der dem Vergleich entspricht.
Freundliche Grüße...
quelle
Es kommt wirklich darauf an, was die Abfrage tun soll. Wenn Sie eine genaue Übereinstimmung meinen, verwenden Sie =. Wenn Sie ein unschärferes Spiel meinen, verwenden Sie LIKE. Zu sagen, was Sie meinen, ist normalerweise eine gute Richtlinie mit Code.
quelle
In Oracle gibt ein "Gefällt mir" ohne Platzhalter das gleiche Ergebnis wie ein "Gleiches" zurück, erfordert jedoch möglicherweise eine zusätzliche Verarbeitung. Laut Tom Kyte wird Oracle ein " Gefällt mir" ohne Platzhalter als "Gleich" behandeln, wenn Literale verwendet werden, nicht jedoch, wenn Bindungsvariablen verwendet werden.
quelle
=
undLIKE
ist nicht dasselbe;=
stimmt mit der genauen Zeichenfolge übereinLIKE
stimmt mit einer Zeichenfolge überein, die Platzhalter enthalten kann (%)quelle