MySQL
Grupuj według
Szukaj…
Składnia
- WYBIERZ wyrażenie1, wyrażenie2, ... wyrażenie_n,
- aggregate_function (wyrażenie)
- Z tabel
- [GDZIE warunki]
- GROUP BY wyrażenie1, wyrażenie2, ... wyrażenie_n;
Parametry
Parametr | DETALE |
---|---|
wyrażenie1, wyrażenie2, ... wyrażenie_n | Wyrażenia, które nie są zawarte w funkcji agregującej i muszą zostać uwzględnione w klauzuli GROUP BY. |
funkcja_agregacji | Funkcja taka jak SUMA, LICZNIK, MIN, MAKS lub AVG. |
stoły | Tabele, z których chcesz pobrać rekordy. W klauzuli FROM musi znajdować się co najmniej jedna tabela. |
GDZIE warunki | Opcjonalny. Warunki, które muszą zostać spełnione, aby rekordy mogły zostać wybrane. |
Uwagi
Klauzula MySQL GROUP BY jest używana w instrukcji SELECT do gromadzenia danych w wielu rekordach i grupowania wyników według jednej lub więcej kolumn.
Jego zachowanie jest częściowo regulowane przez wartość zmiennej ONLY_FULL_GROUP_BY
. Gdy ta opcja jest włączona, instrukcje SELECT
grupujące według dowolnej kolumny, która nie znajduje się w danych wyjściowych, zwracają błąd. ( Jest to ustawienie domyślne od 5.7.5 .) Zarówno ustawienie, jak i brak ustawienia tej zmiennej może powodować problemy dla naiwnych użytkowników lub użytkowników przyzwyczajonych do innych DBMS.
GRUPUJ ZA POMOCĄ funkcji SUM
SELECT product, SUM(quantity) AS "Total quantity"
FROM order_details
GROUP BY product;
Grupuj za pomocą funkcji MIN
Załóżmy tabelę pracowników, w której każdy wiersz to pracownik o name
, department
i salary
.
SELECT department, MIN(salary) AS "Lowest salary"
FROM employees
GROUP BY department;
Dzięki temu dowiesz się, który dział zawiera pracownika o najniższym wynagrodzeniu i jaka jest to pensja. Znalezienie name
pracownika o najniższej pensji w każdym dziale to inny problem, wykraczający poza zakres tego przykładu. Zobacz „max grupowo”.
GRUPUJ WEDŁUG LICZBY Funkcja
SELECT department, COUNT(*) AS "Man_Power"
FROM employees
GROUP BY department;
GRUPUJ ZA POMOCĄ HAVING
SELECT department, COUNT(*) AS "Man_Power"
FROM employees
GROUP BY department
HAVING COUNT(*) >= 10;
Użycie GROUP BY ... HAVING
do filtrowania zagregowanych rekordów jest analogiczne do użycia SELECT ... WHERE
do filtrowania pojedynczych rekordów.
Można również powiedzieć HAVING Man_Power >= 10
ponieważ HAVING
rozumie „aliasy”.
Grupuj za pomocą Group Concat
Group Concat jest używany w MySQL, aby uzyskać połączone wartości wyrażeń z więcej niż jednym wynikiem na kolumnę. Oznacza to, że istnieje wiele wierszy do wyboru z powrotem dla jednej kolumny, takich jak Name(1):Score(*)
Nazwa | Wynik |
---|---|
Adam | A + |
Adam | ZA- |
Adam | b |
Adam | C + |
Rachunek | RE- |
Jan | ZA- |
SELECT Name, GROUP_CONCAT(Score ORDER BY Score desc SEPERATOR ' ') AS Grades
FROM Grade
GROUP BY Name
Wyniki:
+------+------------+
| Name | Grades |
+------+------------+
| Adam | C+ B A- A+ |
| Bill | D- |
| John | A- |
+------+------------+
GROUP BY z funkcjami AGREGACJI
Tabela ZAMÓWIENIA
+---------+------------+----------+-------+--------+
| orderid | customerid | customer | total | items |
+---------+------------+----------+-------+--------+
| 1 | 1 | Bob | 1300 | 10 |
| 2 | 3 | Fred | 500 | 2 |
| 3 | 5 | Tess | 2500 | 8 |
| 4 | 1 | Bob | 300 | 6 |
| 5 | 2 | Carly | 800 | 3 |
| 6 | 2 | Carly | 1000 | 12 |
| 7 | 3 | Fred | 100 | 1 |
| 8 | 5 | Tess | 11500 | 50 |
| 9 | 4 | Jenny | 200 | 2 |
| 10 | 1 | Bob | 500 | 15 |
+---------+------------+----------+-------+--------+
- LICZYĆ
Zwraca liczbę wierszy spełniających określone kryteria w klauzuli WHERE
.
Np .: liczba zamówień dla każdego klienta.
SELECT customer, COUNT(*) as orders
FROM orders
GROUP BY customer
ORDER BY customer
Wynik:
+----------+--------+
| customer | orders |
+----------+--------+
| Bob | 3 |
| Carly | 2 |
| Fred | 2 |
| Jenny | 1 |
| Tess | 2 |
+----------+--------+
- SUMA
Zwraca sumę wybranej kolumny.
Np .: Suma sumy i pozycji dla każdego klienta.
SELECT customer, SUM(total) as sum_total, SUM(items) as sum_items
FROM orders
GROUP BY customer
ORDER BY customer
Wynik:
+----------+-----------+-----------+
| customer | sum_total | sum_items |
+----------+-----------+-----------+
| Bob | 2100 | 31 |
| Carly | 1800 | 15 |
| Fred | 600 | 3 |
| Jenny | 200 | 2 |
| Tess | 14000 | 58 |
+----------+-----------+-----------+
- AVG
Zwraca średnią wartość kolumny wartości liczbowej.
Np .: Średnia wartość zamówienia dla każdego klienta.
SELECT customer, AVG(total) as avg_total
FROM orders
GROUP BY customer
ORDER BY customer
Wynik:
+----------+-----------+
| customer | avg_total |
+----------+-----------+
| Bob | 700 |
| Carly | 900 |
| Fred | 300 |
| Jenny | 200 |
| Tess | 7000 |
+----------+-----------+
- MAX
Zwraca najwyższą wartość określonej kolumny lub wyrażenia.
Np .: najwyższa suma zamówienia dla każdego klienta.
SELECT customer, MAX(total) as max_total
FROM orders
GROUP BY customer
ORDER BY customer
Wynik:
+----------+-----------+
| customer | max_total |
+----------+-----------+
| Bob | 1300 |
| Carly | 1000 |
| Fred | 500 |
| Jenny | 200 |
| Tess | 11500 |
+----------+-----------+
- MIN
Zwraca najniższą wartość określonej kolumny lub wyrażenia.
Np .: Najniższa suma zamówienia dla każdego klienta.
SELECT customer, MIN(total) as min_total
FROM orders
GROUP BY customer
ORDER BY customer
Wynik:
+----------+-----------+
| customer | min_total |
+----------+-----------+
| Bob | 300 |
| Carly | 800 |
| Fred | 100 |
| Jenny | 200 |
| Tess | 2500 |
+----------+-----------+