Всичко, което трябва да знаете за SQL GROUP BY изявлението

Всичко, което трябва да знаете за SQL GROUP BY изявлението

Голяма част от силата на релационните бази данни идва от филтрирането на данни и обединяването на таблици заедно. Ето защо ние представляваме тези отношения на първо място. Но съвременните системи за бази данни предоставят друга ценна техника: групиране.





Групирането ви позволява да извлечете обобщена информация от база данни. Тя ви позволява да комбинирате резултати, за да създавате полезни статистически данни. Групирането ви спестява от писането на код за често срещани случаи, като например усредняване на списъци с цифри. И може да направи по -ефективни системи.





Какво прави клаузата GROUP BY?

GROUP BY, както подсказва името, групира резултатите в по -малък набор. Резултатите се състоят от един ред за всяка отделна стойност на групираната колона. Можем да покажем използването му, като разгледаме някои примерни данни с редове, които споделят някои общи стойности.





могат ли други хора да видят спомени от snapchat

По -долу е много проста база данни с две таблици, представляващи албуми за записи. Можете да създадете такава база данни чрез писане на основна схема за избраната от вас система за бази данни. The албуми таблицата има девет реда с първичен ключ документ за самоличност колона и колони за име, изпълнител, година на издаване и продажби:

+----+---------------------------+-----------+--------------+-------+
| id | name | artist_id | release_year | sales |
+----+---------------------------+-----------+--------------+-------+
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | The Dark Side of the Moon | 2 | 1973 | 24 |
| 3 | Rumours | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Animals | 2 | 1977 | 6 |
| 6 | Goodbye Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Bat Out of Hell | 7 | 1977 | 28 |
+----+---------------------------+-----------+--------------+-------+

The художници масата е още по -проста. Той има седем реда с колони с идентификатор и име:



+----+---------------+
| id | name |
+----+---------------+
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Meat Loaf |
+----+---------------+

Можете да разберете различни аспекти на GROUP BY само с прост набор от данни като този. Разбира се, набор от реални данни ще има много, много повече редове, но принципите остават същите.

Групиране по една колона

Да речем, че искаме да разберем колко албума имаме за всеки изпълнител. Започнете с типично SELECT заявка за извличане на колоната artist_id:





SELECT artist_id FROM albums

Това връща всички девет реда, както се очаква:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
+-----------+

За да групирате тези резултати по изпълнител, добавете фразата GROUP BY artist_id :





SELECT artist_id FROM albums GROUP BY artist_id

Което дава следните резултати:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+-----------+

В набора от резултати има седем реда, намалени от общо деветте в албуми маса. Всеки уникален artist_id има един ред. И накрая, за да получите действителния брой, добавете БРОЯ(*) към избраните колони:

SELECT artist_id, COUNT(*)
FROM albums
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+-----------+----------+

Резултатите групират две двойки редове за изпълнителите с идентификатори 2 и 6 . Всеки има два албума в нашата база данни.

Свързани: Кодът за основни SQL команди за начинаещи

Как да получите достъп до групирани данни с агрегирана функция

Може да сте използвали БРОЯ функция преди, особено в БРОЯ(*) форма, както се вижда по -горе. Той извлича броя на резултатите в набор. Можете да го използвате, за да получите общия брой записи в таблица:

SELECT COUNT(*) FROM albums
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+

COUNT е обобщена функция. Този термин се отнася до функции, които превеждат стойности от множество редове в една стойност. Те често се използват заедно с израза GROUP BY.

Вместо просто да броим броя на редовете, можем да приложим обобщена функция към групирани стойности:

SELECT artist_id, SUM(sales)
FROM albums
GROUP BY artist_id
+-----------+------------+
| artist_id | SUM(sales) |
+-----------+------------+
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+-----------+------------+

Общите продажби, показани по -горе за изпълнители 2 и 6, са продажбите на техните множество албуми, комбинирани:

SELECT artist_id, sales
FROM albums
WHERE artist_id IN (2, 6)
+-----------+-------+
| artist_id | sales |
+-----------+-------+
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+-----------+-------+

Групиране по няколко колони

Можете да групирате по повече от една колона. Просто включете няколко колони или изрази, разделени със запетаи. Резултатите ще се групират според комбинацията от тези колони.

SELECT release_year, sales, count(*)
FROM albums
GROUP BY release_year, sales

Обикновено това ще доведе до повече резултати от групирането по една колона:

+--------------+-------+----------+
| release_year | sales | count(*) |
+--------------+-------+----------+
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
+--------------+-------+----------+

Имайте предвид, че в нашия малък пример само два албума имат една и съща година на издаване и брой продажби (28 през 1977 г.).

Полезни агрегатни функции

Освен COUNT, няколко функции работят добре с GROUP. Всяка функция връща стойност въз основа на записите, принадлежащи на всяка група резултати.

  • COUNT () връща общия брой съвпадащи записи.
  • SUM () връща сбора на всички стойности в дадената колона.
  • MIN () връща най -малката стойност в дадена колона.
  • MAX () връща най -голямата стойност в дадена колона.
  • AVG () връща средната средна стойност. Това е еквивалентът на SUM () / COUNT ().

Можете също да използвате тези функции без клауза GROUP:

как да върнете изгубен iphone
SELECT AVG(sales) FROM albums
+------------+
| AVG(sales) |
+------------+
| 19.1111 |
+------------+

Използване на GROUP BY с клауза WHERE

Точно както при нормален SELECT, все още можете да използвате WHERE, за да филтрирате набора от резултати:

SELECT artist_id, COUNT(*)
FROM albums
WHERE release_year > 1990
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 4 | 1 |
| 6 | 2 |
+-----------+----------+

Сега имате само тези албуми, издадени след 1990 г., групирани по изпълнител. Можете също да използвате съединение с клаузата WHERE, независимо от GROUP BY:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
+---------+--------+
| name | albums |
+---------+--------+
| Nirvana | 1 |
| Adele | 2 |
+---------+--------+

Имайте предвид обаче, че ако се опитате да филтрирате въз основа на обобщена колона:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND albums > 2
GROUP BY artist_id;

Ще получите грешка:

ERROR 1054 (42S22): Unknown column 'albums' in 'where clause'

Колоните, базирани на обобщени данни, не са достъпни за клаузата WHERE.

Използване на клаузата HAVING

И така, как да филтрирате набора от резултати след извършване на групиране? The ИМАЩИ клауза се занимава с тази нужда:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
GROUP BY artist_id
HAVING albums > 1;

Обърнете внимание, че клаузата HAVING идва след GROUP BY. В противен случай това е по същество проста замяна на WHERE с HAVING. Резултатите са:

+------------+--------+
| name | albums |
+------------+--------+
| Pink Floyd | 2 |
| Adele | 2 |
+------------+--------+

Все още можете да използвате условие WHERE, за да филтрирате резултатите преди групирането. Той ще работи заедно с клауза HAVING за филтриране след групирането:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
HAVING albums > 1;

Само един изпълнител в нашата база данни издаде повече от един албум след 1990 г .:

+-------+--------+
| name | albums |
+-------+--------+
| Adele | 2 |
+-------+--------+

Комбиниране на резултатите с GROUP BY

Изразът GROUP BY е изключително полезна част от езика на SQL. Той може да предостави обобщена информация за данни, например за страница със съдържание. Това е отлична алтернатива за извличане на големи количества данни. Базата данни се справя добре с това допълнително натоварване, тъй като самият й дизайн я прави оптимална за работата.

След като разберете групирането и как да се присъедините към множество таблици, ще можете да използвате по -голямата част от силата на релационна база данни.

Дял Дял Туит електронна поща Как да заявявате няколко таблици на база данни наведнъж с SQL съединения

Научете как да използвате SQL съединения, за да рационализирате заявките, да спестите време и да се почувствате като силен потребител на SQL.

как да спрете хакерите на телефона си
Прочетете Напред Свързани теми
  • Програмиране
  • SQL
За автора Боби Джак(58 статии са публикувани)

Боби е ентусиаст на технологиите, който работи като софтуерен разработчик в продължение на почти две десетилетия. Той е запален по игрите, работи като редактор на рецензии в Switch Player Magazine и е потопен във всички аспекти на онлайн издателството и уеб разработката.

Още от Боби Джак

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и изключителни оферти!

Щракнете тук, за да се абонирате