НАЛИЧИЕ определяет условие поиска для группы или агрегатной функции, используемой в операторе SELECT.
В Агрегатном запросе (Любой запрос, Где агрегатная функция используется) Предикаты в, где пункт оценены, прежде чем агрегированный промежуточный набор результатов сгенерирован,
, Предикаты в пункте Наличия применяются к набору итогового результата ПОСЛЕ ТОГО, КАК это было сгенерировано. Вот почему условия предиката на итоговых значениях должны быть помещены в Наличие пункта, не в оператор Where, и почему можно использовать псевдонимы, определенные в Избранном пункте в Пункте Наличия, но не в операторе Where.
ГДЕ применяется как ограничение, на съемочной площадке возвращенное SQL; это использует встроенный набор SQL oeprations и индексы и поэтому является самым быстрым способом отфильтровать наборы результатов. Всегда используйте ГДЕ, когда это возможно.
НАЛИЧИЕ необходимо для некоторых совокупных фильтров. Это фильтрует запрос ПОСЛЕ ТОГО, КАК sql получил, собрал и отсортировал результаты. Поэтому это намного медленнее, чем, ГДЕ и должен избежаться кроме тех ситуаций, которые требуют его.
SQL Server позволит Вам сойти с рук использование НАЛИЧИЯ даже когда, ГДЕ было бы намного быстрее. Не делайте этого.
HAVING
используется, когда Вы используете агрегат такой в качестве GROUP BY
.
SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
Пункт НАЛИЧИЯ был добавлен к SQL, потому что, ГДЕ ключевое слово не могло использоваться с агрегатными функциями.
Выезд этот ссылка w3schools для получения дополнительной информации
Синтаксис:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
<час> запрос А, такой как это:
SELECT column_name, COUNT( column_name ) AS column_name_tally
FROM table_name
WHERE column_name < 3
GROUP
BY column_name
HAVING COUNT( column_name ) >= 3;
... может быть переписан с помощью полученной таблицы (и опустив HAVING
) как это:
SELECT column_name, column_name_tally
FROM (
SELECT column_name, COUNT(column_name) AS column_name_tally
FROM table_name
WHERE column_name < 3
GROUP
BY column_name
) pointless_range_variable_required_here
WHERE column_name_tally >= 3;
НАЛИЧИЕ: используется для проверки условий после , агрегирование происходит.
, ГДЕ: используется для проверки условий прежде , агрегирование происходит.
Этот код:
select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Дает Вам таблицу всех городов в MA и количестве адресов в каждом городе.
Этот код:
select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5
Дает Вам таблицу городов в MA больше чем с 5 адресами и количеством адресов в каждом городе.
От здесь .
стандарт SQL требует, чтобы НАЛИЧИЕ сослалось только на столбцы в пункте GROUP BY или столбцы, используемые в агрегатных функциях
в противоположность оператору Where, который применяется к строкам базы данных
Я использую НАЛИЧИЕ для ограничения запроса на основе результатов агрегатной функции. НАПРИМЕР, выберите * в и тому подобное группе ЧЕМ-ТО имеющим количество (ЧТО-ТО)> 0