373 Stimmen

Gleich(=) vs. LIKE

Gibt es bei der Verwendung von SQL irgendwelche Vorteile bei der Verwendung von = in einem WHERE Klausel anstelle von LIKE ?

Ohne spezielle Operatoren, LIKE y = sind die gleichen, richtig?

368voto

Mark E. Haase Punkte 24620

Verschiedene Operatoren

LIKE y = sind unterschiedliche Betreiber. Die meisten Antworten konzentrieren sich hier auf die Unterstützung von Platzhaltern, was aber nicht der einzige Unterschied zwischen diesen Operatoren ist!

= ist ein Vergleichsoperator, der mit Zahlen und Zeichenketten arbeitet. Beim Vergleich von Zeichenketten vergleicht der Vergleichsoperator ganze Stränge .

LIKE ist ein String-Operator, der Folgendes vergleicht Zeichen für Zeichen .

Um die Sache zu verkomplizieren, verwenden beide Betreiber eine Kollation was erhebliche Auswirkungen auf das Ergebnis des Vergleichs haben kann.

Motivierendes Beispiel

Lassen Sie uns zunächst ein Beispiel nennen, bei dem diese Operatoren offensichtlich unterschiedliche Ergebnisse liefern. Erlauben Sie mir ein Zitat aus dem MySQL-Handbuch:

Gemäß dem SQL-Standard führt LIKE den Abgleich auf Zeichenbasis durch und kann daher andere Ergebnisse als der Vergleichsoperator = liefern:

mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
+-----------------------------------------+
| 'ä' LIKE 'ae' COLLATE latin1_german2_ci |
+-----------------------------------------+
|                                       0 |
+-----------------------------------------+
mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
+--------------------------------------+
| 'ä' = 'ae' COLLATE latin1_german2_ci |
+--------------------------------------+
|                                    1 |
+--------------------------------------+

Bitte beachten Sie, dass diese Seite des MySQL-Handbuchs den Namen String-Vergleichsfunktionen y = wird nicht diskutiert, was bedeutet, dass = ist keine reine String-Vergleichsfunktion.

Wie funktioniert = Arbeit?

En SQL-Standard § 8.2 beschreibt, wie = vergleicht Zeichenketten:

Der Vergleich von zwei Zeichenketten wird wie folgt bestimmt:

a) Wenn die Länge von X in Zeichen nicht gleich der Länge in Zeichen von Y, dann wird die kürzere Zeichenfolge effektiv für die Zwecke des Vergleichs durch eine Kopie von selbst ersetzt, die auf die Länge der längeren Zeichenkette erweitert wurde Zeichenkette durch die Verkettung von einem oder mehreren Pad Zeichen erweitert wurde, wobei das Auffüllzeichen auf der Grundlage von CS ausgewählt wird. Wenn CS das Attribut NO PAD, dann ist das Auffüllzeichen ein implementierungsabhängiges Zeichen, das sich von jedem Zeichen im Zeichensatz von X und Y, das weniger kollationiert als jede Zeichenkette unter CS. Andernfalls ist das Auffüllzeichen ein <Leerzeichen>.

b) Das Ergebnis des Vergleichs von X und Y ergibt sich aus dem Kollationierungssequenz CS.

c) Je nach Sortierreihenfolge können zwei Strings als gleich verglichen werden, auch wenn sie unterschiedlich lang sind oder unterschiedliche Zeichenfolgen enthalten. Wenn die Operationen MAX, MIN, DISTINCT, Verweise auf eine Gruppierungsspalte und die UNION-, EXCEPT- und INTERSECT-Operatoren sich auf Zeichen Zeichenketten beziehen, wird der spezifische Wert, der durch diese Operationen aus einer Menge solcher gleicher Werte ausgewählt wird, ist implementierungsabhängig.

(Hervorhebung hinzugefügt.)

Was bedeutet das? Es bedeutet, dass beim Vergleich von Zeichenketten, die = Operator ist nur ein dünner Wrapper um die aktuelle Sortierung. Eine Sortierreihenfolge ist eine Bibliothek, die verschiedene Regeln für den Vergleich von Zeichenketten enthält. Hier ist ein Beispiel für eine binäre Sortierung von MySQL :

static int my_strnncoll_binary(const CHARSET_INFO *cs __attribute__((unused)),
                               const uchar *s, size_t slen,
                               const uchar *t, size_t tlen,
                               my_bool t_is_prefix)
{
  size_t len= MY_MIN(slen,tlen);
  int cmp= memcmp(s,t,len);
  return cmp ? cmp : (int)((t_is_prefix ? len : slen) - tlen);
}

Diese spezielle Sortierung vergleicht Byte für Byte (deshalb heißt sie "binär" - sie gibt Zeichenketten keine besondere Bedeutung). Andere Sortierverfahren bieten möglicherweise fortgeschrittenere Vergleiche.

Hier ist zum Beispiel ein UTF-8-Kollationierung die case-insensitive Vergleiche 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 durchführen (z. B. Vergleiche ohne Berücksichtigung der Groß-/Kleinschreibung). Die = Operator ist vollständig von den Unwägbarkeiten der Sortierung abstrahiert.

Wie funktioniert LIKE Arbeit?

En SQL-Standard § 8.5 beschreibt, wie LIKE vergleicht Zeichenketten:

Das <Prädikat>

M LIKE P

ist wahr, wenn es eine Partitionierung von M in Teilzeichenfolgen gibt derart, dass:

i) Ein Teilstring von M ist eine Folge von 0 oder mehr zusammenhängenden <Zeichendarstellung> von M und jede <Zeichendarstellung Darstellung> von M ist Teil von genau einer Teilzeichenkette.

ii) Wenn der i-te Teilzeichenspezifizierer von P ein beliebiger Zeichenbezeichner ist, ist die i-te Teilzeichenkette von M eine beliebige <Zeichendarstellung>.

iii) Wenn der i-te Teilstring-Spezifizierer von P eine beliebige Zeichenkette ist Spezifizierer ist, dann ist die i-te Teilzeichenkette von M eine beliebige Folge von 0 oder mehr <Zeichendarstellungen>s.

iv) Wenn der i-te Teilzeichenspezifizierer von P weder ein willkürlicher Zeichenspezifizierer noch ein willkürlicher Zeichenkettenzähler, dann ist die i-te Teilzeichenkette von M gleich dieser Teilzeichenkette Spezifizierer gemäß der Kollationierungssequenz des des <ähnlichen Prädikats>, ohne das Anhängen von <Leerzeichen> Zeichen an M und hat die gleiche Länge wie dieser Teilstring Bezeichner.

v) Die Anzahl der Teilstrings von M ist gleich der Anzahl der Teilzeichenspezifizierer von P.

(Hervorhebung hinzugefügt.)

Das ist ziemlich wortreich, also fassen wir es kurz zusammen. Die Punkte ii und iii beziehen sich auf die Wildcards _ y % . Wenn P keine Platzhalter enthält, dann gilt nur Punkt iv. Dies ist der Fall, der für den Auftraggeber von Interesse ist.

In diesem Fall vergleicht es jede "Teilzeichenkette" (einzelne Zeichen) in M gegen jede Teilzeichenkette in P unter Verwendung der aktuellen Sortierung.

Schlussfolgerungen

Die Quintessenz ist, dass beim Vergleich von Zeichenketten, = vergleicht die gesamte Zeichenkette, während LIKE vergleicht ein Zeichen nach dem anderen. Beide Vergleiche verwenden die aktuelle Sortierung. Dieser Unterschied führt in einigen Fällen zu unterschiedlichen Ergebnissen, wie im ersten Beispiel in diesem Beitrag gezeigt wird.

Welche sollten Sie verwenden? Das kann Ihnen niemand sagen - Sie müssen die für Ihren Anwendungsfall richtige verwenden. Optimieren Sie nicht voreilig, indem Sie die Vergleichsoperatoren wechseln.

188voto

achinda99 Punkte 4890

Der Gleichheitsoperator (=) ist ein "Vergleichsoperator, der zwei Werte auf Gleichheit vergleicht". Mit anderen Worten: In einer SQL-Anweisung gibt er nur dann den Wert true zurück, wenn beide Seiten der Gleichung gleich sind. Zum Beispiel:

SELECT * FROM Store WHERE Quantity = 200;

Der LIKE-Operator "implementiert einen Mustervergleich", der versucht, "einen Zeichenfolgenwert mit einer Musterzeichenfolge abzugleichen, die Platzhalterzeichen enthält". Zum Beispiel:

SELECT * FROM Employees WHERE Name LIKE 'Chris%';

LIKE wird im Allgemeinen nur bei Zeichenketten verwendet, und equals ist (glaube ich) schneller. Der Gleichheitsoperator behandelt Platzhalterzeichen als Literalzeichen. Der Unterschied in den zurückgegebenen Ergebnissen ist wie folgt:

SELECT * FROM Employees WHERE Name = 'Chris';

Und

SELECT * FROM Employees WHERE Name LIKE 'Chris';

würde das gleiche Ergebnis liefern, obwohl die Verwendung von LIKE im Allgemeinen länger dauern würde, da es sich um eine Musterübereinstimmung handelt. Allerdings,

SELECT * FROM Employees WHERE Name = 'Chris%';

Und

SELECT * FROM Employees WHERE Name LIKE 'Chris%';

würde unterschiedliche Ergebnisse liefern, wobei die Verwendung von "=" dazu führt, dass nur Ergebnisse mit "Chris%" zurückgegeben werden und der LIKE-Operator alles zurückgibt, was mit "Chris" beginnt.

Ich hoffe, das hilft. Einige gute Informationen können gefunden werden aquí .

35voto

Aris Punkte 4169

Dies ist eine Kopie/Einfügung einer anderen Antwort von mir auf die Frage SQL 'like' vs. '=' Leistung :

Ein persönliches Beispiel mit mysql 5.5: Ich hatte eine innere Verknüpfung zwischen 2 Tabellen, eine mit 3 Millionen Zeilen und eine mit 10 Tausend Zeilen.

Bei Verwendung eines "like" für einen Index wie unten (ohne Platzhalter) dauerte es etwa 30 Sekunden:

where login like '12345678'

mit 'erklären' erhalte ich:

enter image description here

Bei Verwendung eines '=' für dieselbe Abfrage dauerte es etwa 0,1 Sekunden:

where login ='12345678'

Mit 'erklären' erhalte ich:

enter image description here

Wie Sie sehen können, ist die like die Indexsuche vollständig abgebrochen, so dass die Abfrage 300 Mal mehr Zeit benötigte.

23voto

WalterJ89 Punkte 1005

LIKE y = sind unterschiedlich. LIKE ist das, was Sie in einer Suchanfrage verwenden würden. Es erlaubt auch Platzhalter wie _ (einfacher Zeichenplatzhalter) und % (mehrstelliger Platzhalter).

= sollte verwendet werden, wenn Sie exakte Übereinstimmungen wünschen, und es wird schneller sein.

Diese Website erklärt LIKE

16voto

ISW Punkte 10694

Ein Unterschied - abgesehen von der Möglichkeit, Wildcards mit LIKE zu verwenden - besteht in den Leerzeichen am Ende: Der =-Operator ignoriert nachfolgende Leerzeichen, LIKE hingegen nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X