Много пъти съм говорил и писал в научиМе, как и къде да бъде ползвана GROUP BY SQL клаузата. Има едно генерално неразбиране в ползването и от масата програмисти ползвайки само MySQL като основна база данни. В уроците на Гатака, не съм сигурен (не съм ги гледал всичките) дали той споменава как би трябвало да се ползва правилно.
Според стандарта от 92 г, всеки един non-aggregate expression използван в SELECT-та на заявката трябва да бъде представен в GROUP BY clause-та. Да речем следното:
SELECT species
,MIN(birth) -- birthdate of oldest pet per species
,MAX(birth) -- birthdate of youngest pet per species
,birth -- birthdate of ... uh oh...!
FROM menagerie.pet
GROUP BY species;
Тук парсъра ще изведе грешка ( при бази ползващи стандарта от 92г ) понеже колоната birthdate не е включена в GROUP BY и е представена в SELECT-та като non-aggregate expression.
В стандарта от 99г обаче нещата се променят и се казва следното. Всеки един non-aggregate expression използван в SELECT-та на заявката трябва да бъде functionally dependent към колоната представена в GROUP BY. Давам и следният пример:
SELECT film_id -- primary key
, title -- non-key column
, COUNT(*) -- one row per group
FROM sakila.film
GROUP BY film_id
Тук парсъра няма да изведе грешка при бази ползващи стандарта от 99г, понеже film_id се явява primary key за цялата таблица, от където пък логично следва, че title колоната е един вид "подчинена" и зависима към него.
До версия MySQL 5.7.5, MySQL не спазваше нито един от двата стандарта и опцията ONLY_FULL_GROUP_BY не беше включена по дифоулт. От MySQL 5.7.5 и нагоре, нещата са променени. И понеже нямам време и не бих могъл да го опиша по-добре давам два линка към блога на Roland Bouman от където и чета често.
Debunking GROUP BY mythsMySQL 5.7.5: GROUP BY respects functional dependencies!