Какова последовательность выполнения предложений Group By, Have и Where в SQL Server?


93

Меня просто смущает последовательность выполнения SQL-запроса, когда мы используем GROUP BY и HAVING с предложением WHERE. Какой из них выполняется первым? Какая последовательность?

Ответы:


187

Для того, чтобы:

FROM & JOIN определяет и фильтрует строки
ГДЕ больше фильтров в строках
GROUP BY объединяет эти строки в группы.
ИМЕЮЩИЕ группы фильтров.
ORDER BY упорядочивает оставшиеся строки / группы.
LIMIT фильтры для оставшихся строк / групп.


есть ли ссылка на это ??
Гешан

3
@Geshan, взгляд вSET SHOWPLAN_ALL ON
КМ.

Привет, у меня есть один вопрос. будет ли оператор case, когда условие отменяет условие where?
MAX

2
Что насчет пункта select. Это последнее?
MAX

Краткий и лаконичный ответ! Спасибо!
Абхишек Гош

14

Вот полная последовательность для 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

Получите дополнительную информацию об этом от Microsoft


SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @valЗдесь ON идет после join, а select идет первым, какие-либо объяснения?
noob

Это просто синтаксис написания оператора SQL. Упомянутая мною последовательность - это реальный порядок, который оценивает механизм SQL. Это означает, что если синтаксис вашего запроса правильный, то FROMсначала вычислитель , а затем ONи так далее.
Md. Suman Kabir

1
@ShailajaGuptaKapoor Вы можете прочитать это blogs.x2line.com/al/archive/2007/06/30/3187.aspx
Md. Suman Kabir

Если WHERE предшествует SELECT, почему это возвращает строку? выберите сумму (1) из foo, где 1 = 0
Тони Б.

8

Сначала WHERE, затем вы группируете результат запроса, и последнее, но не менее важное, предложение HAVING используется для фильтрации сгруппированного результата. Это «логический» порядок, я не знаю, как это технически реализовано в движке.


2
Стоит добавить, что оптимизатор может перемещать предложения из HAVING в WHERE, если они не зависят от агрегата. Это не повлияет на показанные результаты.
Damien_The_Unbeliever

2

Я думаю, что это реализовано в движке, как сказал Матиас: WHERE, GROUP BY, HAVING

Пытался найти ссылку в Интернете, в которой перечислена вся последовательность (т.е. "ВЫБРАТЬ" идет прямо внизу), но я не могу ее найти. Это было подробно описано в книге "Внутри Microsoft SQL Server 2005", которую я прочитал недавно, Solid Quality Learning.

Изменить: нашел ссылку: http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx


Очень хорошее объяснение, с которым вы связались :-).
sleske

1
Ссылка мертва. Если вы можете это исправить, было бы здорово :)
Akash KC

2

В Oracle 12c вы можете запускать код в любой из следующих последовательностей:

Where
Group By
Having

Или

Where 
Having
Group by

1

Подумайте, что вам нужно сделать, если вы хотите реализовать:

  • ГДЕ : необходимо выполнить операции JOIN.
  • GROUP BY : вы указываете Group by, чтобы «сгруппировать» результаты при объединении, затем это необходимо после операции JOIN, после использования WHERE.
  • HAVING : HAVING предназначен для фильтрации, как говорится в выражениях GROUP BY. Затем он выполняется после GROUP BY.

Порядок: WHERE, GROUP BY и HAVING.


То, что вы здесь объяснили, великолепно. Это прояснило мои сомнения относительно ИМЕНИ. Итак, чтобы подвести итог - GROUP BY & HAVING работает так же, как SELECT & WHERE. Предложение HAVING всегда выполняется для данных таблицы COMPLETE, принимая на картинке условие GROUP BY, а не для данных GROUPED.
Навин Кумар

1

В порядке ниже

  1. ОТ И ПРИСОЕДИНЯЙТЕСЬ
  2. ГДЕ
  3. ГРУППА ПО
  4. ИМЕЕТ
  5. ВЫБРАТЬ
  6. СОРТИРОВАТЬ ПО
  7. LIMIT

0

Пункт «Наличие» может предшествовать / предшествовать группе по пункту.

Пример: выберите * 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


0

Это SQL-порядок выполнения запроса,

введите описание изображения здесь

Вы можете проверить порядок выполнения на примерах из этой статьи .

Для вашего вопроса могут оказаться полезными следующие строки, взятые непосредственно из этой статьи .

  1. GROUP BY -> Оставшиеся после применения ограничений WHERE строки затем группируются на основе общих значений в столбце, указанном в предложении GROUP BY. В результате группировки строк будет ровно столько, сколько уникальных значений в этом столбце. Неявно это означает, что вам нужно использовать это только в том случае, если в вашем запросе есть агрегатные функции.
  1. HAVING -> Если запрос имеет предложение GROUP BY, тогда ограничения в предложении HAVING применяются к сгруппированным строкам, отбрасывая сгруппированные строки, которые не удовлетворяют ограничению. Как и предложение WHERE, в большинстве баз данных на этом шаге также недоступны псевдонимы.

Ссылки:-


-2

ВЫБОР
ИЗ
JOIN и
WHERE
GROUP BY
HAVING
ORDER BY


13
На самом деле это неправильно. Согласно утвержденным инструкторам MS и официальным обучающим материалам, Order By следует за Select. Довольно логично, если подумать. Было бы глупо заказывать виртуальный стол, который вы еще не привезли и не приклеили. :)
simme
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.