Какво представлява SQL Group by Clause?
Клаузата GROUP BY е SQL команда, която се използва за групиране на редове, които имат същите стойности . Клаузата GROUP BY се използва в оператора SELECT. По желание се използва заедно с обобщени функции за създаване на обобщени отчети от базата данни.
Това прави, обобщавайки данните от базата данни.
Заявките, които съдържат клаузата GROUP BY, се наричат групирани заявки и връщат само един ред за всеки групиран елемент.
SQL GROUP BY Синтаксис
Сега, след като знаем каква е клаузата SQL GROUP BY, нека разгледаме синтаксиса на основна група по заявка.
SELECT statements… GROUP BY column_name1[,column_name2,… ] [HAVING condition];
ТУК
- "SELECT оператори ..." е стандартната заявка за команди на SQL SELECT.
- " GROUP BY column_name1" е клаузата, която извършва групирането на базата на column_name1.
- „[, column_name2, ...]“ не е задължително; представлява други имена на колони, когато групирането се извършва в повече от една колона.
- „[HAVING condition]“ не е задължително; той се използва за ограничаване на редовете, засегнати от клаузата GROUP BY. Подобно е на клаузата WHERE.
Групиране с помощта на една колона
За да помогнем да разберем ефекта от клаузата на SQL Group By, нека изпълним проста заявка, която връща всички записи на пола от таблицата на членовете.
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
Да предположим, че искаме да получим уникалните стойности за половете. Можем да използваме следната заявка -
SELECT `gender` FROM `members` GROUP BY `gender`;
Изпълнението на горния скрипт в MySQL workbench срещу Myflixdb ни дава следните резултати.
gender |
---|
Female |
Male |
Обърнете внимание, че са върнати само два резултата. Това е така, защото имаме само два типа пол - мъжки и женски. Клаузата GROUP BY в SQL групира всички членове "Мъжки" заедно и върна само един ред за нея. Същото направи и с членовете на "Жената".
Групиране с помощта на множество колони
Да предположим, че искаме да получим списък на филма category_id и съответните години, в които са пуснати.
Нека наблюдаваме резултата от тази проста заявка
SELECT `category_id`,`year_released` FROM `movies` ;
category_id | year_released |
---|---|
1 | 2011 |
2 | 2008 |
NULL | 2008 |
NULL | 2010 |
8 | 2007 |
6 | 2007 |
6 | 2007 |
8 | 2005 |
NULL | 2012 |
7 | 1920 |
8 | NULL |
8 | 1920 |
Горният резултат има много дубликати.
Нека изпълним една и съща заявка, използвайки group by в SQL -
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Изпълнението на горния скрипт в MySQL workbench срещу myflixdb ни дава следните резултати, показани по-долу.
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
Клаузата GROUP BY действа както на идентификатора на категорията, така и на издадената година, за да идентифицира уникални редове в горния ни пример.
Ако идентификаторът на категорията е еднакъв, но издадената година е различна, тогава ред се третира като уникален. Ако идентификаторът на категорията и освободената година са еднакви за повече от един ред, тогава се счита за дубликат и само за един ред е показан.
Групиране и агрегирани функции
Да предположим, че искаме общия брой мъже и жени в нашата база данни. Можем да използваме следния скрипт, показан по-долу, за да го направим.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Изпълнението на горния скрипт в MySQL workbench срещу myflixdb ни дава следните резултати.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Показаните по-долу резултати са групирани по всяка публикувана уникална стойност на пола и броят на групираните редове се отчита с помощта на обобщаващата функция COUNT.
Ограничаване на резултатите от заявката с помощта на клаузата HAVING
Не винаги ще искаме да извършим групиране на всички данни в дадена таблица. Ще има моменти, когато ще искаме да ограничим резултатите си до определени критерии. В такива случаи можем да използваме клаузата HAVING
Да предположим, че искаме да знаем всички години на издаване за идентификатор на категория 8. Филм. Ще използваме следния сценарий, за да постигнем нашите резултати.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Изпълнението на горния скрипт в MySQL workbench срещу Myflixdb ни дава следните резултати, показани по-долу.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
Обърнете внимание, че само филмите с категория id 8 са засегнати от нашата клауза GROUP BY.
Обобщение
- Клаузата GROUP BY SQL се използва за групиране на редове със същите стойности.
- Клаузата GROUP BY се използва заедно с оператора SQL SELECT.
- Операторът SELECT, използван в клаузата GROUP BY, може да се използва само съдържа имена на колони, обобщени функции, константи и изрази.
- Клауза за наличие на SQL се използва за ограничаване на резултатите, върнати от клаузата GROUP BY.
- Клаузата MYSQL GROUP BY се използва за събиране на данни от множество записи и върнат запис, зададен от една или повече колони.