Przeszukiwanie danych za pomocą operatora LIKE oraz ich sortowanie w SQL
Sortowanie (ORDER BY)
Pobrane za pomocą zapytania SELECT
dane można oczywiście posortować według zawartości dowolnej kolumny. Warto tutaj zwrócić uwagę iż mamy dwie możliwości sortowania:
Sortowanie | Opis |
ASC | Sortowanie od elementu najmniejszego do największego (domyślnie) |
DESC | Sortowanie od elementu największego do najmniejszego |
Weźmy przykładową tabelę (klienci
):
Id | Imie | Nazwisko |
1 | Jan | Kowalski |
3 | Maciej | Maciejewski |
2 | Tomasz | Nowak |
4 | Marta | Nowak |
5 | Michał | Gadulski |
Jak widać kolumna Id
nie jest w ogóle posortowana. Posortujmy więc ją w sposób domyślny (ASC
):
SELECT * FROM klienci ORDER BY Id;
to zapytanie jest równoważne temu:
SELECT * FROM klienci ORDER BY Id ASC;
Efekt:
Id | Imie | Nazwisko |
1 | Jan | Kowalski |
2 | Tomasz | Nowak |
3 | Maciej | Maciejewski |
4 | Marta | Nowak |
5 | Michał | Gadulski |
Sortowanie od największego do najmniejszego:
SELECT * FROM klienci ORDER BY Id DESC;
Efekt:
Id | Imie | Nazwisko |
5 | Michał | Gadulski |
4 | Marta | Nowak |
3 | Maciej | Maciejewski |
2 | Tomasz | Nowak |
1 | Jan | Kowalski |
Należy pamiętać, że zgodnie ze schematem podanym w artykule „Podstawowa wersja zapytania SELECT w SQL (SELECT … FROM … WHERE …)” klauzulę ORDER BY
umieszczamy na końcu zapytania SQL.
Strony: 1 2
Przy tworzeniu kwerend należy pamiętać, że język SQL nie rozróżnia dużych i małych liter – taka informacja może wprowadzić w błąd początkujących.
Owszem nie rozróżnia ale tylko dla poleceń oraz tabel, kolum, aliasów etc.
Natomiast rozróżnia dla samych danych w zależności od ustawienia Collation!
A jakiego zapytania użyć jeśli chcemy imię, które na końcu nie ma litery a?
Hej Julia,
Musisz tutaj wykorzystać operator NOT.
Przykład:
SELECT * FROM Tabela WHERE Imie NOT LIKE '%a’;
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 kolumnaRelationship
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.Jakiego zapytania użyć jeżeli chcemy wyszukać osobę, której nazwisko zaczyna się np na J a kończy na A?
Cześć Wiktoria,
Po prostu:
LIKE 'J%A'
Pozdrawiam,
Łukasz
Witam,
jak napisać wykluczenie żeby nie zawiera ciąg znaków „kra” a wyświetlić wszystkie pozostałe?
Hej rom!
Wykorzystaj
not
:SELECT * FROM tabela WHERE miasto NOT LIKE ‘%kra%’;
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
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ść zapytaniaSELECT
, którym „wyciągasz” dany argument, a następnie wykorzystujesz to w klauzuliLIKE
:SELECT * FROM Table WHERE Name LIKE = '%' + @myVariable + '%';
Pozdrawiam,
Łukasz Dudziński, autor bloga StrefaKodera.pl
Cześć,
mam taki problem, chciałbym wyfiltrować np tylko nazwiska zaczynające się od samogłosek. Czy w takim wypadku za kazdym razem musze robić tak?
nazwisko like 'e%’
or nazwisko like 'u%’ itp?
Próbowałem użyć nazwisko like '[aeiou]%’ ale to niestety nie działa
Da się jakoś zapisać to krócej?
Pozdrawiam,
Cześć Darek,
Dlaczego
LIKE '[AEIOU]%'
nie działa? Według moich testów, to powinno zadziałać, jak oczekujesz. Pamiętaj, że wielkość liter ma znaczenie.Łukasz Dudziński, autor bloga StrefaKodera.pl