Porządkowanie wyników z wykorzystaniem ORDER BY i TOP

 

Artykuł ten jest częścią serii Od 0 do TSQL, którą znajdziesz tutaj.

W ostatnim artykule rozszerzyliśmy sobie wiedzę na temat filtrowania przy pomocy klauzuli WHERE oraz predykatów logicznych, słów kluczowych BETWEEN oraz LIKE. Jednak za każdym razem gdy dostawaliśmy określone dane w rezultacie nie były one w żaden sposób uporządkowane. Niejednokrotnie otrzymany rezultat może wydawać się uporządkowany lecz możemy to traktować jako przypadek, gdyż aby mieć pewność co do porządku danych w zwracanym rezultacie musimy użyć specjalnej klauzuli tj. ORDER BY, która będzie tematem niniejszej publikacji.

Tak więc klauzula ORDER BY służy do porządkowania danych w ramach określonego zapytania. Podstawowa składnia z użyciem ORDER BY została przedstawiona poniżej.

Jak można zauważyć w ramach ORDER BY definiujemy pola po których chcemy sortować nasz rezultat. O kierunku sortowania decyduje słowo kluczowe ASC oznaczające kierunek rosnący oraz DESC oznaczające kierunek malejący. Definicja kierunku porządkowania jest opcjonalna – w momencie gdy ich nie podamy dane porządkowane są rosnąco. Zobrazujemy te możliwości wykorzystując standardowo tabelę Employees w bazie Northwind.

W rezultacie otrzymamy uporządkowany zestaw po nazwisku. Ten sam efekt otrzymalibyśmy bez użycia słowa kluczowego ASC, warto jednak stosować ASC i DESC dla przejrzystości stosowanego kodu.

Result

Co jeżeli chcemy sortować po więcej niż jednej kolumnie? Oczywiście jest to możliwe – posortujemy  dane malejąco po stanowisku, a następnie rosnąco po Nazwisku.

Result

Jak widać porządkowanie po kilku kolumnach jest bardzo proste. Jednak powyższe przykłady nie wyczerpują możliwości ORDER BY. Istotne jest to, że w ramach ORDER BY (w przeciwieństwie do sekcji WHERE) możemy używać aliasów, które nadaliśmy w sekcji SELECT. Tak więc podążając tym tokiem myślenia spójrzmy na poniższy przykład – jak widać, mimo użycia aliasu rezultat jest prawidłowy.

Result

Używanie aliasów w ORDER BY jest możliwe ze względu na fakt, iż klauzula ta jest wykonywana po klauzuli SELECT, a więc po nadaniu polom aliasów.

Z omawianą sekcją zapytania związany jest jeszcze jeden fakt, otóż zamiast jawnie używać nazw pól lub aliasów, możemy podać numer kolumny po której chcemy porządkować.

Result

Używanie numerów kolumn jest jednak czymś czego powinniśmy unikać podobnie jak używanie SELECT *. Dopuszczalne jest użycie numerów kolumn w ORDER BY podczas testowania zapytań lub np. podczas zapytań ad-hoc kierowanych do bazy.

Drugim słowem kluczowym opisywanym w ramach dzisiejszego artykułu jest słowo TOP.  Jest ono powiązane z ORDER BY i służy limitowaniu rezultatu. Limitowanie to polega na posortowaniu danych według określonych warunków i wybranie pierwszych N rekordów. Dla lepszego zrozumienia zobrazujmy to określonym przykładem w którym użyjemy tabeli Produktów.

Powyższe zapytanie zwróci 11 produktów o najwyższych cenach. SQL Server wykonując powyższe zapytanie najpierw uporządkował cały zestaw danych sortując go malejąco po cenie, a następnie wybrał pierwsze 11 rekordów.

Result

Zwróćcie uwagę, iż limitowanie rezultatu według warunku sortowania jest bardzo proste w implementacji. Co natomiast jeżeli kolejne rekordy nie uwzględnione w finalnym rezultacie mają te samą cenę co produkt o identyfikatorze 27? Możemy również zawrzeć je w rezultacie dodając do klauzuli TOP słowa kluczowe WITH TIES tak jak zostało to pokazane poniżej:

dzięki temu nasz rezultat uwzględnia 11 produktów o najwyższej cenie, a jeżeli są jeszcze inne produkty, które posiadają tę samą cenę co produkt na miejscu 11 to one również zostaną dodane do rezultatu.

Result

Możecie zauważyć, iż zapytanie odwoływało się do 11 produktów to rezultat zawiera ich 12 ze względu na to, iż produkt na miejscu 12 ma tą samą cenę co produkt na miejscu 11.

Zdarza się, że nie chcemy zwrócić określonej liczby wierszy, a procent wierszy całej tabeli. Na przykład załóżmy, że nie znamy liczby wierszy w tabeli Produktów, a chcemy zwrócić 10 procent najdroższych produktów. Możemy to osiągnąć używając klauzuli TOP 10 PERCENT tak jak zostało to przedstawione poniżej:

Result

Oczywiście używając TOP n PERCENT możemy również dodać WITH TIES aby rozszerzyć rezultat o rekordy zawierające tę samą cenę co rekord ostatni na liście. Mam nadzieję, że niniejszy artykuł przybliżył Wam mechanizm porządkowania rezultatów i ich limitowania za pomocą słów kluczowych ORDER BY i TOP. W następnym epizodzie zajmiemy się słowami kluczowymi CASE oraz IIF – Zapraszam!

Spis dostępnych artykułów w ramach sesji znajdziesz tutaj.

Adrian Chodkowski
Follow me

Adrian Chodkowski

SQL geek, Data enthusiast, Consultant & Developer
Adrian Chodkowski
Follow me

Latest posts by Adrian Chodkowski (see all)

Leave a Comment

Your email address will not be published. Required fields are marked *