database mysql

Funkcje agregujące w SQL: SUM, DISTINCT, GROUP BY – Kompletny przewodnik z przykładami

SQL (Structured Query Language) to język używany do zarządzania danymi w relacyjnych bazach danych. Funkcje agregujące, takie jak SUM, DISTINCT i grupowanie za pomocą GROUP BY, są nieodzownymi narzędziami w analizie danych. W tym artykule omówimy ich zastosowanie na przykładach z bazy danych zawierającej informacje o użytkownikach, zamówieniach i produktach.

Czym są funkcje agregujące w SQL?

Funkcje agregujące wykonują obliczenia na zbiorach danych, zwracając jedną wartość dla całej grupy. Najczęściej używane funkcje agregujące to:

  • SUM: Suma wartości w kolumnie.
  • DISTINCT: Eliminacja duplikatów w wynikach.
  • GROUP BY: Grupowanie danych na podstawie jednej lub więcej kolumn.

Przykłady z bazy danych

Przykład 1: Obliczanie łącznej wartości zamówień (SUM)

Funkcja SUM umożliwia zsumowanie wartości w kolumnie, np. całkowitej liczby zamówionych produktów lub ich wartości. Załóżmy, że mamy tabelę Szczegoly_Zamowienia, która przechowuje informacje o liczbie zamówionych produktów oraz ich cenach.

SELECT
ID_Zamowienia,
SUM(Ilosc * Cena_Netto) AS Laczna_Wartosc
FROM
Szczegoly_Zamowienia
INNER JOIN
Magazyn ON Szczegoly_Zamowienia.ID_Produktu = Magazyn.ID_Produktu
GROUP BY
ID_Zamowienia;

Wyjaśnienie:

  • Ilosc * Cena_Netto: Oblicza wartość zamówienia dla każdego produktu.
  • SUM: Sumuje wartości produktów w ramach jednego zamówienia.
  • GROUP BY: Grupuje wyniki według identyfikatora zamówienia.

Przykład 2: Eliminacja duplikatów (DISTINCT)

Funkcja DISTINCT jest używana, gdy chcemy wyświetlić unikalne wartości w kolumnie. Na przykład, aby zobaczyć, z których miast pochodzą nasi klienci.

SELECT DISTINCT Miasto FROM Uzytkownicy;

Wyjaśnienie:

  • DISTINCT: Usuwa duplikaty, wyświetlając każde miasto tylko raz.

Przykład 3: Liczenie liczby zamówień na użytkownika (COUNT)

Funkcja COUNT pozwala policzyć ilość wierszy w grupie. Poniżej przykład liczenia liczby zamówień złożonych przez każdego użytkownika.

SELECT
Uzytkownicy.Imie,
Uzytkownicy.Nazwisko,
COUNT(Zamowienia.ID_Zamowienia) AS Liczba_Zamowien
FROM
Uzytkownicy
INNER JOIN
Zamowienia ON Uzytkownicy.ID_Uzytkownika = Zamowienia.ID_Uzytkownika
GROUP BY
Uzytkownicy.Imie, Uzytkownicy.Nazwisko;

Wyjaśnienie:

  • COUNT: Zlicza ilość zamówień dla każdego użytkownika.
  • GROUP BY: Grupuje dane według imienia i nazwiska użytkownika.

Przykład 4: Produkty w magazynie z ilością większą niż 20 (HAVING)

Jeśli chcemy filtrować wyniki po funkcji agregującej, używamy HAVING zamiast WHERE. Załóżmy, że interesują nas produkty o łącznej liczbie większej niż 20.

SELECT
Nazwa_Produktu,
SUM(Stan_Magazynowy) AS Laczny_Stan
FROM
Magazyn
GROUP BY
Nazwa_Produktu
HAVING
SUM(Stan_Magazynowy) > 20;

Wyjaśnienie:

  • GROUP BY: Grupuje dane według produktu.
  • SUM: Liczy łączną ilość danego produktu.
  • HAVING: Filtruje produkty, których stan magazynowy jest większy niż 20.

Przykład 5: Najdroższe produkty w magazynie (MAX)

Funkcja MAX zwraca największą wartość w kolumnie. Poniżej przykład wyświetlenia najdroższego produktu w magazynie.

SELECT
Nazwa_Produktu,
MAX(Cena_Netto) AS Najwyzsza_Cena
FROM
Magazyn;

Wyjaśnienie:

  • MAX: Znajduje najwyższą cenę w kolumnie Cena_Netto.

Kończąc..

Funkcje agregujące (SUM, COUNT, MAX) oraz grupowanie (GROUP BY, HAVING) pozwalają na efektywną analizę dużych zbiorów danych:

  • Umożliwiają podsumowywanie informacji (np. łącznej wartości zamówień).
  • Pozwalają na wyświetlanie unikalnych wartości (DISTINCT) i tworzenie bardziej zaawansowanych filtrów danych.

Te przykłady pokazują, jak w prosty sposób wykorzystywać te narzędzia w codziennej pracy z bazami danych. Dzięki nim SQL staje się potężnym narzędziem analitycznym z którym za pomocą kilku linijek, możemy w bardzo różny sposób wyciągać dane dotyczące nawet kilku prostych tabel.

Gotowa baza danych do ćwiczenia

CREATE TABLE Uzytkownicy (

    ID_Uzytkownika INT PRIMARY KEY AUTO_INCREMENT,

    Imie VARCHAR(50),

    Nazwisko VARCHAR(50),

    Miasto VARCHAR(50),

    Ulica VARCHAR(100),

    Kod_Pocztowy VARCHAR(10)

);

 

CREATE TABLE Zamowienia (

    ID_Zamowienia INT PRIMARY KEY AUTO_INCREMENT,

    ID_Uzytkownika INT,

    Data_Zamowienia DATE,

    FOREIGN KEY (ID_Uzytkownika) REFERENCES Uzytkownicy(ID_Uzytkownika)

);

 

CREATE TABLE Magazyn (

    ID_Produktu INT PRIMARY KEY AUTO_INCREMENT,

    Nazwa_Produktu VARCHAR(100),

    Cena_Netto DECIMAL(10,2),

    Stan_Magazynowy INT

);

 

CREATE TABLE Szczegoly_Zamowienia (

    ID_Szczegolu INT PRIMARY KEY AUTO_INCREMENT,

    ID_Zamowienia INT,

    ID_Produktu INT,

    Ilosc INT,

    FOREIGN KEY (ID_Zamowienia) REFERENCES Zamowienia(ID_Zamowienia),

    FOREIGN KEY (ID_Produktu) REFERENCES Magazyn(ID_Produktu)

);

 

INSERT INTO Uzytkownicy (Imie, Nazwisko, Miasto, Ulica, Kod_Pocztowy) VALUES

('Jan', 'Kowalski', 'Warszawa', 'Marszałkowska 10', '00-001'),

('Anna', 'Nowak', 'Kraków', 'Floriańska 15', '31-001'),

('Piotr', 'Wiśniewski', 'Gdańsk', 'Długa 5', '80-001'),

('Katarzyna', 'Wójcik', 'Łódź', 'Piotrkowska 20', '90-001'),

('Tomasz', 'Kamiński', 'Wrocław', 'Świdnicka 8', '50-001'),

('Magdalena', 'Lewandowska', 'Poznań', 'Głogowska 25', '60-001'),

('Paweł', 'Zieliński', 'Szczecin', 'Niepodległości 12', '70-001'),

('Ewa', 'Szymańska', 'Katowice', 'Stawowa 30', '40-001'),

('Michał', 'Woźniak', 'Bydgoszcz', 'Dworcowa 18', '85-001'),

('Agnieszka', 'Dąbrowska', 'Lublin', 'Krakowskie Przedmieście 45', '20-001'),

('Grzegorz', 'Adamski', 'Rzeszów', 'Rejtana 5', '35-001'),

('Monika', 'Bąk', 'Opole', 'Ozimska 15', '45-001'),

('Sylwia', 'Pawlak', 'Częstochowa', 'Jasnogórska 12', '42-200'),

('Mateusz', 'Kaczmarek', 'Toruń', 'Szeroka 18', '87-100'),

('Karolina', 'Górska', 'Gliwice', 'Zwycięstwa 22', '44-100'),

('Łukasz', 'Chmielewski', 'Olsztyn', 'Kościuszki 7', '10-001'),

('Alicja', 'Zając', 'Kielce', 'Sienkiewicza 9', '25-001'),

('Kamil', 'Sikora', 'Białystok', 'Lipowa 6', '15-001'),

('Joanna', 'Król', 'Legnica', 'Wrocławska 14', '59-220'),

('Patryk', 'Michalski', 'Zielona Góra', 'Niepodległości 3', '65-001');

 

INSERT INTO Magazyn (Nazwa_Produktu, Cena_Netto, Stan_Magazynowy) VALUES

('Laptop', 2500.00, 10),

('Smartphone', 1500.00, 25),

('Klawiatura', 120.00, 50),

('Mysz komputerowa', 80.00, 40),

('Monitor', 600.00, 15),

('Router WiFi', 200.00, 20),

('Drukarka', 700.00, 5),

('Tablet', 900.00, 18),

('Słuchawki', 150.00, 35),

('Powerbank', 100.00, 30),

('Komputer stacjonarny', 3000.00, 8),

('Dysk SSD 1TB', 400.00, 20),

('Pamięć RAM 16GB', 250.00, 25),

('Kamera internetowa', 150.00, 30),

('Zasilacz komputerowy', 200.00, 15),

('Karta graficzna', 1200.00, 10),

('Obudowa komputerowa', 350.00, 12),

('Kabel HDMI', 50.00, 40),

('Podkładka pod mysz', 30.00, 50),

('Mikrofon', 200.00, 18);

 

INSERT INTO Zamowienia (ID_Uzytkownika, Data_Zamowienia) VALUES

(1, '2024-01-15'),

(2, '2024-01-16'),

(3, '2024-01-17'),

(4, '2024-01-18'),

(5, '2024-01-19'),

(6, '2024-01-20'),

(7, '2024-01-21'),

(8, '2024-01-22'),

(9, '2024-01-23'),

(10, '2024-01-24'),

(11, '2024-01-25'),

(12, '2024-01-26'),

(13, '2024-01-27'),

(14, '2024-01-28'),

(15, '2024-01-29'),

(16, '2024-01-30'),

(17, '2024-01-31'),

(18, '2024-02-01'),

(19, '2024-02-02'),

(20, '2024-02-03');

 

INSERT INTO Szczegoly_Zamowienia (ID_Zamowienia, ID_Produktu, Ilosc) VALUES

(1, 1, 1),

(1, 3, 2),

(2, 2, 1),

(3, 4, 3),

(4, 5, 1),

(5, 6, 2),

(6, 7, 1),

(7, 8, 2),

(8, 9, 4),

(9, 10, 1),

(10, 1, 3),

(11, 2, 2),

(11, 5, 1),

(12, 3, 4),

(13, 6, 2),

(14, 1, 1),

(15, 4, 3),

(16, 7, 2),

(17, 8, 5),

(18, 9, 2),

(19, 10, 1),

(20, 2, 3);