SQL WHERE | SQL GROUP BY – filtrowanie i grupowanie w bazie danych ‍

1 marca 2021

SQL WHERE SQL GROUP BY

➡️ SQL WHERE | SQL GROUP BY – Po co to jest

Jeżeli pracujesz z bazą danych to z pewnością googlowałeś już takie zwroty jak SQL WHERE czy SQL GROUP BY. Ten artykuł jest po to, byś już tego nie musiał więcej robić. Wytłumaczę Ci tu jak to działa. Razem i osobno. A jeżeli ten temat wydaje się trochę zaawansowany, to spróbuj na początku ogarnąć SELECT * FROM table – czyli podstawy SQL.

📺 WERSJA DO OGLĄDANIA 📺

➡️ Jak wygląda tabela

Zanim zaczniemy się bawić w grupowanie albo filtrowanie danych, zerkniemy sobie na całą tabelę. No nawet nie trzeba całej, powiedzmy 100 pierwszych rzędów.

SELECT * from ORDERS LIMIT 100;

Rezultat:

table sample

No tabela, jak tabela. Ale widzimy że niektóre wartości się powtarzają, np. (city). Widzimy, że są kolumny z datami (order_date). Super, użyjemy tych kolumn do naszych ćwiczeń.

➡️ Jak działa WHERE?

No dobrze, przejdźmy do takiego przykładu.

select *
from orders 
where city = 'Houston';

Rezultat:

sql where example 1

Patrząc na całą tabelę, SQL szedł sobie jeden po drugim i patrzył czy city = 'Houston' czy nie? Jeśli tak – weźmiemy ten rząd (czyli „rekord” jak to się mówi), a resztę olewamy. Jak już SQL przejdzie przez całą tabelę – to wyświetli Ci tylko te rzędy, które spełniły warunek.

Przejdźmy do bardziej złożonego przykładu

Spójrzmy na ten fragment kodu.

select * 
from orders 
where
    city = 'Houston'
and segment = 'Consumer'
and 
    (
    order_date between date('2013-06-01') and date('2013-10-01')
    or
    order_date between date('2013-12-10') and date('2013-12-30')
    );

Rezultat:

sql where example 2

Tym razem SQL będzie brał rekordy z tabeli, każdy rząd, jeśli ma być wzięty pod uwagę, będzie musiał spełnić 3 warunki:

  1. city = 'Houston' – tak jak poprzednio (fioletowa ramka)
  2. segment = 'Consumer' – podobne do powyższego tylko tym razem inna kolumna (zielona ramka)
  3. order_date mieszący się w jednym z okienek – albo pomiędzy czerwcem a październikiem albo te 20 dni w grudniu (pomarańczowa / czerwona ramka)

Wszystkie te warunki, które mają bezpośrednio przed sobą WHERE lub AND muszą być spełnione. Jeżeli używamy słówka OR to dajemy sql’owi wybór.

Kiedy używamy nawiasów – to działa to tak jak w matematyce. Po prostu upewniamy się, że kolejność działań i ilość warunków będzie taka jak chcemy.

Warto przy okazji pamiętać o czytelnych wcięciach w kodzie SQL i ustawianiu odpowiednich punktów od jednej linii. Po prostu łatwiej się to czyta.

A zatem – wszystkie te 3 warunki (jeden z dwoma opcjami) muszą być spełnione, by dany rzęd został wyświetlony. Trudno się dziwić, że wyników jest o wiele mniej.

➡️ Jak działa GROUP BY?

No dobrze – pora spojrzeć GROUP BY

select 
    city
    ,sum(sales)         as total_sales
    ,max(profit)        as max_profit
    ,min(order_date)    as first_order
from orders 
group by city;

Magia GROUP BY polega na tym, że dzielimy nasze dane na kategorie i dodajemy im jakieś obliczenia, np. dla miasta: łączna sprzedaż, maksymalny profit, pierwsze zamówienie. Mówi się, że w ten sposób „agregujemy” sobie dane.

Agregować to dziwne słowo – nie wiadomo o co chodzi. Po prostu trzeba kojarzyć, że GROUP BY to podzielenie danych na kategorie i razem z tym kategoriami idą obliczenia, które każdej kategorii dodajemy.

Kiedy tworzymy z jakiejś kolumny (tak jak tutaj z city) to trzeba pamiętać, że musimy to wpisać zarówno w części select, jak i group by.

Inny przykład z użyciem GROUP BY
select 
    city
    ,segment
    ,avg(profit)
from orders
group by 1, 2;

Pojawiają nam się 2 nowe rzeczy.

Po pierwsze, bierzemy kombinację dwóch kategorii – city i segment. Innymi słowy dzielimy jedną kategorie, na mniejsze. Oczywiście, jeżeli w danym mieście jest tylko jeden segment – to tylko ta jedna podkategoria się pojawi. Tak jak w przypadku Aberdeen czy Abilene – jedyny dostępny segment to „Consumer”. Taki Akron będzie miał już 3 opcje, bo wystąpiły takie rekordy gdzie city = Akron, a, dla przykładu, segment = „Corporate”.

Druga nowa rzecz to te numerki po group by (1, 2). O co chodzi w ogóle? To tylko zwykłe uproszczenie. Oznacza dosłownie grupuj po pierwszej kolumnie, drugiej kolumnie. Zamiast pisać group by city, segment można właśnie napisać tylko odniesienie, o które kolumny nam chodzi. SQL to ogarnie

➡️ GROUP BY i WHERE razem – jak to działa?

Brawo! Jeżeli bierzesz się za ten akapit, to znaczy że ogarniasz już WHERE i GROUP BY. Pora je połączyć.

select 
    city
    ,segment
    ,avg(profit)
from orders
where ship_mode = 'First Class'
group by 1, 2;

Co my tu mamy?

Oprócz GROUP BY zrobionego po dwóch kolumnach, mamy dołożony warunek w WHERE. Co robi w tym przypadku SQL? Najpierw idzie sobie rekord po rekordzie i sprawdza czy ship_mode = 'First Class'. Zapamiętuje te rzędy, w których tak było. I DOPIERO PO PRZEFILTROWANIU PRZEZ WHERE stosuje GROUP BY. Zauważ, że to kolumna, której użyliśmy do filtrowania (ship_mode), nie jest w ogóle używana przez GROUP BY. Nie musi być. Te dwie operacje dzieją się niezależnie.

W skrócie: najpierw jest WHERE, a potem dopiero jest GROUP BY.

Darmowe pliki do pobrania

Przykłady kodu do pobrania z GitHub.

SQL WHERE | SQL GROUP BY | Podsumowanie

Zawsze dobrze zacząć od podglądu całej tabeli.

Komenda WHERE służy do filtrowania danych w źródłowej tabeli. Może być jeden warunek, może być kilka. Jeżeli używamy kilka, mieszając przy okazji AND i OR to warto się posługiwać nawiasami.

Komenda GROUP BY dzieli naszą tabelę na wybrane kategorie, w zależności od wskazanych kolumn. Należy pamiętać, że te kolumny muszą się pojawić zarówno w sekcji SELECT jak i po zwrocie GROUP BY (choć tu już możemy użyć skrótu typu group by 1, 2). Tym kategoriom przypisujemy później obliczenia np. całkowitą sprzedać (sum(sales)), czy średni zysk (avg(profit)).

Mam nadzieję, że googlowanie fraz sql group by i sql where nie będzie już potrzebne

A jeżeli chcesz się pouczyć czegoś trudniejszego z SQLa, obczaj funkcję LAG().

To tyle w tym temacie. Analizujcie w pokoju!  

Podobał Ci się ten artykuł?
Podziel się nim w Social Mediach:
>>> udostępnij go na LinkedIn i pokaż, że codziennie uczysz się czegoś nowego 
>>> wrzuć go na Facebooka, to się może przydać któremuś z Twoich znajomych 
>>> Przypnij sobie tą stronkę to zakładek, może się przydać w przyszłości

Inne ciekawe artykuły:

Wolisz oglądać niż czytać – nie ma problemu
>>> Obserwuj i oglądaj KajoData na YouTube

A jeśli chcesz się dowiedzieć czegoś więcej o SQL – zajrzyj tutaj.

Ja Ci ją z przyjemnością wyślę. Za darmo. Bez spamu.

Poradnik Początkującego Analityka

Video - jak szukać pracy w IT

Regularne dawki darmowej wiedzy, bez spamu.