MySQL позволяет разбивать записи результирующего набора на определенные группы на основании определенного атрибута. Для этой цели используется предложение GROUP BY. Так как каждая группа, созданная таким образом, представляется одной строкой (даже если она содержит несколько записей), эта возможность используется в первую очередь в случае многочисленных агрегатных функций MySQL.
Для того чтобы лучше это понять, рассмотрим следующий пример.
Листинг 9.51.
mysql> SELECT accountCreatedAt FROM accounts GROUP BY accountCreatedAt;
Группировка результатов выборки
В этом примере все попавшие в таблицу accounts записи были сгруппированы по полю accountCreatedAt. Так как все 11 записей таблицы содержат только 5 кодов штатов, MySQL создает 5 четких групп записей и представляет каждую группу одной строкой результирующего набора.
Случайный выбор
Комбинация ключевого слова LIMIT в сочетании с предложением ORDER BY и функцией RAND() дает возможность создания одного из наиболее популярных запросов из списков рассылки - выборки одной или более записей таблицы случайным образом. Этот процесс включает первую сортировку таблицы случайным образом, а затем выборку из результирующего набора одной записи. Или на жаргоне SQL: SELECT fld1, fld2 FROM tbl ORDER BY RAND() LIMIT 0, 1;
Теперь к записям, составляющим определенные отдельные группы, можно применять агрегатные функции. Например, следующий запрос возвращает суммарное число счетов по каждому штату.
Группировка результатов выборки
+-----+----------------------+
5 rows in set (0.05 sec)
После каждого имени поля в предложении GROUP BY могут быть добавлены ключевые слова ASC или DESC, позволяющие отсортировать результирующий набор в возрастающем или убывающем порядке соответственно. Следующий пример демонстрирует сортировку среднего остатка по счетам и по штатам в порядке, обратном алфавитному.
Группировка результатов выборки
Группы, созданные предложением GROUP BY можно еще более ограничить, добавив предложение HAVING, которое служит для той же цели, что и предложение WHERE, о котором речь шла ранее: для создания результирующего набора, соответствующего определенному условию. Рассмотрим примеры.
Группировка результатов выборки
Использование переменных
MySQL также позволяет сохранять результаты запросов SELECT в переменных, заданных пользователем, для использования в будущих запросах SELECT. Эти переменные хранятся на протяжении одного сеанса соединения, обеспечивая удобный и эффективный способ соединения запросов и использование результатов одного запроса в конструкциях другого. 
В чем разница между предложениями where и having
Различие между предложениями WHERE и HAVING заключается в том, что предложение WHERE обрабатывает все записи таблицы, выбирая только те, которые соответствуют указанному условию. Предложение HAVING обрабатывает записи после того, как они были выбраны из таблицы для еще более детальной обработки результирующего набора. Обычно предложение HAVING появляется вместе с предложениями GROUP BY, в то время как предложение WHERE - в операторах SELECT, DELETE и UPDATE.

Присвоение значений переменным осуществляется с помощью оператора " :=". В следующем примере показано присвоение самой ранней даты переменной ©oldest.
Группировка результатов выборки
Имена переменных чувствительны к регистру и могут содержать алфавитно-цифровые символы, символы подчеркивания "_" и точки ".". Эти переменные не различают типы данных. В переменной могут храниться строки или числа без необходимости предварительного объявления типа явным образом.