Какова последовательность выполнения предложений 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

Md. Suman Kabir
источник
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

AdaTheDev
источник
Очень хорошее объяснение, с которым вы связались :-).
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.

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

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

  1. ОТ И ПРИСОЕДИНЯЙТЕСЬ
  2. ГДЕ
  3. ГРУППА ПО
  4. ИМЕЕТ
  5. ВЫБРАТЬ
  6. СОРТИРОВАТЬ ПО
  7. LIMIT
GimmicksWorld
источник
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

OcTella
источник
13
На самом деле это неправильно. Согласно утвержденным инструкторам MS и официальным обучающим материалам, Order By следует за Select. Довольно логично, если подумать. Было бы глупо заказывать виртуальный стол, который вы еще не привезли и не приклеили. :)
simme