Як працює group by в mysql stack overflow російською
Питання по sql по клаузуле GROUP BY.
Розглянемо угруповання по ОДНОМУ колонки. приклад:
Тобто, в стовпці DEPARTMENT_ID шукається унікальне (схоже на DISTINCT) значення відділу, наприклад, 30, потім шукаються всі рядки, де згадується відділ 30 в даній таблиці, з цих рядків беруться значення з шпальти SALARY і підсумовуються (SUM). Потім шукається інший покупець і все повторюється. У підсумку я отримую скільки отримав взагалі грошей кожен відділ.
Не розумію момент: у мене є 6 рядків, в яких є стовпець DEPARTMENT_ID зі значенням 30. Яка з рядків піде в табліцу- SELECT і чому? Тобто, в таблиці Employees було шість рядків з DEPARTMENT_ID 30, а в табліце- SELECT такий рядок тільки одна. Як взагалі це угруповання працює?
заданий 5 дек '16 о 9:35
де це написано, що вибирається саме ПЕРША рядок? не зустрічав - Dimon 5 дек '16 в 9:53
спасибо за ответ - Dimon 5 дек '16 в 9:57
@Mike +1 про інші СУБД. Взагалі дивна поведінка MySQL, перший раз счас про нього прочитав: D - teran 5 дек '16 в 10:18
До вибірки після group by не потрапить жодна з початкових рядків. На виході агрегат - сума даних в потрібному розрізі. До колонок, до яких ви явно не застосували ніяких групових функцій (таких як sum ()), буде застосована функція "перше-ліпше". Причому тільки в MySQL і тільки при вимкненому опції ONLY_FULL_GROUP_BY. В інших СУБД запит, в якому хоча б до однієї колонці, яка не є розрізом зазначеним в group by, "забули" застосувати групову функцію видадуть помилку.
Як працює group by можна прикинути в екселя. Запишіть дані на лист, відсортуйте за тими полями, які повинні бути в group by. Новомосковський відсортовані дані поспіль в будь-якому випадку коли значення в черговий рядку в колонках, зазначених в group by відрізняється від значень в попередній - вставте новий рядок, скопіюйте значення колонок group by. а в інші помістіть формулювання на кшталт СУММ () осередків групи під якою підводиться підсумок. Результат group by - це саме ці вставлені підсумкові записи. СУБД працює приблизно за таким же алгоритмом - спочатку сортує, потім підсумовує йдуть підряд однакові записи.
Додам про MySQL - він все таки занадто вільно до цього ставиться, намагайтеся завжди явно застосовувати групові функції до всіх колонках, що б самому розуміти що саме в них виявиться, бо 'перше-ліпше' ні чим не стандартизовано і може змінюватися від версії до версії і в залежності від матеріального становища записів на диску і плану виконання запиту.
відповідь дан 5 дек '16 о 10:41