Kurs SQL #04: Sortowanie wierszy – klauzula ORDER BY

Umiesz już całkiem sprawnie wykonywać zapytania do bazy danych. W tym filtrować wiersze w celu precyzyjnego pozyskiwania informacji przy pomocy klauzuli WHERE i operatorów SQL. Tym razem Darmowy Kurs SQL pozwoli Ci dowiedzieć się jak sortować dane zwracane przez SELECT. Po tej lekcji będziesz znał możliwości klauzuli ORDER BY!

Jeżeli nie widziałeś jeszcze wpisu rozpoczynającego Darmowy Kurs SQL koniecznie zajrzyj tutaj: Kurs SQL #01: Wprowadzenie i środowisko

eBook Niezbędnik Administratora Baz Danych cover

Kolejność danych

Baza danych domyślnie zwraca wyniki zapytań w formie nieposortowanej. Jest to logiczne, baza nie wie po jakiej kolumnie ma posortować dane. System bazodanowy nie wie która z kolumn w bazie z perspektywy człowieka jest ważniejsza.

select cust_id, cust_first_name, cust_last_name, cust_year_of_birth
from sh.customers;
CUST_IDCUST_FIRST_NAMECUST_LAST_NAMECUST_YEAR_OF_BIRTH
49671AbigailRuddy1976
3228AbigailRuddy1964
6783AbigailRuddy1942
10338AbigailRuddy1977

Powyżej przykład kilku wierszy wybranych przy instrukcji SELECT z tabeli CUSTOMERS w schemacie SH. Logiczne jest sortowanie klientów po ich identyfikatorze, czyli CUST_ID, czego jak widać baza danych nie robi.


Tutaj mała dygresja. Jeżeli przerabiasz Darmowy Kurs SQL na środowisku Oracle Live SQL pewnie nie umknęło Twojej uwadze, że dane potrafią być zwracane już w formie posortowanej. Pomimo braku dodatkowych klauzul w zapytaniach. Jest to zachowanie specyficzne dla środowiska demonstracyjnego Oracle Live SQL. W tradycyjnej bazie danych wynik nie będzie posortowany po żadnej z kolumn.


Klauzula ORDER BY

Z pomocą przychodzi Nam klauzula ORDER BY. Użycie jej jest bardzo proste, wystarczy podać nazwę kolumny po której chcemy sortować dane.

select cust_id, cust_first_name, cust_last_name, cust_year_of_birth
from sh.customers
order by cust_id;
CUST_IDCUST_FIRST_NAMECUST_LAST_NAMECUST_YEAR_OF_BIRTH
1AbigailKessel1946
2AnneKoch1957
3BuickEmmerson1939
4FrankHardy1934

Powyższe zapytanie zwraca dane posortowane rosnąco po identyfikatorach klientów.

Sortowanie rosnące i malejące

Istnieje możliwość definiowania czy dane mają być posortowane rosnąco(ASC) czy malejąco(DESC). Domyślnie klauzula ORDER BY sortuje dane rosnąco. Co za tym idzie zapytanie które zaraz zobaczysz, zwróci dane w taki sam sposób jak poprzednie.

select cust_id, cust_first_name, cust_last_name, cust_year_of_birth
from sh.customers
order by cust_id asc;
CUST_IDCUST_FIRST_NAMECUST_LAST_NAMECUST_YEAR_OF_BIRTH
1AbigailKessel1946
2AnneKoch1957
3BuickEmmerson1939
4FrankHardy1934

No dobrze, zatem wiesz już że dodawanie ASC do klauzuli ORDER BY nie ma większego sensu, chyba że zależy nam na szczególnej przejrzystości pisanych zapytań. Przetestujmy zatem sortowanie malejące.

select cust_id, cust_first_name, cust_last_name, cust_year_of_birth
from sh.customers
order by cust_id desc;
CUST_IDCUST_FIRST_NAMECUST_LAST_NAMECUST_YEAR_OF_BIRTH
104500LaurenFenton1962
104499AlexiaAnderson1970
104498AbbieVenkayala1954
104497CassidyFenton1976

Jak widzisz tym razem na górze listy wierszy znajdują się te z CUST_ID o największych wartościach.

Sortowanie po wielu kolumnach

Język SQL pozwala sortować dane po kilku kolumnach jednocześnie. Osiągniemy to wymieniając po klauzuli ORDER BY kilka kolumn oddzielonych przecinkami.

select cust_id, cust_first_name, cust_last_name, cust_year_of_birth
from sh.customers
order by cust_first_name, cust_last_name;
CUST_IDCUST_FIRST_NAMECUST_LAST_NAMECUST_YEAR_OF_BIRTH
1060AaronKelley1963
104364AbbieAnderson1964
103317AbbieAnderson1944
103405AbbieAnderson1975
104253AbbieChin1973
103372AbbieChin1934
103620AbbieChin1986
103310AbbieChin1974
103208AbbieChin1976
103699AbbieChin1969
104404AbbieChin1947
103352AbbieFenton1971
104333AbbieHaus1937
104123AbbieKerry1975

Tym razem posortowałem klientów po ich imionach(CUST_FIRST_NAME), a następnie po ich nazwiskach(CUST_LAST_NAME). W obydwu przypadkach oczywiście ma miejsce sortowanie rosnące, które dla tekstu oznacza nic innego jak sortowanie alfabetyczne.

Sortowanie na kilku kolumnach sortuje wiersze po pierwszej kolumnie wymienionej po ORDER BY, a następnie(w przypadku wystąpienia wielu wierszy o takiej samej wartości wspomnianej wcześniej kolumny)sortuje je po drugiej kolumnie wymienionej po ORDER BY. Jeżeli w ORDER BY mamy wymienione jeszcze więcej kolumn, schemat powtarza się.

Używanie pozycji kolumny w klauzuli ORDER BY

Wymienianie kolumn w klauzuli ORDER BY może być męczące. Dlatego też język SQL przewiduje dodatkową możliwość wskazywania po których kolumnach sortować. Zamiast odwoływać się do ich nazw, można wykorzystać numer pozycji kolumny w instrukcji SELECT. Poniższe zapytanie będzie równoznaczne z poprzednim.

select cust_id, cust_first_name, cust_last_name, cust_year_of_birth
from sh.customers
order by 2, 3;

CUST_IDCUST_FIRST_NAMECUST_LAST_NAMECUST_YEAR_OF_BIRTH
1060AaronKelley1963
104364AbbieAnderson1964
103317AbbieAnderson1944
103405AbbieAnderson1975
104253AbbieChin1973
103372AbbieChin1934
103620AbbieChin1986
103310AbbieChin1974
103208AbbieChin1976
103699AbbieChin1969
104404AbbieChin1947
103352AbbieFenton1971
104333AbbieHaus1937
104123AbbieKerry1975
103064AbbieKerry1967
103517AbbieKerry1974

Oczywiście przy takim podejściu również możemy stosować ASC i DESC do wybierania sortowania rosnącego lub malejącego.

W kolejnej części Darmowego Kursu SQL przyjrzymy się bliżej wartości NULL.


Piąta część kursu już dostępna! Kurs SQL #05: Wartość NULL i Three-Valued Logic