MySQL. Выбор столбца не в группе.

Я пытаюсь добавить функции в существовавшее ранее приложение, и я наткнулся на представление MySQL примерно так:

SELECT AVG(table_name.col1), AVG(table_name.col2), AVG(table_name.col3), table_name.personID, table_name.col4 FROM table_name GROUP BY table_name.personID; 

ОК, так что есть несколько совокупных функций. Вы можете выбрать personID, потому что вы группируете его. Но он также выбирает столбец, который не находится в агрегатной функции и не является частью предложения GROUP BY. Как это возможно??? Выбирает ли оно случайное значение, потому что значения определенно не уникальны для каждой группы?

Откуда я пришел (MSSQL Server), это ошибка. Может ли кто-нибудь объяснить это поведение мне и почему это разрешено в MySQL?

Верно, что эта функция допускает некоторые неоднозначные запросы и тихо возвращает набор результатов с произвольным значением, выбранным из этого столбца. На практике это имеет значение из строки внутри группы, которая физически хранится в первую очередь.

Эти запросы не являются двусмысленными, если вы выбираете только столбцы, которые функционально зависят от столбца (ов) в критериях GROUP BY. Другими словами, если может быть только одно различное значение «неоднозначного» столбца на значение, определяющее группу, нет проблем. Этот запрос был бы незаконным в Microsoft SQL Server (и ANSI SQL), хотя он не может логически привести к двусмысленности:

 SELECT AVG(table1.col1), table1.personID, persons.col4 FROM table1 JOIN persons ON (table1.personID = persons.id) GROUP BY table1.personID; 

Кроме того, MySQL имеет режим SQL, чтобы заставить его вести себя по стандарту: ONLY_FULL_GROUP_BY

FWIW, SQLite также допускает эти неоднозначные предложения GROUP BY, но он выбирает значение из последней строки в группе.


По крайней мере, в версии, которую я тестировал. Что значит быть произвольным, так это то, что MySQL или SQLite могут изменить свою реализацию в будущем и иметь какое-то другое поведение. Поэтому вы не должны полагаться на поведение, оставаясь таким, каким оно есть в настоящее время в таких неоднозначных случаях. Лучше переписать свои запросы как детерминированные, а не двусмысленные. Вот почему MySQL 5.7 теперь включает ONLY_FULL_GROUP_BY по умолчанию.

У меня должен был быть Googled еще немного … Кажется, я нашел свой ответ .

MySQL расширяет использование GROUP BY, чтобы вы могли использовать неагрегированные столбцы или вычисления в списке SELECT, которые не отображаются в предложении GROUP BY. Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов. Например, вам не нужно группировать имя customer.name в следующем запросе

В стандартном SQL вам нужно добавить customer.name в предложение GROUP BY. В MySQL имя является избыточным.

Тем не менее, это просто кажется … неправильным.

 select * from personel where p_id IN(select min(dbo.personel.p_id) FROM personel GROUP BY dbo.personel.p_adi) 
  • Проблемы чтения / записи данных UTF-8 в MySQL из Java с использованием JDBC-коннектора 5.1
  • Как я могу оптимизировать функцию ORDER BY RAND () MySQL?
  • MySQL AUTO_INCREMENT не ROLLBACK
  • JOIN запросы против нескольких запросов
  • Объединение трех таблиц с использованием MySQL
  • mySQL конвертировать varchar на сегодняшний день
  • Как создать базу данных mysql с несколькими арендаторами
  • Как выполнить команду MySQL из сценария оболочки?
  • MySQL - Entity: значение для столбца IsPrimaryKey в таблице «TableDetails» - DBNull
  • Я считаю, что я удалил пользователя MySQL root, как его воссоздать?
  • Почему текстовый столбец не имеет значения по умолчанию в MySQL?
  • Interesting Posts

    Как использовать проект библиотеки в андроид-студии

    Как создать комбинации нескольких векторов без контуров жесткого кодирования в C ++?

    Как я могу увидеть доступные фильтры поиска Windows?

    Примеры шаблонов проектирования GoF в основных библиотеках Java

    личное сообщение socket.io

    Ожидание более чем одной одновременной операции ожидания

    Как выбрать одно поле в MongoDB?

    Как отключить буферизацию stdout в C

    Как устранить неисправность жесткого диска, которая дает быстрый звуковой сигнал и не распознается ПК?

    В чем основное различие между поколениями процессоров Intel?

    Почему нельзя объявлять enums локально в методе?

    В MacBook с двойной загрузкой, используя BootCamp, переместил жесткий диск в оптический отсек, и Windows больше не загружается

    Как получить список всех файлов в облачном хранилище в приложении Firebase?

    В чем разница между указателем и ссылочной переменной в Java?

    Как обрезать записи экрана под Snow Leopard?

    Давайте будем гением компьютера.