Клауза SQL GROUP BY и HAVING с примери

Какво представлява SQL Group by Clause?

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

Това е, което прави, обобщаване на данни от базата данни.

Заявките, които съдържат клаузата GROUP BY, се наричат ​​групирани заявки и връщат само един ред за всеки групиран елемент.

SQL ГРУПИРАНЕ ПО Синтаксис

След като вече знаем какво представлява SQL клаузата GROUP BY, нека да разгледаме синтаксиса за основна група по заявка.

SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];

ТУК

  • „Изявления SELECT…“ е стандартната заявка за команда SQL SELECT.
  • "ГРУПИРАЙ ПО име_на_колона1” е клаузата, която извършва групирането въз основа на column_name1.
  • „[,име_на_колона2,…]“ не е задължително; представлява други имена на колони, когато групирането се извършва на повече от една колона.
  • „[Условие ЗА НАЛИЧНОСТ]“ не е задължително; използва се за ограничаване на редовете, засегнати от клаузата GROUP BY. То е подобно на WHERE клауза.

Групиране с помощта на a Единична колона

За да помогнем да разберем ефекта от клаузата Group By на SQL, нека изпълним проста заявка, която връща всички записи за пол от таблицата членове.

SELECT `gender` FROM `members` ;
gender
Female
Female
Male
Female
Male
Male
Male
Male
Male

Да предположим, че искаме да получим уникалните стойности за половете. Можем да използваме следната заявка –

SELECT `gender` FROM `members` GROUP BY `gender`;

Изпълнение на горния скрипт в MySQL работна маса срещу Myflixdb ни дава следните резултати.

gender
Female
Male

Имайте предвид, че са върнати само два резултата. Това е така, защото имаме само два типа полови мъже и жени. Клаузата GROUP BY в SQL групира всички „мъжки“ членове заедно и връща само един ред за него. Същото се случи и с членовете „Жени“.

Групиране с помощта няколко колони

Да предположим, че искаме да получим списък с movie 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

Да предположим, че искаме да знаем всички години на издаване за филмова категория id 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.

Oбобщение

  • Клаузата GROUP BY SQL се използва за групиране на редове с еднакви стойности.
  • Клаузата GROUP BY се използва заедно с SQL оператор SELECT.
  • Операторът SELECT, използван в клаузата GROUP BY, може да се използва само като съдържа имена на колони, агрегатни функции, константи и изрази.
  • SQL Having Clause се използва за ограничаване на резултатите, върнати от клаузата GROUP BY.
  • Клаузата на MYSQL GROUP BY се използва за събиране на данни от множество записи и върнат запис, зададен от една или повече колони.