Informacje o nowych artykułach oraz akcjach edukacyjnych prosto na Twojej skrzynce e-mail!

Przeszukiwanie danych za pomocą operatora LIKE oraz ich sortowanie w SQL

SQL sam w sobie za bardzo nie nadaje się do przeszukiwania tekstów (przy pomocy wbudowanych funkcji) ale na drobne potrzeby możemy wykorzystać operator LIKE w klauzuli WHERE, który wyszukuje tekst z danej kolumny pasujący do podanego wzorca. Po otrzymaniu już wyników wszystko oczywiście możemy odpowiednio posortować z poziomu zapytania. Sortowanie wykonujemy za pomocą operatora ORDER BY. Obie funkcje zostały dokładnie opisane poniżej…

Operator LIKE

Język SQL, umożliwia bardzo prostą metodę pobierania różnych danych na podstawie warunków logicznych. Co jednak zrobić gdy musimy pobrać rekord zawierający jakiś ciąg znaków? A co jeśli dana sekwencja musi występować w środku jakiegoś słowa? Na szczęście rozwiązanie tych problemów jest również bardzo proste, musimy zastosować tzw. klauzule „LIKE” języka SQL.

Pobierzmy z bazy rekord, który w kolumnie „Miasto”, zawiera ciąg znaków „kra”:

SELECT * FROM tabela WHERE miasto LIKE '%kra%';

Powyższe zapytanie pobiera z bazy wszystkie rekordy, w których wpisana treść w kolumnie „miasto” zawiera ciąg znaków „kra”. Ciąg ten może być na początku jakiegoś słowa lub na jego końcu oraz w środku czyli przed i za literami „kra” mogą znajdować się dowolne znaki. Umożliwia nam to znak „%”, który w języku SQL zastępuje dowolną literę lub cyfrę.

Pobierzmy z bazy informacje o pracownikach, których imię zaczyna się na literę „Ł”:

SELECT * FROM tabela WHERE imie LIKE 'Ł%';

Rozwiązanie tego problem było bardzo podobne do poprzedniego. Tutaj wystarczyło tylko dopisać po literze „Ł” znak %.

Pobierzmy z bazy informacje o pracownikach, których imię zaczyna się na literę z przedziału od „A” do „N”:

SELECT * FROM tabela WHERE imie REGEXP '^[A-N]';

Przedział liter ujęliśmy w nawiasy kwadratowe. Taką klasę znaków obsługuje w MySQL operator REGEXP (wyrażenia regularne), bo sam LIKE zna wyłącznie wieloznaczniki „%” i „_”.

Pobierzmy teraz informacje o pracownikach, których nazwisko zaczyna się na literę „D”, a trzecią literą jest litera „K”:

SELECT * FROM tabela WHERE nazwisko LIKE 'D_k%';

W zapytaniu tym został użyty znak „_”, który w MySQL zastępuje dokładnie jeden dowolny znak (znak „?” nie jest wieloznacznikiem operatora LIKE).

Pobierzmy teraz dane pracowników, których imię nie zaczyna się na literę „C”:

SELECT * FROM tabela WHERE imie NOT LIKE 'C%';

Operator NOT LIKE neguje wzorzec: powyższy warunek zwraca rekordy, w których wartość kolumny imie nie zaczyna się na literę „C” (znak „!” nie jest w MySQL wieloznacznikiem).

Pamiętaj: porównania LIKE w MySQL domyślnie nie rozróżniają dużych i małych liter. Decyduje o tym kolacja (collation) ustawiona dla kolumny.

Strony: 1 2

Spodobało się?

Jeśli tak, to zarejestruj się do newslettera aby otrzymywać informacje nowych artykułach oraz akcjach edukacyjnych. Gwarantuję 100% satysfakcji i żadnego spamowania!

, , , , , ,

Dodaj komentarz

Komentarze (12)

  • Julia pisze:

    A jakiego zapytania użyć jeśli chcemy imię, które na końcu nie ma litery a?

  • Marcin pisze:

    Hej,

    Uczę się dopiero, a jak np. wyszukać w kolumnie przy użyciu LIKE, że np. nie zawiera z 10 różnych warunków odnoszącyć się do tekstu? czyli not like 'zona’, 'brat’ itd…

    • Cześć Marcin,

      Aby osiągnąć zamierzony efekt należy użyć słówka kluczowego AND (i). Poniżej przedstawiam przykład takiej kwerendy:

      SELECT * FROM MyFamily WHERE Relationship NOT LIKE '%zona%' AND Relationship NOT LIKE '%brat%';

      Zwróci ona wszystkie rekordy tabeli MyFamily gdzie kolumna Relationship nie będzie zawierała ciągu znaków „zona” oraz „brat”.

      Pozdrawiam,
      Łukasz Dudziński, autor bloga StrefaKodera.pl

      PS: Zamiast AND (i) możesz użyć również OR (lub) – w zależności od tego w jaki sposób chcesz skonstruować warunek.

  • Wiktoria pisze:

    Jakiego zapytania użyć jeżeli chcemy wyszukać osobę, której nazwisko zaczyna się np na J a kończy na A?

  • rom pisze:

    Witam,

    jak napisać wykluczenie żeby nie zawiera ciąg znaków „kra” a wyświetlić wszystkie pozostałe?

  • Dominik pisze:

    Cześć, mam podobny problem co użytkownik wyżej
    „Hej,
    Uczę się dopiero, a jak np. wyszukać w kolumnie przy użyciu LIKE, że np. nie zawiera z 10 różnych warunków odnoszącyć się do tekstu? czyli not like 'zona’, 'brat’ itd…”

    Ale nie mam 10 tylko około 500-set takich warunków, czy jest sposób aby to wyszukać w szybszy sposób niż za każdym razem dodawać warunek or/and (w moim przypadku za każdym razem dodaje or) ?

    • Hej Dominik,

      Z tego, co piszesz, to wydaje mi się, że ktoś popełnił błąd, projektując bazę danych – tutaj warto byłoby sobie poczytać o takim pojęciu jak „postać normalna”.

      Jeśli natomiast chodzi o uproszczenie zapytania SQL, to potrzebowałbyś znaleźć jakiś wspólny „wzór” i takie warunki wykorzystać w klauzuli LIKE.

      Pozdrawiam,
      Łukasz Dudziński

      • arku pisze:

        A czy w przypadku dużej liczby warunków można zastosować słownik warunków/ wykluczeń w oddzielnej tabeli, która mogłaby być jakoś połączona z naszą tabelą źródłową? Przy tym ważne, by zachować możliwość stosowania znaków ? i %.

      • Hej Arku,

        Da się to zrobić. Musisz wykorzystać zmienne. Do zmiennej przypisujesz wartość zapytania SELECT, którym „wyciągasz” dany argument, a następnie wykorzystujesz to w klauzuli LIKE:

        SELECT * FROM Table WHERE Name LIKE = '%' + @myVariable + '%';

        Pozdrawiam,
        Łukasz Dudziński, autor bloga StrefaKodera.pl

Odpowiedz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Pin It on Pinterest