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:

select-order-by

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:

select-order-by2

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:

select-all

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:

select-distinct

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:

select-distinct2

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:

select-sum

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:

select-count

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:

select-max

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:

select-count2

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:

select-avg

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.

Dodaj komentarz