Klauzula ORDER BY wykorzystywana jest w celu lepszej czytelności otrzymywanych wyników. Dzięki niej możemy sortować dane według dowolnej kolumny lub wyrażenia znajdującego się na liście wyboru. Wszystkie sortowania możemy przeprowadzać w porządku rosnącym lub malejącym.
Każde sortowanie zależy od zbioru znaków i porządku sortowania.
Zbiorem znaków nazywamy listę liter i znaków specjalnych oraz ich wewnętrzne odwzorowanie na kod komputerowy. W zbiorach znaków mogą znajdować się znaki spoza alfabetu angielskiego i mogą one obejmować kombinacje tych znaków.
Porządek sortowania wyznacza porządek znaków. Może on określać kiedy wielkie litery mają pierwszeństwo przed małymi lub kiedy możemy traktować je równoznacznie.
Częstą przypadłością danych wybieranych z bazy danych jest to że są on wyświetlane w takiej kolejności w jakiej zostały wpisane lub całkowicie losowej. Takie dane jest nam trudno poddać analizie, gdyż nie mają one żadnego określonego porządku. Klienci wypisani w kolejności numerów Id klienta, nie pomaga nam w zrozumieniu wyników. Lista klientów będzie nam bardziej pomocna jeżeli wszystkie nazwiska będą uporządkowane alfabetycznie.
SELECT id_klienta, nazwisko, imie, miasto, ulica, telefon
FROM klienci
Order by nazwisko
Wynik:
Takie zapytanie pozwala na wypisanie klientów w kolejności alfabetycznej.
Sortowanie malejące lub rosnące
W przypadku każdego sortowania możemy ustalić sobie kierunek sortowania- z dołu do góry lub z góry do dołu. Służą do tego słowa kluczowe ASC (rosnąco) oraz DESC (malejąco) które umieszczamy bezpośrednio po elemencie sortowania. Domyślne sortowanie jest przeprowadzane w porządku rosnącym i wykonywane jest aż do pojawienia się DESC, która oznacza, że nie chcemy już używać ASC. Słowo kluczowe ASC w zapytaniu nie jest konieczne chyba, że chcemy zaznaczyć jaki jest przyjęty kierunek sortowania.
SELECT nr rejestracyjny, marka, model, pojemnosc cm3, moc km
FROM samochody
ORDER BY moc km desc
Wynik:
Zapytanie przedstawia samochody posortowane malejąca pod względem mocy.
Eliminowanie powtarzających się wierszy
Użycie słów kluczowych DISTINSCT i ALL na liście wyboru pozwala na określenie w jaki sposób mamy postępować z wierszami które się powtarzają. ALL wyszukuje wszystkie wiersze spełniające warunki zapytania i jest wartością domyślna. Zaś DISTINCT wyszukuje tylko wartości nie powtarzające się.
SELECT all rok produkcji
FROM samochody
Wynik:
Patrząc na wyniki możemy zaobserwować, że pojawiają się powtórzenia. Możemy je wszystkie wyeliminować stosując DISTINCT.
SELECT distinct rok produkcji
FROM samochody
Wynik:
Spoglądając na wyniki widzimy, że 3 wiersze zostały nie wyświetlone, ponieważ były to powtórzenia.
Składnia DISTINSCT
Wartość domyślna to ALL, chyba że w sposób jawny określimy ja jako DISTINCT.
SELECT (distinct | ALL) lista wyboru
Możemy zauważyć, że DISTINCT i ALL występuje na liście wyboru tylko raz i musi być jako pierwsze słowo zawarte na tej liście.
Używanie DISTINCT
Jeżeli na liście wyboru zawieramy więcej niż jeden element, wtedy DISTINCT spowoduje wyszukanie tylko tych wierszy, dla których kombinacja elementów jest jedyna.
SELECT distinct marka, paliwo
FROM samochody
Order by marka
Wynik:
Funkcje agregujące
Agregaty są to funkcje które pozwalają na otrzymanie wartości sumarycznych. Używa się ich do zbiorów wierszy które określamy w klauzuli WHERE lub grup wierszy wybranych przez klauzulę GROUP BY. Niezależnie jaką strukturę nadamy wybranym zbiorom, dla każdego zbioru wierszy otrzymamy pojedynczą wartość.
SELECT sum(moc km)as suma KM
FROM samochody
Wynik:
Zapytanie oblicza całkowitą ilość koni mechanicznych samochodów które posiadamy w naszej bazie danych. Zsumowane są wszystkie wiersze w jeden. Wynikowi możemy nadać nagłówek za pomocą aliasu „as”. Język SQL nie pozwala nam na mieszanie wyników „rekord po rekordzie” z wynikiem dla zbioru. Lista wyboru musi zawierać wszystkie kolumny i wyrażenia lub wszystkie wartości zbiorowe. Lecz wyjątkiem jest grupowanie kolumna za pomocą klauzuli GROUP BY.
Składnia funkcji agregującej
Agregaty są jednocześnie funkcjami, dlatego zawsze zawierają jakiś argument, które jest zawarte w nawiasach.
Składnia funkcji agregującej:
Funkcja agregująca ([distinct] wyrażenie)
DISTINCT możemy używać z dowolną funkcja agregującą prócz COUNT(*). Wyrażenie w definicji składni funkcji agregującej przeważnie jest nazwą kolumny, lecz może być także stałą, funkcją bądź dowolnym zestawieniem nazw kolumn, stałych i funkcji złączonych operatorami arytmetycznymi.
Funkcje agregujące:
SUM([DISTINCT] wyrażenie) – funkcja oblicza sumę wartości wyrażeń dla wszystkich wierszy w wyrażeniu numerycznym.
AVG([DISTINCT] wyrażenie) – funkcja oblicza wartość średnią wartość wyrażenia dla wszystkich wierszy w wyrażeniu numerycznym.
COUT([DISTINCT] wyrażenie) – funkcja zwraca ilość wierszy różniących się od null w wyrażeniu.
COUT (*) – liczba wszystkich wierszy w tabeli.
MAX(wyrażenie) – maksymalna wartość wyrażenia.
MIN(wyrażenie) – minimalna wartość wyrażenia.
COUNT oraz COUNT (*)
Mogło by się wydawać, że funkcje bardzo podobne, lecz w rzeczywistości jest zupełnie inaczej. COUNT pobiera argument następnie wyszukuje wszystkie wyrażenia różne od null. Natomiast COUNT (*) sumuje wszystkie wyrażenia nie zwracając uwagi na to czy kolumna zawiera wartość null czy też nie.
SELECT count (pesel), count(*)
FROM klienci
Wynik:
Powyższe zapytanie przedstawia tę różnicę. Wyniki przedstawione przez te dwie funkcje są zupełnie różne, ponieważ w tabeli klienci w kolumnie pesel jest zawarta wartość null. Użycie takiej funkcji będzie nam przydatne kiedy będziemy chcieli sprawdzić czy w jakiejś kolumnie zawarte są wartości null.
Agregaty oraz typy danych
Funkcje agregujące SUM i AVG działają tylko z danymi liczbowymi, zaś MAX, MIN, COUNT i COUNT(*) możemy używać ze wszystkimi typami danych.
SELECT max(nazwisko)
FROM klienci
Wynik:
W taki sposób możemy znaleźć największą wartość. W przypadku danych typu char wyszukujemy nazwiska najdalej w alfabecie. W takiego typu danych znalezienie średniej wartości wszystkich nazwisk oraz ich sumowanie jest bezsensowne.
Agregowanie oraz DISTINCT
DISTUNCT możemy używać z typami danych takimi jak SUM, AVG, COUNT, MAX i MIN. Użycie DISTINCT powoduje usunięcie powtarzających się wartości, zanim zostanie wykonane obliczenie sumy, obliczenie średniej, lub zliczenie wartości.
SELECT count(distinct marka)
FROM samochody
Wynik:
Zapytanie wyszukuje wszystkie niepowtarzające się wartości oraz nie zawierające wartości null.
DISTINCT w ogóle nie zadziała nam z COUNT(*). Dzieje się tak ponieważ COUNT (*) zawsze zwraca tylko jedną wartość, dlatego nie ma znaczenia czy użyjemy DISTINCT.
Podsumowując na liście wyboru można użyć DISTINCT tylko jeden raz. Jeżeli nie stosujemy argumentowania, to DISTINCT odnosi się wtedy do listy wyboru jako całości, a nie do pojedynczych kolumn zawartych na liście wyboru. Jeśli jednak stosujemy agregowanie, to ograniczenie do pojawienia się DISTINCT na liście wyboru może doprowadzić do pewnych nieporozumień. Ponieważ jeżeli w wierszu który przykładowo będziemy chcieli zsumować lub zliczyć będą występować jakiś powtórzenia to zostaną one odrzucone i taki wynik może już być bezużyteczny.
Funkcje agregujące oraz WHERE
Funkcji agregujących możemy używać tak jak w poprzednich przykładach na liście wyboru. Jednak w klauzuli WHERE używanie funkcji agregujących jest niedozwolone, jeśli jednak będziemy chcieli użyć takich funkcji zostanie zgłoszony nam błąd. Możemy jednak zastosować klauzulę WHERE do ograniczenia wierszy wykorzystywanych do obliczeń agregujących.
SELECT avg(pojemnosc cm3),sum(moc km)
FROM samochody
where rodzaj paliwa= ‚benzyna’
Wynik:
Zapytanie przedstawia średnią pojemność i całkowitą moc silników benzynowych dla wszystkich samochodów. W pierwszej kolejności wyszukiwane są ograniczenia klauzuli WHERE , która znajduje wszystkie samochody z silnikami benzynowymi. Następnie wykonywane są funkcje które dokonują obliczeń w odnalezionych wierszach.