MySQL Symbole wieloznaczne: Lubię to, NIE Lubię to, Escape, ( %), ( _ )
⚡ Inteligentne podsumowanie
MySQL Symbole wieloznaczne umożliwiają wyszukiwanie oparte na wzorcach poprzez połączenie operatorów LIKE i NOT LIKE ze znakami specjalnymi. Wyjaśnia to symbole wieloznaczne procentowe i podkreślenia, słowo kluczowe ESCAPE, praktyczne zapytania do bazy danych myflixdb oraz kwestie wydajności.
Jakie są MySQL Symbole wieloznaczne?
MySQL Symbole wieloznaczne to znaki specjalne, które pomagają wyszukiwać dane pasujące do złożonego wzorca, a nie do dokładnej wartości. Symbole wieloznaczne są zawsze używane w połączeniu z operatorem porównania LIKE lub NOT LIKE.
MySQL obsługuje dwa znaki wieloznaczne, a każdy z nich odpowiada na inne pytanie dotyczące Twoich danych.
| wieloznaczny | Znaczenie | Przykładowy wzór | Poprawne |
|---|---|---|---|
| % | Zero (0) lub więcej znaków | '%kod%' | Code Imię Black, DaVinci Code |
| _ | Dokładnie jeden znak | '200_' | 2005, 2008 |
Teraz, gdy zdefiniowaliśmy już te dwie postacie, w następnej sekcji wyjaśnimy, dlaczego warto się nimi zainteresować.
Dlaczego warto używać symboli wieloznacznych w MySQL?
Jeśli znasz SQL, możesz pomyśleć, że możesz już wyszukiwać dowolne złożone dane za pomocą SELECT i klauzuli WHERE. Po co więc w ogóle używać symboli wieloznacznych?
Zanim odpowiemy na to pytanie, przyjrzyjmy się przykładowi. Załóżmy, że dział marketingu wypożyczalni filmów Myflix przeprowadził promocje w Teksasie i chciałby uzyskać informacje o liczbie zarejestrowanych użytkowników z tego stanu. Aby uzyskać potrzebne informacje, możesz użyć poniższego polecenia SELECT wraz z klauzulą WHERE.
SELECT * FROM members WHERE postal_address = 'Austin, TX' OR postal_address = 'Dallas, TX' OR postal_address = 'Iola, TX' OR postal_address = 'Houston, TX';
Jak widać z powyższego zapytania, „klauzula GDZIE„Staje się długie i kruche: każde nowe miasto trzeba dodać ręcznie, a pojedynczy błędnie napisany adres jest automatycznie pomijany. Użycie symboli wieloznacznych upraszcza zapytanie, ponieważ jeden wzorzec obejmuje każde miasto w danym stanie.
SELECT * FROM members WHERE postal_address LIKE '%TX';
Krótko mówiąc, symbole wieloznaczne pozwalają na tworzenie zaawansowanych funkcji wyszukiwania w aplikacjach opartych na danych, przy znacznie mniejszej ilości kodu SQL. W następnej sekcji szczegółowo omówimy każdy symbol wieloznaczny.
Rodzaje MySQL Symbole wieloznaczne
% – symbol wieloznaczny procentowy
Znak procentowy (%) służy do określenia wzorca zero (0) lub więcej znaków. Ma następującą podstawową składnię.
SELECT * FROM table_name WHERE fieldname LIKE 'xxx%';
TUTAJ:
- "SELECT oświadczenie” jest standardowym poleceniem SQL SELECT.
- „WHERE” to słowo kluczowe używane do zastosowania filtru.
- „LIKE” to operator porównania używany w połączeniu z symbolami wieloznacznymi.
- „xxx” to dowolny określony wzorzec, np. pojedynczy znak lub więcej, a „%” oznacza dowolną liczbę znaków zaczynając od zera (0).
Aby w pełni zrozumieć powyższe stwierdzenie, przyjrzyjmy się praktycznemu przykładowi. Załóżmy, że chcemy znaleźć wszystkie filmy, których tytuł zawiera słowo „code”. Użylibyśmy symbolu wieloznacznego procentowego po obu stronach słowa „code”, aby dopasować wzorzec w dowolnym miejscu tytułu.
SELECT * FROM movies WHERE title LIKE '%code%';
Wykonanie powyższego skryptu w MySQL Workbench w stosunku do bazy danych myflixdb daje nam wyniki pokazane poniżej.
| identyfikator_filmu | tytuł | dyrektor | rok_wydania | identyfikator_kategorii |
|---|---|---|---|---|
| 4 | Code Imię Czarny | Edgara Jimza | 2010 | NULL |
| 7 | Davinci Code | NULL | NULL | 6 |
Zwróć uwagę, że słowo kluczowe „kod” jest zwracane niezależnie od tego, czy pojawia się na początku, czy na końcu tytułu. Dzieje się tak, ponieważ wzorzec dopuszcza dowolną liczbę znaków przed słowem „kod” i dowolną liczbę znaków po nim.
Zmodyfikujmy teraz skrypt tak, aby symbol wieloznaczny procentowy pojawiał się tylko na początku kryteriów wyszukiwania.
SELECT * FROM movies WHERE title LIKE '%code';
Wykonanie powyższego skryptu w MySQL Workbench i baza danych myflixdb dają nam wyniki pokazane poniżej.
| identyfikator_filmu | tytuł | dyrektor | rok_wydania | identyfikator_kategorii |
|---|---|---|---|---|
| 7 | Davinci Code | NULL | NULL | 6 |
Zauważ, że zwrócono tylko jeden rekord. Wzorzec pasuje do dowolnej liczby znaków na początku tytułu, ale wymaga, aby tytuł… zakończenia z „kodem”.
Przenieśmy teraz symbol wieloznaczny procent na koniec wzoru. Zmodyfikowany skrypt pokazano poniżej.
SELECT * FROM movies WHERE title LIKE 'code%';
Wykonanie powyższego skryptu w MySQL Workbench i baza danych myflixdb dają nam wyniki pokazane poniżej.
| identyfikator_filmu | tytuł | dyrektor | rok_wydania | identyfikator_kategorii |
|---|---|---|---|---|
| 4 | Code Imię Czarny | Edgara Jimza | 2010 | NULL |
Ponownie zwracany jest tylko jeden rekord, ponieważ ten wzór pasuje do każdego tytułu, który rozpocznie z „kodem” i dowolną liczbą znaków. Pozycja symbolu % decyduje zatem o znaczeniu wyszukiwania.
💡 Wskazówka: Wzorzec taki jak „code%” nadal może używać indeksu w kolumnie tytułu, podczas gdy „%code%” nie. Symbol wieloznaczny procentowy na początku wymusza MySQL aby przeskanować każdy wiersz, więc zachowaj symbol wieloznaczny po prawej stronie, jeśli wyszukiwanie na to pozwala.
_ – symbol wieloznaczny podkreślenia
Do tego używany jest znak wieloznaczny podkreślenia dopasuj dokładnie jeden znakZałóżmy, że chcemy znaleźć wszystkie filmy wydane w latach 200x, gdzie x to dokładnie jeden znak, który może być dowolną wartością. Poniższy skrypt wybiera wszystkie filmy wydane w roku „200x”.
SELECT * FROM movies WHERE year_released LIKE '200_';
Wykonanie powyższego skryptu w MySQL Workbench i baza danych myflixdb dają nam wyniki pokazane poniżej.
| identyfikator_filmu | tytuł | dyrektor | rok_wydania | identyfikator_kategorii |
|---|---|---|---|---|
| 2 | Zapominając o Sarah Marshal | Nicholas Stoller | 2008 | 2 |
| 9 | Honey mooners | John Shultz | 2005 | 8 |
Zwróć uwagę, że zwracane są tylko filmy, których wartość parametru year_released wynosi 200, po której następuje dowolny pojedynczy znak. W przeciwieństwie do symbolu wieloznacznego procentowego, podkreślenie rezerwuje miejsce na jeden znak i nie więcej.
NIE PODOBA SIĘ do symboli wieloznacznych
Operatora logicznego NOT można używać razem z symbolami wieloznacznymi, aby zwracać wiersze, które nie nie dopasuj do określonego wzorca.
Załóżmy, że chcemy znaleźć filmy, które nie ukazały się w latach 200x. Łączymy operator logiczny NOT z symbolem wieloznacznym podkreślenia, jak pokazano poniżej.
SELECT * FROM movies WHERE year_released NOT LIKE '200_';
| identyfikator_filmu | tytuł | dyrektor | rok_wydania | identyfikator_kategorii |
|---|---|---|---|---|
| 1 | Piraci z Karaibów 4 | Rob Marshall | 2011 | 1 |
| 4 | Code Imię Czarny | Edgara Jimza | 2010 | NULL |
| 8 | Męt-Awakenwew | Michał Eal | 2012 | 6 |
Zwracane są tylko filmy, które nie spełniają wzorca 200x, ponieważ NOT odwraca wynik porównania z symbolem wieloznacznym. Należy pamiętać, że wiersze zawierające NULL wartości nie są nigdy zwracane przez LIKE lub NOT LIKE, ponieważ NULL jest nieznany, a nie nierówny.
Słowo kluczowe ESCAPE
Do tego używane jest słowo kluczowe ESCAPE znaki dopasowujące się do wzorca ucieczki takie jak procent (%) i podkreślenie (_), gdy stanowią część samych danych.
Załóżmy, że chcemy wyszukać ciąg literowy „67%”. Deklarujemy znak ucieczki i umieszczamy go bezpośrednio przed znakiem, który ma zostać odczytany jako dane.
LIKE '67#%%' ESCAPE '#';
Jeśli chcemy znaleźć film „67% Guilty”, możemy skorzystać ze skryptu pokazanego poniżej.
SELECT * FROM movies WHERE title LIKE '67#%%' ESCAPE '#';
Zwróć uwagę na podwójne „%%” w klauzuli LIKE. Pierwsze jest poprzedzone znakiem ucieczki (#) i dlatego jest traktowane jako część przeszukiwanego ciągu. Drugie zachowuje swoje znaczenie symbolu wieloznacznego i pasuje do dowolnej liczby następujących po nim znaków.
Rolę znaku ucieczki może pełnić dowolny znak, więc to samo zapytanie działa również ze znakiem równości.
SELECT * FROM movies WHERE title LIKE '67=%%' ESCAPE '=';
Symbole wieloznaczne bardzo dobrze ilustrują proste wzorce, ale niektóre wyszukiwania wymagają bardziej ekspresyjnych reguł. Poniższe porównanie pokazuje, gdzie leży granica.
MySQL Symbole wieloznaczne czy wyrażenia regularne: które należy stosować?
MySQL Obsługuje tylko dwa znaki wieloznaczne. Listy znaków, takie jak [ac], które niektóre inne silniki baz danych akceptują w LIKE, nie są obsługiwane. Gdy wyszukiwanie wymaga zakresów znaków, alternatyw lub zakotwiczenia, Operator REGEXP jest właściwym wyborem.
| Kryterium | LIKE z symbolami wieloznacznymi | REGEXP |
|---|---|---|
| Moc wzoru | Tylko dwa symbole: % i _ | Klasy znaków, zakresy, naprzemienność, powtarzanie |
| Typowe zastosowanie | Wyszukiwania prefiksu, sufiksu lub „zawiera” | Walidacja, dopasowanie złożone, wiele alternatyw |
| Wykorzystanie indeksu | Możliwe, gdy wzór nie zaczyna się od % | Nigdy nie używa indeksu |
| czytelność | Proste dla początkujących | Bardziej stroma krzywa uczenia się |
Z reguły najpierw należy sięgnąć po operator LIKE: jest łatwiejszy w odczycie i jako jedyny z dwóch może skorzystać z indeksu. Należy skorzystać z REGEXP, gdy pojedynczy wzorzec musi wyrażać kilka alternatyw, na przykład dopasowanie każdego tytułu zaczynającego się od cyfry. Oba operatory to porównania tylko do odczytu, więc żaden z nich nie zmienia wierszy zwracanych przez operator. INSERT or Aktualizacja instrukcji; filtrują one tylko to, co wybiera klauzula WHERE.

