Группировка записей GROUP BY онлайн урок.


Оператор GROUP BY используется для группировки записей таблицы по определенному полю или множеству полей. Группировка - это процесс, при котором одинаковые значения в полях "сворачиваются" в одно. Фактически, это механизм, который похож на DISTINCT, но более гибкий.

В самом запросе GROUP BY вместе с указанным полем (полями) необходимо записывать перед предложением WHERE:

SELECT ... FROM ... GROUP BY поле1, поле2, ... , поле3 WHERE ...

Рассмотрим примеры. Для этого наполним дополнительными значениями таблицу student

INSERT INTO student VALUES (NULL, 'Mike', 23, '313-54-21'), (NULL, 'Jeff', 25, '213-56-23'), (NULL, 'Stanley', 23, '111-23-43');

Тогда наша таблица будет выглядеть следующим образом:

+----+---------+------+-----------+
| id | name | age | phone |
+----+---------+------+-----------+
| 1 | Mike | 25 | 345-65-78 |
| 2 | John | 27 | 123-65-12 |
| 3 | Bob | 23 | 456-12-55 |
| 4 | Andy | 20 | 244-34-12 |
| 5 | Rita | 21 | 432-65-11 |
| 6 | Andy | 24 | 323-43-98 |
| 7 | Mike | 23 | 313-54-21 |
| 8 | Jeff | 25 | 213-56-23 |
| 9 | Stanley | 23 | 111-23-43 |
+----+---------+------+-----------+

Видно, что есть повторения в полях с именем и возрастом, и потому по ним можно сгруппировать записи:

SELECT * FROM student GROUP BY name;

Этот запрос сгруппирует записи по полу с именем студента. Это значит, что в результирующей таблице записи, где дублируются значения в поле с именем будут свернуты в одну. Значения остальных полей в сформированной записи (группе) будут сформированы из значений, которые первые встретит MySQL при группировке. Фактически они не несут никакой смысловой нагрузки, поскольку не отображают информацию по группе в целом:

+----+---------+------+-----------+
| id | name | age | phone |
+----+---------+------+-----------+
| 4 | Andy | 20 | 244-34-12 |
| 3 | Bob | 23 | 456-12-55 |
| 8 | Jeff | 25 | 213-56-23 |
| 2 | John | 27 | 123-65-12 |
| 1 | Mike | 25 | 345-65-78 |
| 5 | Rita | 21 | 432-65-11 |
| 9 | Stanley | 23 | 111-23-43 |
+----+---------+------+-----------+
7 rows in set (0.01 sec)

Аналогично для возраста:

SELECT * FROM student GROUP BY age;
+----+------+------+-----------+
| id | name | age | phone |
+----+------+------+-----------+
| 4 | Andy | 20 | 244-34-12 |
| 5 | Rita | 21 | 432-65-11 |
| 3 | Bob | 23 | 456-12-55 |
| 6 | Andy | 24 | 323-43-98 |
| 1 | Mike | 25 | 345-65-78 |
| 2 | John | 27 | 123-65-12 |
+----+------+------+-----------+
6 rows in set (0.00 sec)


Замечание. Группировка по определенному полю автоматически сортирует это поле по возрастанию.

Замечание. Предложение GROUP BY следует за предложением WHERE

Проверьте свои знания
Таблица country: сгруппировать записи по названию континентов.