вот пример SQL-оператора, где мы используем HAVING
:
select column1 from table1
where condition1
having condition2;
не это та же точная вещь, если мы делаем это:
select column1 from table1
where condition1 AND condition2;
каково различие между этими двумя?
В вашем примере они должны делать одно и то же. Но WHERE
обрабатывается до любой GROUP BY
, и поэтому у него нет доступа к агрегированным значениям (то есть результатам Min()
, Max()
и т.д. функций). HAVING
обрабатывается после GROUP BY
и поэтому может использоваться для ограничения набора результатов только теми агрегированными значениями, которые соответствуют определенному предикату.
, чтобы использовать предложение group by. вы получите сообщение об ошибке без него
HAVING
предназначен для использования с агрегатами, например, HAVING SUM (column1)> 200
, WHERE
предназначен только для столбцов, например, WHERE column1 < 20
.
Нет, они совсем другие.
Наличие условий - для группировки агрегатных функций. Они вычисляются после вычисления агрегированного значения.
Пример:
select id, count(1)
from table
where COND1
having count(1) > 1
Здесь , имеющая
часть, оценивается после того, как запрос вычисляет значение count (1) для каждой группы.
Как другие (в основном) правильно заявили, в SQL предложение WHERE
оценивается перед предложением SELECT
, поэтому результат функции набора находится «вне области видимости» в предложение WHERE
.
Например, вы НЕ МОЖЕТЕ сделать это:
SELECT Subject, MAX(Mark) AS TopScore
FROM Exam_Marks
GROUP
BY Subject
WHERE TopScore <= 70;
, потому что имя корреляции столбца TopScore
не входит в область действия предложения WHERE
.
Конечно, мы могли использовать подзапрос:
SELECT DT1.TopScore
FROM (
SELECT Subject, MAX(Mark) AS TopScore
FROM Exam_Marks
GROUP
BY Subject
) AS DT1
WHERE DT1.TopScore <= 70;
Проблема заключалась в том, что ранние реализации SQL (начиная с IBM System R) не поддерживали производные таблицы, поэтому родился неинтуитивный HAVING
.
Вы можете прочитать всю печальную историю в HAVING A Blunderful Time (or Wish You Were WHERE) Хью Дарвена, из которого я позаимствовал приведенные выше примеры.
В вашем примере это то же самое, потому что у вас нет GROUP BY
В противном случае HAVING применяется после GROUP BY, которая применяется после WHERE...
Говоря это, HAVING с простым фильтром (x = 2
) является точно таким же, как WHERE, потому что x = 2
имеет смысл, только если вы сгруппировали по нему. Обычно вы используете HAVING на агрегате (COUNT(*) > 2
, например), который может быть применен только после GROUP BY
Нет, потому что наличие предназначено для агрегатных функций или группового предложения.
Например:
SELECT COUNT(ID)
FROM tablexpto
where name = 'a'
having count(ID) > 1
Первый запрос не выполняется.
HAVING определяет условие поиска для группы или агрегатной функции, используемой в операторе SELECT.
Предложение HAVING похоже на предложение WHERE, но применяется только к группам в целом, тогда как предложение WHERE применяется к отдельным строкам.
Having работает только с клаузулой group by и ограничивает записи после их группировки.