Frage

Bei der Verwendung von SQL, gibt es irgendwelche Vorteile von = in einer WHERE Klausel statt LIKE mit?

Ohne spezielle Operatoren, LIKE und = sind die gleichen, nicht wahr?

War es hilfreich?

Lösung

Verschiedene Operatoren

LIKE und = sind verschiedene Operatoren. Die meisten Antworten konzentrieren sich hier auf die Wildcard-Unterstützung, die nicht der einzige Unterschied zwischen diesen Operatoren ist!

= ist ein Vergleichsoperator, der auf Zahlen und Strings arbeitet. Wenn Strings zu vergleichen, der Vergleichsoperator vergleicht ganze Strings .

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

Angelegenheiten erschweren, verwenden beide Operatoren einen Sortierungs , die wichtige Auswirkungen auf das Ergebnis des Vergleichs haben kann.

Motivierende Beispiel

Lassen Sie uns zunächst ein Beispiel erkennen, wo diese Betreiber offensichtlich zu unterschiedlichen Ergebnissen führen. Gestatten Sie mir, aus dem MySQL-Handbuch zu zitieren:

  

Per SQL-Standard führt LIKE auf Anpassen eine pro-Zeichen-Basis, so kann es Ergebnisse produziert verschieden von dem = Vergleichsoperator:

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-Handbuch genannt wird String-Vergleichsfunktionen und = wird nicht diskutiert, was bedeutet, dass = nicht unbedingt eine String-Vergleichsfunktion ist.

Wie funktioniert = Arbeit?

Die SQL-Standards 8.2 § wird beschrieben, wie = vergleicht Strings:

  

Der Vergleich von zwei Zeichenketten wird wie folgt bestimmt:

     

a) Wenn die Länge in Zeichen von X nicht gleich der Länge ist   in Zeichen von Y, dann ist die kürzere Zeichenkette effektiv   ersetzt, für die Zwecke des Vergleichs mit einer Kopie   selbst, die auf die Länge der längeren verlängert wurde   String durch Verkettung auf der rechten Seite von einem oder mehreren pad   Zeichen, wobei die Füllzeichen gewählt wird basierend auf CS. Wenn   CS hat das Attribut NO PAD, dann ist die Füllzeichen ist ein   implementierungsabhängigen Zeichen verschieden von jedem   Zeichen in dem Zeichensatz von X und Y, die weniger kollationiert   als jede Zeichenfolge unter CS. Ansonsten ist die Füllzeichen a   .

     

b), um das Ergebnis des Vergleichs von X und Y wird durch die gegebenen   Sortierfolge CS.

     

c) auf der Sortierfolge Je zwei Strings können   wie gleich vergleichen, auch wenn sie unterschiedliche Längen aufweisen oder   enthält verschiedene Sequenzen von Zeichen. Wenn die Operationen   MAX, MIN, DISTINCT, Verweise auf eine Gruppierungsspalte, und die   UNION, EXCEPT und INTERSECT Operatoren Zeichen verweisen   Strings, die durch diese Operationen ausgewählten spezifischen Wert aus   ein Satz solcher gleiche Werte ist abhängig von der Implementierung.

(Hervorhebung hinzugefügt.)

Was bedeutet das? Es bedeutet, dass, wenn Strings zu vergleichen, der = Operator nur eine dünne Hülle um die aktuelle Zusammenstellung ist. Eine Zusammenstellung ist eine Bibliothek, die verschiedene Regeln für den Vergleich von Zeichenketten hat. Hier ist ein Beispiel von rel="noreferrer"> :

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 besondere Zusammenstellung geschieht Byte-für-Byte vergleichen (weshalb es „binärer“ genannt - es keine besondere Bedeutung zu Strings nicht geben). Andere Sortierungen können fortgeschrittenere Vergleiche bieten.

Zum Beispiel, hier ist ein UTF- 8 Sortierungs , die Groß- und Kleinschreibung Vergleiche unterstützt. Der Code ist zu lang, um hier zu kleben, aber zu diesem Link zu gehen und den Körper von my_strnncollsp_utf8mb4() zu lesen. Diese Zusammenstellung kann mehrere Bytes gleichzeitig verarbeiten und es kann verschiedene Transformationen (wie Groß- und Kleinschreibung Vergleich) gilt. Der = Bediener vollständig abstrahiertvon den Launen der Sortierung.

Wie funktioniert LIKE Arbeit?

Die SQL-Standards 8.5 § wird beschrieben, wie LIKE vergleicht Strings:

  

     

M LIKE P

     

ist wahr, wenn es eine Aufteilung von M in Teil existiert   so dass:

     

i) A String von M ist eine Folge von 0 oder mehr zusammenhängenden    s von M und jedes Zeichen <   Darstellung> von M Teil von genau einer Teilkette ist.

     

ii) Wenn das i-te Teilzeichen Spezifizierer von P ein beliebigen ist   Zeichenangaben sind die i-te Teilkette von M jeder einzelnen   .

     

iii) Wenn der i-te Teilzeichen Spezifizierer von P eine beliebige Zeichenfolge   Spezifizierer, dann der i-te Teilstring von M ist eine beliebige Sequenz von   0 oder mehr Zeichen s.

     

iv) Wenn das i-te Teilzeichen Spezifizierer von P ist weder ein   beliebiges Zeichen Spezifizierer noch ein beliebiger String-Bezeichner,   dann ist die i-te Teilkette von M gleich dieser Unter   Spezifizierer nach dem Kollatierungssequenz   das , ohne Anfügen von   Zeichen M, und hat die gleiche Länge wie die Teilzeichen   Spezifizierer.

     

v) Die Zahl der Teil von M ist gleich der Anzahl von   Teilzeichenbezeich von P.

(Hervorhebung hinzugefügt.)

Das ist ziemlich wortreich, also lassen Sie uns es brechen. Artikel II und III beziehen sich auf die Platzhalter _ und %, respectively. Wenn P keine Platzhalter enthält nicht, dann gilt nur Artikel iv. Dies ist der Fall von Interesse durch die OP gestellt.

In diesem Fall ist es vergleicht jeden „Teilstring“ (Einzelzeichen) in M gegen jede Teilkette in der aktuelle P Kollation verwendet wird.

Schlussfolgerungen

Das Endergebnis ist, dass, wenn Zeichenfolgen verglichen wird, die gesamte Zeichenfolge = vergleicht während LIKE ein Zeichen zu einer Zeit vergleicht. Beide Vergleiche verwenden, um die aktuelle Sortierung. Dieser Unterschied führt zu unterschiedlichen Ergebnissen in einigen Fällen, wie im ersten Beispiel in diesem Beitrag nicht belegt.

Welche soll man verwenden? Niemand kann Ihnen sagen, dass - Sie brauchen die man verwenden, die für Ihren Anwendungsfall korrekt ist. Nicht vorzeitig optimieren, indem Vergleichsoperator wechseln.

Andere Tipps

Das Gleichheitsoperator (=) ist ein „Vergleichsoperator zwei Werte auf Gleichheit vergleicht.“ Mit anderen Worten, in einer SQL-Anweisung, wird es nicht wahr zurück, wenn beide Seiten der Gleichung gleich sind. Zum Beispiel:

SELECT * FROM Store WHERE Quantity = 200;

Der LIKE-Operator „implementiert ein Musterübereinstimmungsvergleich“, die entsprechen versucht, „einen String-Wert gegen ein Muster String mit Wild-Card-Zeichen.“ Zum Beispiel:

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

LIKE wird in der Regel nur mit Streichern und equals (glaube ich) ist schneller eingesetzt. Der Gleichheitsoperator behandelt Wild-Card-Zeichen als wörtliche Zeichen. Der Unterschied in den Ergebnissen zurückgegeben wird, ist wie folgt:

SELECT * FROM Employees WHERE Name = 'Chris';

Und

SELECT * FROM Employees WHERE Name LIKE 'Chris';

Würde das gleiche Ergebnis zurück, wenn auch mit LIKE im Allgemeinen als ein Muster Spiel länger dauern würde. Allerdings

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

Und

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

Würde unterschiedliche Ergebnisse zurückgeben, wo mit „=“ Ergebnisse in nur Ergebnisse mit „Chris%“ zurückgeführt wird und der LIKE-Operator wird wieder alles beginnend mit „Chris“.

Ich hoffe, das hilft. Einige gute Informationen finden Sie hier .

LIKE und = sind unterschiedlich. LIKE ist, was Sie in einer Suchanfrage verwenden würde. Es ermöglicht auch Platzhalter wie _ (einfache Zeichen Wildcard) und % (Multi-Zeichen Wildcard).

= verwendet werden soll, wenn Sie exakte Übereinstimmungen wollen und es wird schneller sein.

Diese Seite erklärt LIKE

Dies ist eine copy / paste einer anderen Antwort von mir für Fragen SQL ‚wie‘ vs '=' Leistung :

Ein persönliches Beispiel mit MySQL 5.5: Ich hatte eine innere zwischen zwei Tabellen, ein von 3 Millionen Zeilen und einer von 10 Tausend Reihen verbinden

.

Wenn ein wie auf einem Index wie unter Verwendung von (keine Wildcards), es dauerte etwa 30 Sekunden:

where login like '12345678'

mit 'erklären' ich:

eingeben Bild Beschreibung hier

Wenn Sie eine ‚=‘ auf derselben Abfrage, es etwa 0,1 Sekunden gedauert:

where login ='12345678'

Mit 'erklären' ich:

eingeben Bild Beschreibung hier

Wie Sie sehen können, die like vollständig der Index sucht abgebrochen, so Abfrage dauerte 300 mal mehr Zeit.

.

Ein Unterschied - abgesehen von der Möglichkeit, mit LIKE Platzhalter zu verwenden - ist Räume in Hinter: Der Operator = ignoriert Raum nachlauf, aber nicht wie

Abhängig von dem Datenbanksystem.

Generell ohne Sonderzeichen, ja, = und LIKE sind gleich.

Einige Datenbanksysteme können jedoch Sortierungseinstellungen unterschiedlich mit den verschiedenen Betreibern behandeln.

Zum Beispiel in MySQL Vergleichen mit = auf Strings ist immer Groß- und Kleinschreibung standardmäßig so LIKE ohne Sonderzeichen ist das gleiche. Auf einigen anderen LIKE RDBMS ist Groß- und Kleinschreibung, während = nicht.

Für dieses Beispiel nehmen wir es für selbstverständlich, dass varcharcol enthält keine '' und haben keine leere Zelle gegen diese Spalte

select * from some_table where varcharCol = ''
select * from some_table where varcharCol like ''

Die ersten Ergebnisse in 0 Zeile ausgegeben, während der zweite die gesamte Liste zeigt. = Ist streng-Match Fall während wie wirkt wie ein Filter. wenn Filter keine Kriterien hat, jede Daten gültig sind.

wie. - durch die aufgrund ihres Zwecks arbeitet ein wenig langsamer und ist für den Einsatz mit varchar und ähnlichen Daten bestimmt

Wenn Sie nach einer genauen Übereinstimmung zu suchen, können Sie beide verwenden, = und dergleichen.

Mit „=“ ist ein klein bisschen schneller in diesem Fall (nach einer genauen Übereinstimmung suchen) - Sie diese selbst die gleiche Abfrage überprüfen kann in SQL Server Management Studio zweimal, indem er, einmal mit „=“, einmal mit „LIKE “und dann mit der‚Query‘/‚tatsächlichen Ausführungsplan einschließen‘.

Führen Sie die zwei Abfragen und Sie sollten Ihre Ergebnisse zweimal, plus die zwei tatsächlichen Ausführungspläne sehen. In meinem Fall waren sie 50% vs. 50% gespalten, aber der „=“ Ausführungsplan hat eine kleinere „geschätzte Unterstruktur Kosten“ (werden angezeigt, wenn Sie über die am weitesten links stehenden „SELECT“ Box schweben) - aber auch hier ist es wirklich kein großer Unterschied.

Aber wenn Sie mit Platzhalter in Ihrem LIKE Ausdruck starten Sie die Suche, wird die Suchleistung dimish. Suche nach „LIKE Mühle%“ immer noch ziemlich schnell sein - SQL Server einen Index für diese Spalte verwenden kann, wenn es einen gibt. Searching „LIKE% Ausdruck%“ ist schrecklich langsam, da die einzige Möglichkeit, SQL Server diese Suche, indem Sie einen vollständigen Tabellenscan ist zufrieden stellen können. Seien Sie also vorsichtig mit dem LIKE ist!

Marc

= Verwendung vermeidet Wildcards und Sonderzeichen Konflikte in der Zeichenfolge, wenn Sie die Abfrage zur Laufzeit aufzubauen.

Das macht die Programmierer das Leben leichter, indem nicht alle speziellen Platzhalter zu entkommen, die die in der LIKE-Klausel rutschen könnte und nicht das gewünschte Ergebnis zu erzeugen. Immerhin = das Use-Case-Szenario von 99% ist, wäre es ein Schmerz sein, um sie jedes Mal zu entkommen.

rollt Augen 90er

Ich vermute auch, dass es ein wenig langsamer, aber ich bezweifle es wichtig ist, wenn es keine Platzhalter im Muster sind.

die ursprüngliche Frage in Bezug auf Leistung zu begegnen, kommt es auf Index Nutzung . Wenn eine einfache Tabellen-Scan auftritt, "WIE" und "=" sind identisch . Wenn Indizes beteiligt sind, ist es abhängig , wie die LIKE-Klausel gebildet wird. Genauer gesagt, was ist der Ort der Platzhalter (n)?


Beachten Sie Folgendes:

CREATE TABLE test(
    txt_col  varchar(10) NOT NULL
)
go

insert test (txt_col)
select CONVERT(varchar(10), row_number() over (order by (select 1))) r
  from master..spt_values a, master..spt_values b
go

CREATE INDEX IX_test_data 
    ON test (txt_col);
go 

--Turn on Show Execution Plan
set statistics io on

--A LIKE Clause with a wildcard at the beginning
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col like '%10000'
--Results in
--Table 'test'. Scan count 3, logical reads 15404, physical reads 2, read-ahead reads 15416, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index SCAN is 85% of Query Cost

--A LIKE Clause with a wildcard in the middle
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col like '1%99'
--Results in
--Table 'test'. Scan count 1, logical reads 3023, physical reads 3, read-ahead reads 3018, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index Seek is 100% of Query Cost for test data, but it may result in a Table Scan depending on table size/structure

--A LIKE Clause with no wildcards
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col like '10000'
--Results in
--Table 'test'. Scan count 1, logical reads 3, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index Seek is 100% of Query Cost
GO

--an "=" clause = does Index Seek same as above
DBCC DROPCLEANBUFFERS
SELECT txt_Col from test where txt_col = '10000'
--Results in
--Table 'test'. Scan count 1, logical reads 3, physical reads 2, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
--Index Seek is 100% of Query Cost
GO


DROP TABLE test

Es kann auch vernachlässigbaren Unterschied bei der Erstellung des Abfrageplanes sein bei der Verwendung von „=“ vs „LIKE“.

Neben den Platzhalter, der Unterschied zwischen = UND LIKE wird davon abhängen, sowohl die Art von SQL Server und auf dem Spaltentyp.

Nehmen Sie dieses Beispiel:

CREATE TABLE testtable (
  varchar_name VARCHAR(10),
  char_name CHAR(10),
  val INTEGER
);

INSERT INTO testtable(varchar_name, char_name, val)
    VALUES ('A', 'A', 10), ('B', 'B', 20);

SELECT 'VarChar Eq Without Space', val FROM testtable WHERE varchar_name='A'
UNION ALL
SELECT 'VarChar Eq With Space', val FROM testtable WHERE varchar_name='A '
UNION ALL
SELECT 'VarChar Like Without Space', val FROM testtable WHERE varchar_name LIKE 'A'
UNION ALL
SELECT 'VarChar Like Space', val FROM testtable WHERE varchar_name LIKE 'A '
UNION ALL
SELECT 'Char Eq Without Space', val FROM testtable WHERE char_name='A'
UNION ALL
SELECT 'Char Eq With Space', val FROM testtable WHERE char_name='A '
UNION ALL
SELECT 'Char Like Without Space', val FROM testtable WHERE char_name LIKE 'A'
UNION ALL
SELECT 'Char Like With Space', val FROM testtable WHERE char_name LIKE 'A '
  • Verwenden von MS SQL Server 2012 , werden die Leerzeichen ignoriert in der Vergleich, außer mit LIKE wenn der Spaltentyp ist VARCHAR.

  • Mit MySQL 5.5 , werden die hinteren Räume für = außer Acht gelassen werden, aber nicht für LIKE, beide mit CHAR und VARCHAR.

  • Mit PostgreSQL 9.1 , sind Räume signifikant sowohl mit = und LIKE mit VARCHAR, aber nicht mit CHAR (siehe Dokumentation ).

    Das Verhalten mit LIKE unterscheidet sich auch mit CHAR.

    , wie oben die gleichen Daten verwenden, eine explizite CAST mit auf den Spaltennamen macht auch einen Unterschied

    SELECT 'CAST none', val FROM testtable WHERE char_name LIKE 'A'
    UNION ALL
    SELECT 'CAST both', val FROM testtable WHERE
        CAST(char_name AS CHAR) LIKE CAST('A' AS CHAR)
    UNION ALL
    SELECT 'CAST col', val FROM testtable WHERE CAST(char_name AS CHAR) LIKE 'A'
    UNION ALL
    SELECT 'CAST value', val FROM testtable WHERE char_name LIKE CAST('A' AS CHAR)
    

    Diese liefert nur Zeilen für "CAST beide" und "CAST col".

Das Schlüsselwort LIKE kommt zweifellos mit einem „Performance Preisschild“ angebracht. Das heißt, wenn Sie ein Eingabefeld haben, die möglicherweise Wildcard-Zeichen enthalten könnte in der Abfrage verwendet werden, empfehle ich LIKE würde nur, wenn die Eingabe eine der Wildcards enthält. Andernfalls verwenden Sie den Standard gleich Vergleich.

Mit freundlichen Grüßen ...

es kommt wirklich darauf an, was Sie die Abfrage tun wollen. Wenn Sie eine genaue Übereinstimmung bedeutet dann = verwenden. Wenn Sie ein unschärfer Spiel bedeuten, dann LIKE. Zu sagen, was du meinst ist in der Regel eine gute Politik mit Code.

In Oracle, ein ‚wie‘ ohne Platzhalter wird das gleiche Ergebnis zurück, wie ein ‚gleich‘, könnte aber eine zusätzliche Verarbeitung erfordern. Laut Tom Kyte , wird Oracle ein ‚wie‘ ohne Platzhalter behandeln, als ein ‚gleich‘, wenn Literale verwenden, aber nicht, wenn bind-Variablen verwendet wird.

= und LIKE ist nicht gleich sind;

  1. = stimmt die exakte Zeichenfolge
  2. LIKE passt eine Zeichenfolge, die Platzhalter (%)
  3. enthalten
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top