SQL: использование, ГДЕ И вместо НАЛИЧИЯ

вот пример SQL-оператора, где мы используем HAVING:

select column1 from table1
where condition1
having condition2;

не это та же точная вещь, если мы делаем это:

select column1 from table1
where condition1 AND condition2;

каково различие между этими двумя?

10
задан l--''''''---------'''''''''''' 1 July 2010 в 16:28
поделиться

9 ответов

В вашем примере они должны делать одно и то же. Но WHERE обрабатывается до любой GROUP BY, и поэтому у него нет доступа к агрегированным значениям (то есть результатам Min(), Max() и т.д. функций). HAVING обрабатывается после GROUP BY и поэтому может использоваться для ограничения набора результатов только теми агрегированными значениями, которые соответствуют определенному предикату.

20
ответ дан 3 December 2019 в 13:43
поделиться

, чтобы использовать предложение group by. вы получите сообщение об ошибке без него

-1
ответ дан 3 December 2019 в 13:43
поделиться

HAVING предназначен для использования с агрегатами, например, HAVING SUM (column1)> 200 , WHERE предназначен только для столбцов, например, WHERE column1 < 20 .

6
ответ дан 3 December 2019 в 13:43
поделиться

Нет, они совсем другие.

Наличие условий - для группировки агрегатных функций. Они вычисляются после вычисления агрегированного значения.

Пример:

select id, count(1) 
  from table
 where COND1
 having count(1) > 1

Здесь , имеющая часть, оценивается после того, как запрос вычисляет значение count (1) для каждой группы.

4
ответ дан 3 December 2019 в 13:43
поделиться

Как другие (в основном) правильно заявили, в 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) Хью Дарвена, из которого я позаимствовал приведенные выше примеры.

3
ответ дан 3 December 2019 в 13:43
поделиться

В вашем примере это то же самое, потому что у вас нет GROUP BY

В противном случае HAVING применяется после GROUP BY, которая применяется после WHERE...

Говоря это, HAVING с простым фильтром (x = 2) является точно таким же, как WHERE, потому что x = 2 имеет смысл, только если вы сгруппировали по нему. Обычно вы используете HAVING на агрегате (COUNT(*) > 2, например), который может быть применен только после GROUP BY

4
ответ дан 3 December 2019 в 13:43
поделиться

Нет, потому что наличие предназначено для агрегатных функций или группового предложения.

Например:

SELECT COUNT(ID)
FROM tablexpto
where name = 'a'
having count(ID) > 1

Первый запрос не выполняется.

3
ответ дан 3 December 2019 в 13:43
поделиться

HAVING определяет условие поиска для группы или агрегатной функции, используемой в операторе SELECT.

Предложение HAVING похоже на предложение WHERE, но применяется только к группам в целом, тогда как предложение WHERE применяется к отдельным строкам.

Having http://blog.sqlauthority.com/2007/07/04/sql-server-definition-comparison-and-difference-between-having-and-where-clause/

2
ответ дан 3 December 2019 в 13:43
поделиться

Having работает только с клаузулой group by и ограничивает записи после их группировки.

1
ответ дан 3 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: