Czy podczas korzystania z SQL są jakieś korzyści wynikające z użycia =
w WHERE
klauzuli zamiast LIKE
?
Bez specjalnych operatorów LIKE
i czy =
są tacy sami, prawda?
sql
performance
equals
sql-like
Travis
źródło
źródło
5
głosy na tag operatora podobnego . Czy mogę prosić o zasugerowanie sql-like jako synonimu ?Odpowiedzi:
Różni operatorzy
LIKE
i=
są różnymi operatorami. Większość odpowiedzi tutaj koncentruje się na obsłudze symboli wieloznacznych, co nie jest jedyną różnicą między tymi operatorami!=
to operator porównania, który działa na liczbach i ciągach. Podczas porównywania ciągów operator porównania porównuje całe ciągi .LIKE
jest operatorem łańcuchowym, który porównuje znak po znaku .Aby skomplikować sprawę, obaj operatorzy stosują sortowanie, które może mieć istotny wpływ na wynik porównania.
Motywujący przykład
Najpierw zidentyfikujmy przykład, w którym operatorzy ci uzyskują oczywiście różne wyniki. Pozwól mi zacytować z podręcznika MySQL:
Należy pamiętać, że ta strona podręcznika MySQL nazywa funkcji porównawczych String , a
=
nie jest omawiana, co oznacza, że=
nie jest to ściśle funkcją porównania ciągów.W jaki sposób
=
działa?SQL Standardowe § 8.2 opisuje sposób
=
porównuje ciągi:(Podkreślenie dodane.)
Co to znaczy? Oznacza to, że podczas porównywania ciągów
=
operator jest tylko cienkim owinięciem wokół bieżącego sortowania. Zestawienie to biblioteka, która ma różne reguły porównywania ciągów. Oto przykład sortowania binarnego z MySQL :To konkretne zestawienie zdarza się porównywać bajt po bajcie (dlatego nazywa się to „binarne” - nie nadaje żadnego specjalnego znaczenia ciągom znaków). Inne zestawienia mogą zapewniać bardziej zaawansowane porównania.
Na przykład tutaj jest zestawienie UTF-8, które obsługuje porównania bez rozróżniania wielkości liter. Kod jest za długi, aby go wkleić, ale przejdź do tego linku i przeczytaj treść
my_strnncollsp_utf8mb4()
. To zestawianie może przetwarzać wiele bajtów jednocześnie i może stosować różne transformacje (takie jak porównanie bez rozróżniania wielkości liter).=
Operator jest całkowicie oderwana od napotkane pęczka.W jaki sposób
LIKE
działa?SQL Standardowe § 8.5 opisuje sposób
LIKE
porównuje ciągi:(Podkreślenie dodane.)
To dość trudne, więc załamajmy się. Pozycje ii i iii odnoszą się odpowiednio do symboli wieloznacznych
_
i%
. JeśliP
nie zawiera żadnych symboli wieloznacznych, obowiązuje tylko pozycja iv. Jest to przypadek zainteresowania PO.W tym przypadku porównuje każdy „podłańcuch” (poszczególne znaki)
M
z każdym podciągiem przyP
użyciu bieżącego sortowania.Wnioski
Najważniejsze jest to, że porównując ciągi,
=
porównuje cały ciąg, jednocześnieLIKE
porównując jeden znak na raz. Oba porównania wykorzystują bieżące zestawienie. Różnica ta prowadzi do różnych wyników w niektórych przypadkach, o czym świadczy pierwszy przykład w tym poście.Którego powinieneś użyć? Nikt nie może ci tego powiedzieć - musisz użyć tego, który jest odpowiedni dla twojego przypadku użycia. Nie przedwcześnie optymalizuj, przełączając operatory porównania.
źródło
LIKE
robi, ale ta odpowiedź niesamowicie wyjaśnia, że używanieLIKE
bez%
lub z_
prezentem wcale nie jest tym samym, co używanie=
. Niech twoja odpowiedź otrzyma tysiąc głosów pozytywnych.'AbCdEfG'
, a ja takWHERE MyCol = 'abcdefg'
, nadal otrzymuję ten wiersz z powrotem, mimo że wyraźnie nie są one równoważne bajt po bajcieset charset latin1;
SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
daje 0, a takżeSELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
daje 0.Operator równości (=) to „operator porównania porównujący dwie wartości równości”. Innymi słowy, w instrukcji SQL nie zwróci wartości true, chyba że obie strony równania są równe. Na przykład:
Operator LIKE „implementuje porównanie dopasowania wzorca”, który próbuje dopasować „wartość ciągu do ciągu wzorca zawierającego znaki wieloznaczne”. Na przykład:
LIKE jest generalnie używane tylko z łańcuchami i równa się (jak sądzę) jest szybsza. Operator równości traktuje znaki wieloznaczne jako znaki dosłowne. Różnica w zwracanych wynikach jest następująca:
I
Zwróciłby ten sam wynik, chociaż użycie LIKE zwykle trwa dłużej, ponieważ jest to dopasowanie wzorca. Jednak,
I
Zwróciłoby różne wyniki, przy czym użycie „=” powoduje tylko wyniki ze zwróconym „Chris%”, a operator LIKE zwróci wszystko zaczynające się od „Chris”.
Mam nadzieję, że to pomaga. Kilka dobrych informacji można znaleźć tutaj .
źródło
To jest kopia / wklej innej mojej odpowiedzi na pytanie SQL „jak” vs ”=„ wydajność :
Osobisty przykład z użyciem mysql 5.5: Miałem wewnętrzne połączenie między 2 tabelami, jednym z 3 milionów wierszy i jednym z 10 tysięcy wierszy.
Podczas korzystania z polubienia w indeksie jak poniżej (bez symboli wieloznacznych) zajęło to około 30 sekund:
używając „wyjaśnij” otrzymuję:
Podczas używania znaku „=” w tym samym zapytaniu zajęło to około 0,1 sekundy:
Używając „wyjaśnij” otrzymuję:
Jak widać
like
całkowicie anulowano wyszukiwanie indeksu, więc zapytanie zajęło 300 razy więcej czasu.źródło
LIKE
i=
są różne.LIKE
to, czego byś użył w wyszukiwaniu. Umożliwia także stosowanie symboli wieloznacznych, takich jak_
( symbol wieloznaczny prosty) i%
(symbol wieloznaczny wieloznakowy).=
należy użyć, jeśli chcesz dokładnie dopasować i będzie to szybsze.Ta strona wyjaśnia
LIKE
źródło
Jedną różnicą - oprócz możliwości używania symboli wieloznacznych z LIKE - są spacje końcowe: operator = ignoruje spację końcową, ale LIKE nie.
źródło
Zależy od systemu baz danych.
Ogólnie bez znaków specjalnych, tak, = i LIKE są takie same.
Niektóre systemy baz danych mogą jednak traktować ustawienia sortowania inaczej w zależności od operatora.
Na przykład w porównaniach MySQL z ciągami = na ciągach domyślnie zawsze nie jest rozróżniana wielkość liter, więc LIKE bez znaków specjalnych jest takie samo. W niektórych innych RDBMS LIKE nie rozróżnia wielkości liter, podczas gdy = nie.
źródło
W tym przykładzie przyjmujemy za pewnik, że varcharcol nie zawiera
''
i nie ma pustej komórki względem tej kolumnyPierwszy daje wynik w wierszu 0, a drugi pokazuje całą listę. = jest ściśle dopasowaną wielkością, podczas gdy podobnie działa jak filtr. jeśli filtr nie ma kryteriów, wszystkie dane są prawidłowe.
jak - ze względu na swój cel działa nieco wolniej i jest przeznaczony do użytku z varchar i podobnymi danymi.
źródło
Jeśli szukasz dokładnego dopasowania, możesz użyć zarówno, = i JAK.
Użycie „=” jest w tym przypadku nieco szybsze (wyszukiwanie dokładnego dopasowania) - możesz to sprawdzić, wykonując dwukrotnie to samo zapytanie w SQL Server Management Studio, raz używając „=”, raz używając „LIKE” i następnie używając „Zapytania” / „Uwzględnij aktualny plan wykonania”.
Wykonaj dwa zapytania i powinieneś zobaczyć swoje wyniki dwa razy oraz dwa rzeczywiste plany wykonania. W moim przypadku zostały podzielone 50% w porównaniu do 50%, ale plan wykonania „=” ma mniejszy „szacunkowy koszt drzewa podrzędnego” (wyświetlany, gdy najedziesz myszką na najbardziej lewe pole „WYBIERZ”) - ale znowu, to naprawdę niezbyt duża różnica.
Ale kiedy zaczniesz wyszukiwać za pomocą symboli wieloznacznych w wyrażeniu LIKE, wydajność wyszukiwania będzie przygaszona. Wyszukiwanie „LIKE Mill%” może być nadal dość szybkie - SQL Server może użyć indeksu w tej kolumnie, jeśli taki istnieje. Wyszukiwanie „LIKE% expression%” jest strasznie wolne, ponieważ jedynym sposobem, w jaki SQL Server może spełnić to wyszukiwanie, jest wykonanie pełnego skanowania tabeli. Uważaj więc na swoje PODOBNE!
Marc
źródło
Użycie = pozwala uniknąć konfliktów ze znakami wieloznacznymi i znakami specjalnymi w łańcuchu podczas tworzenia zapytania w czasie wykonywania.
To sprawia, że życie programisty jest łatwiejsze, ponieważ nie trzeba uciec od wszystkich specjalnych znaków wieloznacznych, które mogą wpaść w klauzulę LIKE i nie generować zamierzonego wyniku. W końcu = = scenariusz przypadków użycia 99%, ucieczka przed nimi za każdym razem byłaby uciążliwa.
przewraca oczami w latach 90
Podejrzewam też, że jest nieco wolniejszy, ale wątpię, czy jest znaczący, jeśli we wzorze nie ma symboli wieloznacznych.
źródło
Aby odpowiedzieć na pierwotne pytanie dotyczące wydajności, sprowadza się to do wykorzystania indeksu . Kiedy następuje proste skanowanie tabeli, „LIKE” i „=” są identyczne . W przypadku indeksów zależy to od sposobu utworzenia klauzuli LIKE. Mówiąc dokładniej, jaka jest lokalizacja symboli wieloznacznych?
Rozważ następujące:
Może występować nieznaczna różnica w tworzeniu planu zapytań przy użyciu „=” vs „LIKE”.
źródło
Oprócz symboli wieloznacznych różnica między
=
ANDLIKE
będzie zależeć zarówno od rodzaju serwera SQL, jak i od typu kolumny.Weź ten przykład:
Używając MS SQL Server 2012 , końcowe spacje zostaną zignorowane w porównaniu, z wyjątkiem sytuacji,
LIKE
gdy typ kolumny toVARCHAR
.Używając MySQL 5.5 , końcowe spacje będą ignorowane dla
=
, ale nie dlaLIKE
, zarówno z jakCHAR
iVARCHAR
.Korzystając z PostgreSQL 9.1 , spacje są znaczące zarówno przy użyciu , jak
=
iLIKE
przy użyciuVARCHAR
, ale nie przyCHAR
(patrz dokumentacja ).Zachowanie się
LIKE
również różni sięCHAR
.Korzystanie z tych samych danych, co powyżej, użycie wyraźnego
CAST
w nazwie kolumny również robi różnicę :Zwraca to tylko wiersze dla „CAST zarówno”, jak i „CAST col”.
źródło
Słowo kluczowe LIKE niewątpliwie ma dołączony „znacznik ceny wykonania”. To powiedziawszy, jeśli masz pole wejściowe, które potencjalnie może zawierać znaki wieloznaczne do użycia w zapytaniu, zaleciłbym użycie LIKE tylko, jeśli dane wejściowe zawierają jedną z symboli wieloznacznych. W przeciwnym razie użyj standardu równego porównaniu.
Z poważaniem...
źródło
Naprawdę sprowadza się do tego, co chcesz zrobić zapytanie. Jeśli masz na myśli dokładne dopasowanie, użyj =. Jeśli masz na myśli bardziej fuzzier, użyj LIKE. Mówienie, co masz na myśli, jest zwykle dobrą polityką z kodem.
źródło
W Oracle „podobne” bez symboli wieloznacznych zwróci ten sam wynik co „równa się”, ale może wymagać dodatkowego przetwarzania. Według Toma Kyte'a Oracle będzie traktować „jak” bez symboli wieloznacznych jako „równa się” przy użyciu literałów, ale nie przy użyciu zmiennych powiązania.
źródło
=
iLIKE
to nie to samo;=
pasuje do dokładnego ciąguLIKE
dopasowuje ciąg znaków, który może zawierać symbole wieloznaczne (%)źródło