Страницы

Поиск по вопросам

четверг, 9 апреля 2020 г.

GROUP BY без групповых функций в MySQL

#mysql #sql #group_by

                    
Какую информацию выдаёт MySQL, если делать GROUP BY без групповых функций?

например:

id|name|count|date
-------------------------
1 | aa |  1  |null
1 | bb |null |2007-12-12
1 |null|  2  |2015-10-12


GROUP BY id

будет здесь какая-нибудь закономерность в выдаче в полях name, count и date или туда
попадают случайные значения из выборки?

P.S. тот же PostgreSQL просто выдаст ошибку.
    


Ответы

Ответ 1



При исполнении запроса есть некий порядок обработки строк. Заданный либо разработчиком, либо на усмотрение оптимизатора. Так вот будет выдана строка, которая была обработана первой в группе. Следующий запрос: SELECT * FROM( SELECT * FROM( SELECT 1 id, 1 OrderBy, 10 value UNION ALL SELECT 1 id, 2 OrderBy, 20 value UNION ALL SELECT 1 id, 3 OrderBy, 30 value )T ORDER BY OrderBy )T GROUP BY id Вернёт: id OrderBy value 1 1 10 Однако такой запрос: SELECT * FROM( SELECT * FROM( SELECT 1 id, 1 OrderBy, 10 value UNION ALL SELECT 1 id, 2 OrderBy, 20 value UNION ALL SELECT 1 id, 3 OrderBy, 30 value )T ORDER BY OrderBy DESC )T GROUP BY id Вернёт уже: id OrderBy value 3 3 30 Но, повторюсь, сортировку может выбрать оптимизатор какую угодно, поэтому в общем случае, предсказать какую строку "выберет" оптимизатор невозможно. Т.е. да, теоретически, если задать уникальную сортировку, можно использовать данную особенность MySQL осознанно. Но на свой страх и риск. Поскольку данное поведение не описано в документации и может измениться в будущих версиях MySQL сервера.

Ответ 2



Ответ из комментариев Будет выдана случайная строка, если быть совсем точном, то строка, которая будет отобрана, конечно, не случайна. Однако, ввиду того, что по мере внесения изменений в таблицу, будут выдаваться разные строки, то для «простого пользователя» это будет выглядеть именно как «случайно выбранная строка». Это не типичное поведение для СУБД, так ведет себя пожалуй только MySQL. PostgreSql, MS Sql и Oracle выдадут ошибку потому, что это противоречит стандарту SQL. В MySql же (если не задавать специальных параметров) в данном случае используется некий расширенный стандарт, который позволяет так делать. Считается, что если указанная колонка не перечислена в GROUP BY, то все ее значения в пределах группы одинаковы и поэтому не важно из какой именно строки оно будет возвращено.

Комментариев нет:

Отправить комментарий