Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 18

Funkcje agregujące,

grupowanie danych w
phpMyAdmin.
Funkcje agregujące, to takie funkcje, które zwracają jedną
wartość wyliczoną na podstawie wielu wierszy. Wszystkie
funkcje grupowe ignorują wiersze zawierające wartość null w
kolumnie, na której działają.

Opcjonalnie do każdej funkcji można dodać modyfikator


DISTINCT co będzie skutkowało przeliczeniem nie
uwzględniającym wartości, które się powtórzą.
W przypadku funkcji agregujących nazwy kolumn również tracą swoją
nazwę, dlatego i tu najlepiej użyć aliasów, by później wiedzieć co dana
kolumna przedstawia.
Funkcji agregujących możemy używać także kilku na raz w jednym
zapytaniu.
Grupowanie
Grupowanie polega na podzieleniu zbioru wierszy na grupy, które mają
pewną wspólną cechę. Grupowania dokonuje się w celu zastosowania
funkcji agregujących nie w stosunku do całego zbioru wierszy, ale do
poszczególnych grup wierszy.
W celu zgrupowania rekordów należy dodać nową klauzulę GROUP BY wraz
z wyspecyfikowaniem kolumny lub wyrażenia, według którego mają być
pogrupowane wiersze.
Na liście klauzuli SELECT mogą się znaleźć tylko kolumny i wyrażenia,
według których zapytanie jest grupowane, oraz wywołania funkcji
agregujących.
Przed grupowaniem można wcześniej wyfiltrować wiersze, które nas
interesują, za pomocą klauzuli WHERE.
Operator HAVING Przed dokonaniem grupowania można zastosować
klauzulę WHERE, która wybierze tylko część wierszy z tabeli.
Klauzula WHERE wykonuje się przed grupowaniem, a zatem nie można
w tej klauzuli sprecyzować warunku zawierającego funkcje grupowe.
Aby taki warunek zawrzeć w zapytaniu należy zastosować dodatkową
klauzulę HAVING wraz z odpowiednim warunkiem.
Jest ona odpowiednikiem klauzuli WHERE, tylko, że wykonuje się ona
po procesie grupowania.
Funkcja COUNT()
Funkcja ta zlicza w przekazanym zbiorze wartości wystąpienia różne
od NULL, chyba że jako argumentu użyto znaku * (gwiazdka) — takie
wywołanie funkcji spowoduje zliczenie wszystkich wierszy, łącznie z
duplikatami i wartościami NULL
Zapytanie zwracające liczbę klientów
SELECT COUNT(*) as 'Liczba klientów'
FROM customer;
| Liczba klientów |
+-----------------+
| 16              |
+-----------------+
Gdybyśmy chcieli policzyć imiona i nazwiska klientów, otrzymalibyśmy nieco inny
wynik. Wywołanie funkcji w postaci COUNT( nazwa kolumny) nie uwzględnia pól z
wartościami Null . Fakt, że wiersze z wartością Null nie są zliczane, może być
przydatny, gdy wartość Null oznacza coś szczególnego lub gdy chcemy sprawdzić,
czy w bazie nie brakuje istotnych informacji.

SELECT COUNT(fname), COUNT(lname)


FROM customer;
| COUNT(fname) | COUNT(lname) |
+--------------+--------------+
| 15           | 16           |
+--------------+--------------+
Jeżeli chcemy ograniczyć dziedzinę funkcji do unikatowych wartości wierszy,
należy zastosować kwalifikator DISTINCT.

SELECT COUNT(town), COUNT(DISTINCT(town))

FROM customer;

| COUNT(town) | COUNT(DISTINCT(town)) |

+-------------+-----------------------+

| 15 | 12 |

+-------------+-----------------------+
Funkcja SUM() Funkcja AVG()
 Zapytanie zwracające liczbę Średnia cena wszystkich kupionych
wszystkich towarów w magazynie i sprzedawanych towarów
SELECT AVG (cost_price), AVG
SELECT SUM(quantity) (sell_price)
FROM stock; FROM item;
+---------------+ +------------------+------------------+
| SUM(quantity) | | AVG (cost_price) | AVG
(sell_price) |
+---------------+
+------------------+------------------+
| 52            |
| 7.249091         | 10.435455        |
+---------------+
+------------------+------------------+
Funkcje MIN() i MAX()

• Funkcja MIN() służy do znajdowania wartości najmniejszej w zbiorze


wartości, a funkcja MAX() — największej. Obie funkcje, podobnie jak
funkcja COUNT(), mogą być użyte dla różnych typów danych.

• Za pomocą funkcji MAX() można znaleźć największy łańcuch danych,


najnowszą datę (lub najodleglejszą w przyszłości) oraz największą liczbę
w zestawieniu.
• W wyniku działania funkcji MIN() można znaleźć odpowiednio wartości
najmniejsze. 
Data pierwszego zamówienia Największa marża, z którą
sprzedajemy towary 
SELECT MIN(date_placed)
FROM orderinfo; SELECT MAX(sell_price -
+------------------+ cost_price)
| MIN(date_placed) | FROM item;
+------------------+ +------------------------------+
| 2000-03-13       | | MAX(sell_price - cost_price) |
+------------------+ +------------------------------+
| 6.72                         |
+------------------------------+
W rezultacie znaleźliśmy wartość najwyższej marży, ale nadal nie
wiemy, który towar sprzedajemy z takim zyskiem. Próba dodania do
klauzuli SELECT nazw towarów oczywiście skończy się błędem

Funkcja grupująca zwraca jedną wartość (pierwsza kolumna wyniku


miałaby jedno pole), a nazwy towarów są odczytywane bezpośrednio z
tabeli, zatem druga kolumna wyniku musiałaby mieć wiele pól

SELECT MAX(sell_price - cost_price), description 


FROM item;
ERROR 1140 (42000): Mixing of GROUP columns
(MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is
no GROUP BY clause
Klauzula GROUP BY umożliwia grupowanie wyników względem zawartości wybranych kolumn. W
wyniku jej działania uzyskujemy podział wierszy tablicy na dowolne grupy.  

Ogólna liczba sprzedanych towarów Liczba towarów sprzedanych w ramach


poszczególnych zamówień

SELECT order_id, SUM(quantity)


SELECT SUM(quantity)
FROM order
FROM order; GROUP BY order_id;
+---------------+ +--------------+---------------+
| orderinfo_id | SUM(quantity) |
| SUM(quantity) | +--------------+---------------+
+---------------+ | 1            | 3             |
| 2            | 6             |
| 15            | | 3            | 2             |
+---------------+ | 4            | 2             |
| 5            | 2             |
+--------------+---------------+
Zapamiętaj — jeżeli w klauzuli SELECT występują dowolne funkcje grupujące,
to wszystkie nazwy kolumn i wyrażenia, które NIE SĄ argumentami tych
funkcji, muszą być wymienione w klauzuli GROUP BY. Innymi słowy, w takich
zapytaniach w klauzuli SELECT mogą występować tylko i wyłącznie
wyrażenia, które są wymienione w klauzuli GROUP BY, chyba że są one
argumentami dowolnej funkcji agregującej.
Klauzule HAVING i WHERE mogą wystąpić w tym samym zapytaniu

SELECT order_id, SUM(quantity*sell_price)


FROM order
WHERE date_placed BETWEEN '2000-01-01' AND '2000-06-31‚
GROUP BY order_id
HAVING SUM(quantity*sell_price)> 30;
• +--------------+--------------------------+
• | orderinfo_id | SUM(quantity*sell_price) |
• +--------------+--------------------------+
• | 2            | 69.83                    |
• +--------------+--------------------------+
 
Przykłady:

You might also like