Автор Тема: MySQL 5.7.5: GROUP BY respects functional dependencies  (Прочетена 5391 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 191
  • Публикации: 3624
MySQL 5.7.5: GROUP BY respects functional dependencies
« -: 17 Август 2015, 15:02:19 »
Много пъти съм говорил и писал в научиМе, как и къде да бъде ползвана GROUP BY SQL клаузата. Има едно генерално неразбиране в ползването и от масата програмисти ползвайки само MySQL като основна база данни. В уроците на Гатака, не съм сигурен (не съм ги гледал всичките) дали той споменава как би трябвало да се ползва правилно.

Според стандарта от 92 г, всеки един non-aggregate expression използван в SELECT-та на заявката трябва да бъде представен в GROUP BY clause-та. Да речем следното:

Код: SQL
  1. SELECT   species
  2. ,MIN(birth)  -- birthdate of oldest pet per species
  3. ,MAX(birth)  -- birthdate of youngest pet per species
  4. ,birth       -- birthdate of ... uh oh...!
  5. FROM     menagerie.pet
  6. GROUP BY species;
  7.  

Тук парсъра ще изведе грешка ( при бази ползващи стандарта от 92г ) понеже колоната birthdate не е включена в GROUP BY и е представена в SELECT-та като non-aggregate expression.
 
В стандарта от 99г обаче нещата се променят и се казва следното. Всеки един non-aggregate expression използван в SELECT-та на заявката трябва да бъде functionally dependent към колоната представена в GROUP BY. Давам и следният пример:

Код: SQL
  1. SELECT film_id -- primary key
  2. , title -- non-key column
  3. , COUNT(*)      -- one row per group
  4. FROM sakila.film
  5. GROUP BY film_id
  6.  

Тук парсъра няма да изведе грешка при бази ползващи стандарта от 99г, понеже film_id се явява primary key за цялата таблица, от където пък логично следва, че title колоната е един вид "подчинена" и зависима към него.

До версия MySQL 5.7.5, MySQL не спазваше нито един от двата стандарта и опцията ONLY_FULL_GROUP_BY не беше включена по дифоулт. От MySQL 5.7.5 и нагоре, нещата са променени. И понеже нямам време и не бих могъл да го опиша по-добре давам два линка към блога на Roland Bouman от където и чета често.

Debunking GROUP BY myths
MySQL 5.7.5: GROUP BY respects functional dependencies!
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: MySQL 5.7.5: GROUP BY respects functional dependencies
« Отговор #1 -: 17 Август 2015, 20:58:00 »
Те тия Oracle в последно време почнаха да пускат по-рестриктивни конфигурации по подразбиране
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!