Меня просто смущает последовательность выполнения SQL-запроса, когда мы используем GROUP BY и HAVING с предложением WHERE. Какой из них выполняется первым? Какая последовательность?
Меня просто смущает последовательность выполнения SQL-запроса, когда мы используем GROUP BY и HAVING с предложением WHERE. Какой из них выполняется первым? Какая последовательность?
Ответы:
Для того, чтобы:
FROM & JOIN определяет и фильтрует строки
ГДЕ больше фильтров в строках
GROUP BY объединяет эти строки в группы.
ИМЕЮЩИЕ группы фильтров.
ORDER BY упорядочивает оставшиеся строки / группы.
LIMIT фильтры для оставшихся строк / групп.
SET SHOWPLAN_ALL ON
Вот полная последовательность для sql server:
1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE or WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
Итак, из приведенного выше списка вы можете легко понять последовательность выполнения GROUP BY, HAVING and WHERE
:
1. WHERE
2. GROUP BY
3. HAVING
SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val
Здесь ON идет после join, а select идет первым, какие-либо объяснения?
FROM
сначала вычислитель , а затем ON
и так далее.
Сначала WHERE, затем вы группируете результат запроса, и последнее, но не менее важное, предложение HAVING используется для фильтрации сгруппированного результата. Это «логический» порядок, я не знаю, как это технически реализовано в движке.
Я думаю, что это реализовано в движке, как сказал Матиас: WHERE, GROUP BY, HAVING
Пытался найти ссылку в Интернете, в которой перечислена вся последовательность (т.е. "ВЫБРАТЬ" идет прямо внизу), но я не могу ее найти. Это было подробно описано в книге "Внутри Microsoft SQL Server 2005", которую я прочитал недавно, Solid Quality Learning.
Изменить: нашел ссылку: http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx
Подумайте, что вам нужно сделать, если вы хотите реализовать:
Порядок: WHERE, GROUP BY и HAVING.
В порядке ниже
Пункт «Наличие» может предшествовать / предшествовать группе по пункту.
Пример: выберите * FROM test_std; ROLL_NO SNAME ДОБ УЧИТЬ
1 John 27-AUG-18 Wills
2 Knit 27-AUG-18 Prestion
3 Perl 27-AUG-18 Wills
4 Ohrm 27-AUG-18 Woods
5 Smith 27-AUG-18 Charmy
6 Jony 27-AUG-18 Wills
Warner 20-NOV-18 Wills
Marsh 12-NOV-18 Langer
FINCH 18-OCT-18 Langer
Выбрано 9 рядов.
выберите обучение, count ( ) count из test_std, имеющего count ( )> 1 группу по TEACH;
УЧИТЬ ГРАФ
Лангер 2 Завещания 4
Это SQL-порядок выполнения запроса,
Вы можете проверить порядок выполнения на примерах из этой статьи .
Для вашего вопроса могут оказаться полезными следующие строки, взятые непосредственно из этой статьи .
- GROUP BY -> Оставшиеся после применения ограничений WHERE строки затем группируются на основе общих значений в столбце, указанном в предложении GROUP BY. В результате группировки строк будет ровно столько, сколько уникальных значений в этом столбце. Неявно это означает, что вам нужно использовать это только в том случае, если в вашем запросе есть агрегатные функции.
- HAVING -> Если запрос имеет предложение GROUP BY, тогда ограничения в предложении HAVING применяются к сгруппированным строкам, отбрасывая сгруппированные строки, которые не удовлетворяют ограничению. Как и предложение WHERE, в большинстве баз данных на этом шаге также недоступны псевдонимы.
Ссылки:-
ВЫБОР
ИЗ
JOIN и
WHERE
GROUP BY
HAVING
ORDER BY