Какая последовательность выполнения у group by, having, order by?
Какая последовательность?
1. FROM -> 2. WHERE -> 3. GROUP BY -> 4. HAVING -> 5. ORDER BY?
И на каждом этапе создается что-то вроде временной таблицы? Т.е. having уже оперирует над массивом данных, отфильтрованным gropu by? Я к чему спрашиваю: раньше по поводу sql в голове была каша (что выполняется сразу все и одновременно:)), сейчас, начиная осознавать его последовательность и структурированность, легче составлять сложные запросы. Но еще не до конца.
Последовательность понял правильно. Молодец!
1. WHERE -> 2. GROUP BY -> 3. HAVING -> 4. ORDER BY
Т.е. сначала фильтруем - получаем тот набор кортежей, с которыми будем работать дальше.
Затем группируем в нужном разрезе.
Затем накладываем условие на результат группировки (а условие на результат можно наложить только после получения результата). Затем сортируем полученный результат для возвращения клиенту.
Никаких временных таблиц не создается (привет любителям materialize). Порядок выполнения определяется планом запроса и он в общем случае может сильно отличаться от структуры текста запроса.
Теперь можно разбираться последовательностью выполнения в иерархических запросах (connect by).
1. WHERE, GROUP BY, HAVING - фильтры, после каждого создается набор кортежей, над которым работает следующий фильтр (получает на вход). SELECT все-таки идет после WHERE? Именно результат SELECTа - "основа" для всего остального?
2. HAVING можно использовать только в паре с GROUP BY? Т.е. он может на вход получать только результат GROUP BY?
3. ORDER BY - сортировка, которая на вход может получать чей результат? Только HAVINGа?
nevro:
1. GROUP BY - это не фильтр. WHERE, HAVING - можно сказать фильтры. Почему "можно сказать"? Когда долго работаешь с БД, это как с иностранным языком, в какой-то момент начинаешь думать на иностранном. Перестаешь переводить в голове на русский. Так и с инструкциями SQL. Перестаешь переводить в русские термины "инструкция", "фильтр" и т.д. Просто понимаешь как это работает. Как Нео из Матрицы. Начинаешь видеть зеленые буковки))
2. HAVING можно использовать только в паре с GROUP BY. Условно говоря да. Однако, бывает группировки с пустым количеством поле в GROUP BY. Например, select count(1) from table1. Тут мы посчитали кол-во строк в таблице. Без группировки. Можно написать select count(1) from table1 having count(1) = 0. Это будет работать. Будет выдавать результат только, если в таблице 0 строк.
3. ORDER BY - итоговая сортировка. Самая последняя инструкция. Когда результирующий rowset определен. Неважно как, кем и чем.