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

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

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

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

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

instagram viewer
 за избраната от вас система от бази данни. The албуми таблицата има девет реда с първичен ключ документ за самоличност колона и колони за име, изпълнител, година на издаване и продажби:

++++++
| id | име | artist_id | освобождаване_година | продажби |
++++++
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | Тъмната страна на Луната | 2 | 1973 | 24 |
| 3 | Слухове | 3 | 1977 | 28 |
| 4 | Без значение | 4 | 1991 | 17 |
| 5 | Животни | 2 | 1977 | 6 |
| 6 | Сбогом Жълт тухлен път | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Прилеп от ада | 7 | 1977 | 28 |
++++++

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

+++
| id | име |
+++
| 1 | Бийтълс |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Нирвана |
| 5 | Елтън Джон |
| 6 | Адел |
| 7 | Месна питка |
+++

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

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

Да кажем, че искаме да разберем колко албума имаме за всеки изпълнител. Започнете с типичен ИЗБЕРЕТЕ заявка за извличане на колоната artist_id:

ИЗБЕРЕТЕ артист_ID от албуми

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

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

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

ИЗБЕРЕТЕ artist_id ОТ албуми GROUP BY artist_id

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

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

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

ИЗБЕРЕТЕ артист_идентификатор, COUNT (*)
ОТ албуми
GROUP BY artist_id
+++
| artist_id | БРОЙ (*) |
+++
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+++

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

Свързани: Основна таблица с команди за SQL за начинаещи

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

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

ИЗБЕРЕТЕ БРОЙ (*) ОТ албуми
++
| БРОЙ (*) |
++
| 9 |
++

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

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

ИЗБЕРЕТЕ артист_иден, SUM (продажби)
ОТ албуми
GROUP BY artist_id
+++
| artist_id | SUM (продажби) |
+++
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+++

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

ИЗБЕРЕТЕ артист_иден, продажби
ОТ албуми
КЪДЕ artist_id IN (2, 6)
+++
| artist_id | продажби |
+++
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+++

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

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

ИЗБЕРЕТЕ__година, продажби, брой (*)
ОТ албуми
GROUP BY release_year, продажби

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

++++
| освобождаване_година | продажби | брой (*) |
++++
| 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:

ИЗБЕРЕТЕ AVG (продажби) ОТ албуми
++
| AVG (продажби) |
++
| 19.1111 |
++

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

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

ИЗБЕРЕТЕ артист_идентификатор, COUNT (*)
ОТ албуми
WHERE release_year> 1990
GROUP BY artist_id
+++
| artist_id | БРОЙ (*) |
+++
| 4 | 1 |
| 6 | 2 |
+++

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

SELECT r.name, COUNT (*) КАТО албуми
ОТ албуми l, артисти r
КЪДЕ artist_id = r.id
И release_year> 1990
GROUP BY artist_id
+++
| име | албуми |
+++
| Нирвана | 1 |
| Адел | 2 |
+++

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

SELECT r.name, COUNT (*) КАТО албуми
ОТ албуми l, артисти r
КЪДЕ artist_id = r.id
И албуми> 2
GROUP BY artist_id;

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

ГРЕШКА 1054 (42S22): Неизвестна колона „албуми“ в „клауза“

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

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

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

SELECT r.name, COUNT (*) КАТО албуми
ОТ албуми l, артисти r
КЪДЕ artist_id = r.id
GROUP BY artist_id
ИМАЩИ албуми> 1;

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

+++
| име | албуми |
+++
| Pink Floyd | 2 |
| Адел | 2 |
+++

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

SELECT r.name, COUNT (*) КАТО албуми
ОТ албуми l, артисти r
КЪДЕ artist_id = r.id
И release_year> 1990
GROUP BY artist_id
ИМАЩИ албуми> 1;

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

+++
| име | албуми |
+++
| Адел | 2 |
+++

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

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

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

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

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

Свързани теми
  • Програмиране
  • SQL
За автора
Боби Джак (Публикувани 28 статии)

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

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

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

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

Още една стъпка…!

Моля, потвърдете имейл адреса си в имейла, който току-що ви изпратихме.

.