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

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

11 ответов

Решение

С целью:

ОТ & СОЕДИНЕНИЕ определяет и фильтрует строки
ГДЕ больше фильтров по строкам
GROUP BY объединяет эти строки в группы
HAVING фильтры группы
ORDER BY упорядочивает оставшиеся строки / группы
ФильтрыLIMIT для оставшихся строк / групп

Вот полная последовательность для сервера sql:

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

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

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

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

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

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

Ссылки:-

Я думаю, что это реализовано в движке, как сказал Матиас: ГДЕ, ГРУППА BY, ГЛАВНАЯ

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

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

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

  1. FROM & JOIN
  2. ГДЕ
  3. ГРУППА ПО
  4. HAVING
  5. ВЫБРАТЬ
  6. СОРТИРОВАТЬ ПО
  7. ПРЕДЕЛ

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

Where
Group By
Having

Или же

Where 
Having
Group by

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

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

Заказ ГДЕ, ГРУППА ПО ИЛИ ИМЕЮЩАЯ.

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

Пример: выберите * FROM test_std; ROLL_NO SNAME DOB TEACH


     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 строк выбрано.

выберите учить, считать () считать из test_std, имеющего count ()> 1 группу по TEACH;

УЧИТЬ СЧЕТ


Langer 2 Wills 4

  • ВЫБИРАТЬ
  • ОТ
  • СОЕДИНЕНИЕ (ВНУТРЕННЕЕ, ЛЕВОЕ, ПРАВОЕ, ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ)
  • ГДЕ
  • ГРУППА ПО
  • НАЛИЧИЕ
  • СОРТИРОВАТЬ ПО
  • ПРЕДЕЛ;

ВЫБРАТЬ
ОТ
JOIN и
ГДЕ
Группа по
HAVING
СОРТИРОВАТЬ ПО

Другие вопросы по тегам