Wskaż zapytanie, w którym dane zostały posortowane.
A.
SELECT imie, nazwisko FROM mieszkancy WHERE wiek > 18 ORDER BY wiek;
B.
SELECT nazwisko FROM firma WHERE pensja > 2000 LIMIT 10;
C.
SELECT DISTINCT produkt, cena FROM artykuly;
D.
SELECT AVG(ocena) FROM uczniowie WHERE klasa = 2;
Pytanie z egzaminu CKE, styczeń 2020 (arkusz EE.09-SG-20.01).
W tym zapytaniu dane zostały posortowane, bo użyto klauzuli ORDER BY wiek. W SQL właśnie ORDER BY odpowiada za ustalenie kolejności rekordów w wyniku zapytania. Fragment SELECT imie, nazwisko FROM mieszkancy WHERE wiek > 18 ORDER BY wiek; oznacza: wybierz imię i nazwisko mieszkańców, ale tylko tych, których wiek jest większy niż 18, a potem uporządkuj wynik według kolumny wiek. Jeśli nie podamy ASC albo DESC, większość systemów baz danych przyjmuje domyślnie sortowanie rosnące, czyli od najmłodszych do najstarszych. W praktyce warto pisać jawnie ORDER BY wiek ASC albo ORDER BY wiek DESC, bo kod jest wtedy czytelniejszy dla innych osób. Moim zdaniem to jedna z tych rzeczy w SQL, które naprawdę często się przydają: lista produktów od najtańszych, uczniowie według nazwiska, faktury od najnowszej daty. Dobra praktyka to też dodanie drugiego kryterium, np. ORDER BY wiek ASC, nazwisko ASC, gdy kilka osób ma ten sam wiek. Wtedy wynik jest bardziej przewidywalny, a przy większych tabelach można jeszcze pomyśleć o indeksie na kolumnie używanej do sortowania.
W pozostałych zapytaniach mogą występować operacje na danych, ale nie ma tam sortowania w sensie SQL. Trzeba tu odróżnić kilka pojęć, bo w testach łatwo się na tym złapać. DISTINCT usuwa duplikaty w wyniku, czyli sprawia, że powtarzające się kombinacje wartości nie pojawią się kilka razy. To nie znaczy jednak, że baza ułoży rekordy alfabetycznie albo według ceny. Czasami wynik wygląda jak posortowany, bo silnik bazy tak akurat wykonał zapytanie, ale nie wolno na tym polegać. Standardowa i bezpieczna zasada jest prosta: bez ORDER BY kolejność wyniku nie jest gwarantowana. AVG(ocena) to funkcja agregująca, która liczy średnią wartość z kolumny ocena, a warunek WHERE klasa = 2 tylko ogranicza rekordy brane do obliczeń. To jest filtrowanie i agregacja, nie porządkowanie danych. Podobnie LIMIT 10 nie sortuje rekordów, tylko ogranicza liczbę zwróconych wierszy. Bez ORDER BY takie 10 rekordów może być po prostu dowolnym fragmentem wyniku, zależnym od planu wykonania, indeksów albo aktualnego stanu tabeli. Typowy błąd myślowy polega na tym, że ktoś kojarzy uporządkowany wygląd tabeli w programie z rzeczywistym sortowaniem zapytania. W bazach danych trzeba to zapisać jawnie: ORDER BY nazwa_kolumny, ewentualnie z ASC lub DESC. Dopiero wtedy mówimy o kontrolowanym sortowaniu wyniku.