Sql where having: Использование предложений HAVING и WHERE в одном запросе — Visual Database Tools

Содержание

Использование предложений HAVING и WHERE в одном запросе — Visual Database Tools



  • Чтение занимает 2 мин

В этой статье

Применимо к: SQL Server (все поддерживаемые версии)

В некоторых экземплярах может понадобиться исключить отдельные строки из групп (с использованием предложения WHERE) до того, как применять условие к группе как к целому (с использованием предложения HAVING).

Предложение HAVING подобно предложению WHERE, но применимо только к целым группам (то есть к строкам в результирующем наборе, представляющим собой группы), тогда как предложение WHERE применимо к отдельным строкам. В запросе могут содержаться оба предложения: WHERE и HAVING. В этом случае:

  • Предложение WHERE применяется сначала к отдельным строкам таблиц или возвращающих табличное значение объектов на панели диаграмм. Группируются только строки, которые удовлетворяют условиям в предложении WHERE.

  • Затем предложение HAVING применяется к строкам в результирующем наборе. Только строки, которые удовлетворяют условиям HAVING, появляются в результирующем запросе. Можно применить предложение HAVING только к тем столбцам, которые появляются в предложении GROUP BY или агрегатной функции.

Например, соединяются таблицы titles и publishers для создания запроса, в котором показана средняя цена книги для группы издателей. Требуется средняя цена книги только определенной группы издателей — например, только издателей в штате Калифорния. При этом нужно показать только те средние цены, которые превышают $10,00.

Первое условие можно задать с помощью предложения WHERE, которое устраняет всех издателей не из Калифорнии перед тем, как начать вычисление средней цены. Второе условие требует предложения HAVING, так как условие основано на результатах группирования и сводных данных. Конечная инструкция SQL может выглядеть следующим образом:

SELECT titles.pub_id, AVG(titles.price)  
FROM titles INNER JOIN publishers  
   ON titles.pub_id = publishers.pub_id  
WHERE publishers.state = 'CA'  
GROUP BY titles.pub_id  
HAVING AVG(price) > 10  

Можно создать оба предложения HAVING и WHERE на панели критериев. По умолчанию любое заданное условие поиска для столбца становится частью предложения HAVING. Однако можно изменить условие, сделав его предложением WHERE.

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

Задание условия WHERE в статистическом запросе

  1. Укажите группы для запроса. Дополнительные сведения см. в статье о группировании строк в результатах запроса.

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

  3. Очистите столбец Вывод , если столбец данных не является частью предложения GROUP BY или не входит в агрегатную функцию.

  4. В столбце Фильтр укажите условие WHERE. Конструктор запросов и представлений добавляет условие в предложение HAVING инструкции SQL.

    Примечание

    В качестве примера данной процедуры показан запрос, соединяющий две таблицы titles и publishers.

    В этой точке в запросе инструкции SQL содержится предложение HAVING:

    SELECT titles.pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    GROUP BY titles.pub_id  
    HAVING publishers.state = 'CA'  
    
  5. В столбце Группировать выберите Where из списка параметров группировки и сводки. Конструктор запросов и представлений удаляет условие из предложения HAVING инструкции SQL и добавляет его в предложение WHERE.

    Инструкция SQL изменяется, теперь она содержит предложение WHERE:

    SELECT titles.pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    WHERE publishers.state = 'CA'  
    GROUP BY titles.pub_id  
    

См. также

Сортировка и группировка результатов запроса
Резюмирование результатов запросов



Команда SELECT Раздел Раздел HAVING — Условия поиска на группу строк — HAVING COUNT и HAVING MIN

Раздел HAVING

Наконец, последним при вычислении табличного выражения используется раздел HAVING (если он присутствует).

Раздел HAVING может осмысленно появиться в табличном выражении только в том случае, когда в нем присутствует раздел GROUP BY. Условие поиска этого раздела задает условие на группу строк сгруппированной таблицы. Формально раздел HAVING может присутствовать и в табличном выражении, не содержащем GROUP BY. В этом случае полагается, что результат вычисления предыдущих разделов представляет собой сгруппированную таблицу, состоящую из одной группы без выделенных столбцов группирования.

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

Поэтому в арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк. Аналогично обстоит дело с подзапросами, входящими в предикаты условия выборки раздела HAVING: если в подзапросе используется характеристика текущей группы, то она может задаваться только путем ссылки на столбцы группирования.

Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть TRUE. В частности, если раздел HAVING присутствует в табличном выражении, не содержащем GROUP BY, то результатом его выполнения будет либо пустая таблица, либо результат выполнения предыдущих разделов табличного выражения, рассматриваемый как одна группа без столбцов группирования.

HAVING COUNT

Выбрать коды товаров, покупаемых более чем одним покупателем:

SELECT stock FROM ordsale GROUP BY stock HAVING COUNT(*) > 1;

HAVING MIN

Получить значения минимального и максимального оклада для клерков каждого отдела, где  самое низкое жалованье составляет менее $1,000:

SELECT deptno, MIN(sal), MAX(sal) FROM emp WHERE job = ‘CLERK’ GROUP BY deptno HAVING MIN(sal)

Руководство по SQL. Элемент HAVING. – PROSELYTE

Для того, чтобы определить условия, по которым записи будут отфильтрованы после выполнения запроса используется ключевое слово HAVING.

Запрос и использованием данного элемента имеет следующий вид:


SELECT колонка1, колонка2
FROM таблица1, таблица2
WHERE [ условия ]
GROUP BY колонка1, колонка2
HAVING [ условия ]
ORDER BY колонка1, колонка2


Пример:

Предположим, что у нас есть таблица developers, которая содержит следующие данные:


+----+-------------------+-----------+------------+--------+
| ID | NAME              | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+-----------+------------+--------+
|  1 | Eugene Suleimanov | Java      |          2 |   2500 |
|  2 | Peter Romanenko   | Java      |          3 |   3500 |
|  3 | Andrei Komarov    | C++       |          3 |   2500 |
|  4 | Konstantin Geiko  | C#        |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX     |          2 |   1800 |
|  7 | Ivan Ivanov       | C#        |          1 |    900 |
|  8 | Ludmila Geiko     | UI/UX     |          2 |   1800 |
+----+-------------------+-----------+------------+--------+


Теперь попробуем выполнить следующий запрос:


mysql> SELECT ID, NAME, SPECIALTY, SALARY 
FROM developers 
GROUP BY SPECIALTY 
HAVING COUNT(SPECIALTY) >= 2;


В результате выполнения данного запроса мы получим следующую таблицу:


+----+-------------------+-----------+--------+
| ID | NAME              | SPECIALTY | SALARY |
+----+-------------------+-----------+--------+
|  4 | Konstantin Geiko  | C#        |   2000 |
|  1 | Eugene Suleimanov | Java      |   2500 |
|  5 | Asya Suleimanova  | UI/UX     |   1800 |
+----+-------------------+-----------+--------+


На этом мы заканчиваем изучение элемента HAVING.
В следующей статье мы рассмотрим транзакции.

Предложение SQL HAVING. Язык запросов SQL

Язык запросов SQL. DML.

Предположим, что в предыдущем примере, вы хотели бы увидеть только максимальные суммы приобретений, значения которых выше 90000. Вы не сможете использовать агрегатную функцию в предложении WHERE (если вы не используете подзапрос, описанный ниже), потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции оцениваются в терминах групп строк. Это означает, что вы не сможете сделать что-нибудь подобно следующему:

SELECT BNum, MAX(SSum)
FROM Sells
WHERE MAX(SSum)>90000
GROUP BY BNum

Это будет отклонением от правил SQL. Чтобы увидеть максимальную стоимость приобретений свыше 90000, вы можете использовать предложение HAVING. Предложение HAVING определяет критерии, используемые для удаления определенных групп из вывода после группировки точно также, как предложение WHERE делает это для индивидуальных строк. Правильной командой будет следующая:

SELECT BNum, MAX(SSum)
FROM Sells
GROUP BY BNum
HAVING MAX(SSum)>90000




BnumMAX OF SSum
2192000
1100000

Аргументы в предложении HAVING следуют тем же самым правилам, что и в предложении SELECT, состоящем из команд, использующих GROUP BY, но они должны иметь одно значение на группу вывода. Следующая команда будет запрещена:

SELECT BNum, SDate, MAX(SSum)
FROM Sells
GROUP BY BNum, SDate
HAVING SDate="17.02.01"

Поле SDate не может быть вызвано предложением HAVING, потому что оно может иметь больше чем одно значение на группу вывода. Чтобы избежать такой ситуации, предложение HAVING должно ссылаться только на агрегаты или все множество полей выбранных GROUP BY. Имеется правильный способ сделать вышеупомянутый запрос:

SELECT BNum, MAX(SSum)
FROM Sells
WHERE SDate="17.02.01"
GROUP BY BNum

SQL предложения HAVING

предложения HAVING

Увеличение SQL предложения HAVING, потому что, WHERE ключевое слово нельзя использовать с агрегатными функциями.

Предложения HAVING позволяет фильтровать после каждого набора пакетов данных.

SQL HAVING Синтаксис


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;


Демонстрационная база данных

В этом уроке мы будем использовать w3big образец базы данных.

Ниже приводится выбранные «сайты» таблица данных:

+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
| 3  | 本教程      | http://www.w3big.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
+----+---------------+---------------------------+-------+---------+

Вот данные «access_log» веб-сайт записи доступа к таблице:

mysql> SELECT * FROM access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   2 |       3 |   100 | 2016-05-13 |
|   3 |       1 |   230 | 2016-05-14 |
|   4 |       2 |    10 | 2016-05-14 |
|   5 |       5 |   205 | 2016-05-14 |
|   6 |       4 |    13 | 2016-05-15 |
|   7 |       3 |   220 | 2016-05-15 |
|   8 |       5 |   545 | 2016-05-16 |
|   9 |       3 |   201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)


Примеры SQL HAVING

Теперь мы хотим, чтобы найти общее число посещений больше, чем 200 сайтов.

Мы используем следующую инструкцию SQL:

примеров


SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM
(access_log
INNER JOIN Websites
ON
access_log.site_id=Websites.id)
GROUP BY Websites.name
HAVING
SUM(access_log.count) > 200;

Выполнить выше SQL вывода результатов заключаются в следующем:

Теперь мы хотим, чтобы найти общее число посещений больше, чем 200 сайтов, и менее чем 200 тИЦ.

Добавим обычный оператор SQL предложения WHERE:

примеров


SELECT Websites.name, SUM(access_log.count) AS nums FROM
Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id

WHERE Websites.alexa GROUP BY Websites.name
HAVING
SUM(access_log.count) > 200;

Выполнить выше SQL вывода результатов заключаются в следующем:

предложение HAVING « Справочник по Oracle PL/SQL

Предложение HAVING используется в комбинации с предложением GROUP BY. Оно может быть использовано в операторе SELECT для фильтрации записей возвращемых предложением GROUP BY.

Синтаксис предложения HAVING

SELECT column1, column2,.. . column_n, aggregate_function(expression)
  FROM TABLES
 WHERE predicates
 GROUP BY column1, column2,.. . column_n
HAVING condition1 .. . condition_n;

aggregate_function может быть функцией подобной SUM, COUNT, MIN, или MAX.

Пример использования функции SUM
Например, вы можете использовать функцию SUM для поиска названия отдела и суммы продаж (для соответствующих отделов). Предложение HAVING может выбрать только те отделы продажи которых больше $1000.

SELECT department, SUM(sales) AS "Total sales"
  FROM order_details
 GROUP BY department
HAVING SUM(sales) > 1000;

Пример использования функции COUNT
Например, вы можете использовать функцию COUNT для выборки имени отдела и количество сотрудников (в соответствующем отделе) которые заработали более $25000 в год. Предложение HAVING отберет только те отделы, где таких работников более 10.

SELECT department, COUNT(*) AS "Number of employees"
  FROM employees
 WHERE salary > 25000
 GROUP BY department HAVING COUNT(*) > 10;

Пример использования функции MIN
Например, вы можете использовать функцию MIN для возврата названия отдела и минимальный доход этого отдела. Предложение HAVING вернет только те отделы у которых размер выручки начинается с $35000.

SELECT department, MIN(salary) AS "Lowest salary"
  FROM employees
 GROUP BY department
HAVING MIN(salary) = 35000;

Пример использования функции MAX
Например, вы также можете использовать функцию для выборки имени отдела и максимальногй выручки отдела. Предложение HAVING вернет только те отделы, чей максимальный доход менее $50000.

SELECT department, MAX(salary) AS "Highest salary"
  FROM employees
 GROUP BY department
HAVING MAX(salary) < 50000;



Запись опубликована 10.12.2009 в 3:16 дп и размещена в рубрике Книга SQL. Вы можете следить за обсуждением этой записи с помощью ленты RSS 2.0.

Можно оставить комментарий или сделать обратную ссылку с вашего сайта.

Использование предложений HAVING и WHERE в одном запросе — визуальные инструменты для баз данных

  • 3 минуты на чтение

В этой статье

Применимо к: SQL Server (все поддерживаемые версии)

В некоторых случаях может потребоваться исключить отдельные строки из групп (с помощью предложения WHERE) перед применением условия к группам в целом (с помощью предложения HAVING).

Предложение HAVING похоже на предложение WHERE, но применяется только к группам в целом (то есть к строкам в результирующем наборе, представляющем группы), тогда как предложение WHERE применяется к отдельным строкам. Запрос может содержать как предложение WHERE, так и предложение HAVING. В этом случае:

  • Предложение WHERE сначала применяется к отдельным строкам в таблицах или возвращающим табличное значение объектам на панели «Диаграмма». Группируются только те строки, которые соответствуют условиям в предложении WHERE.

  • Затем к строкам в наборе результатов применяется предложение HAVING.В выходных данных запроса отображаются только группы, удовлетворяющие условиям HAVING. Вы можете применить предложение HAVING только к столбцам, которые также присутствуют в предложении GROUP BY или в агрегатной функции.

Например, представьте, что вы объединяете заголовков, и publishers, таблицы, чтобы создать запрос, показывающий среднюю стоимость книги для группы издателей. Вы хотите увидеть среднюю цену только для определенной группы издателей — возможно, только для издателей в штате Калифорния.И даже в этом случае вы хотите видеть среднюю цену, только если она превышает 10 долларов США.

Вы можете установить первое условие, включив предложение WHERE, которое отбрасывает всех издателей, не находящихся в Калифорнии, перед вычислением средних цен. Второе условие требует предложения HAVING, потому что условие основано на результатах группировки и суммирования данных. Результирующий оператор SQL может выглядеть так:

  ВЫБРАТЬ title.pub_id, AVG (title.price)
ОТ изданий INNER JOIN publishers
   ПО заголовкам.pub_id = publishers.pub_id
ГДЕ publishers.state = 'CA'
ГРУППА ПО заголовкам.pub_id
СРЕДНЯЯ (цена)> 10
  

На панели «Критерии» можно создать как предложения HAVING, так и WHERE. По умолчанию, если вы указываете условие поиска для столбца, это условие становится частью предложения HAVING. Однако вы можете изменить условие на предложение WHERE.

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

Чтобы указать условие WHERE в агрегированном запросе

  1. Укажите группы для вашего запроса. Дополнительные сведения см. В разделе «Групповые строки в результатах запроса».

  2. Если его еще нет на панели «Критерии», добавьте столбец, на котором будет основываться условие WHERE.

  3. Очистите столбец Output , если столбец данных не является частью предложения GROUP BY или не включен в агрегатную функцию.

  4. В столбце Фильтр укажите условие ГДЕ.Конструктор запросов и представлений добавляет условие в предложение HAVING оператора SQL.

    Примечание

    Запрос, показанный в примере для этой процедуры, объединяет две таблицы: заголовков и издателей .

    На этом этапе запроса оператор SQL содержит предложение HAVING:

      ВЫБРАТЬ title.pub_id, AVG (title.price)
    ОТ изданий INNER JOIN publishers
       ON title.pub_id = publishers.pub_id
    ГРУППА ПО заголовкам.pub_id
    ИМЕЮЩИЕ издателей.состояние = 'CA'
      
  5. В столбце Группировать по выберите Где из списка параметров группировки и сводки. Конструктор запросов и представлений удаляет условие из предложения HAVING в операторе SQL и добавляет его в предложение WHERE.

    Оператор SQL изменяется, чтобы вместо этого включать предложение WHERE:

      ВЫБРАТЬ title.pub_id, AVG (title.price)
    ОТ изданий INNER JOIN publishers
       ON title.pub_id = publishers.pub_id
    ГДЕ издатели.состояние = 'CA'
    ГРУППА ПО заголовкам.pub_id
      

См. Также

Сортировка и группировка результатов запроса
Суммирование результатов запроса

Предложение Have vs Where в SQL

Разница между предложением Have и where в SQL состоит в том, что предложение where не может использоваться с агрегатами, а предложение Have может использоваться.

, где предложение работает с данными строки, а не с агрегированными данными. Рассмотрим нижеприведенную таблицу «Знаки».

Оценка студента по курсу

a c1 40

a c2 50

b c3 60

d c1 70

e c2 80

Рассмотрим запрос

SELECT Student , Score FROM Marks WHERE Score> = 40

Это позволит выбрать данные по строкам.

Предложение с предложением работает с агрегированными данными.

Например, вывод следующего запроса

ВЫБРАТЬ Студент, СУММ (балл) AS всего ИЗ Баллы GROUP BY Студент

Всего учащихся

a 90

b 60

d 70

e 80

Когда мы применяем указанный выше запрос, мы получаем

SELECT Student , СУМ (балл) AS всего ОТ Оценки ГРУППА ПО Студент

ИМЕЕТ всего> 70

Всего студентов

а 90

д 80 90 017

Примечание. Это не предопределенное правило, но в большом количестве запросов SQL мы используем WHERE до GROUP BY и HAVING после GROUP BY.Предложение Where действует как предварительный фильтр , , а как имеющий — как пост-фильтр .

Напишите, пожалуйста, комментарии, если обнаружите что-то некорректное или хотите поделиться дополнительной информацией по теме, обсуждаемой выше

Вниманию читателя! Не прекращайте учиться сейчас. Получите все важные концепции теории CS для собеседований SDE с помощью курса CS Theory Course по приемлемой для студентов цене и станьте готовым к работе в отрасли.

Разница между предложением Where и Have в SQL

1.Предложение WHERE:
Предложение WHERE используется для фильтрации записей из таблицы или используется при объединении более чем одной таблицы. Будут извлечены только те записи, которые удовлетворяют указанному условию в предложении WHERE. Его можно использовать с операторами SELECT, UPDATE, DELETE.

Рассмотрим ниже таблицу «Студент»

  Roll_no S_Name Возраст 

1 а 17

2 б 20

3 с 21

4 д 18

5 e 20

6 ж 17

7 г 21

8 часов 17 

Рассмотрим запрос:

 ВЫБЕРИТЕ S_Name, Age FROM Student
ГДЕ Возраст> = 18 

ВЫВОД вышеуказанного запроса:

  S_Name Возраст 

б 20

в 21

d 18

e 20

г 21 

2.Предложение HAVING:
Предложение HAVING используется для фильтрации записей из групп на основе заданного условия в предложении HAVING. В конечном результате появятся те группы, которые удовлетворят данному условию. Предложение HAVING может использоваться только
с оператором SELECT.

Давайте рассмотрим таблицу Student, упомянутую выше, и применим к ней условие наличия:

 SELECT Age, COUNT (Roll_No) AS No_of_Students
ИЗ ГРУППЫ УЧЕНИКОВ ПО ВОЗРАСТУ
HAVING COUNT (Roll_No)> 1 

ВЫВОД вышеуказанного запроса:

  Возраст No_Students 

17 3

20 2

21 1 

Разница между предложением Where и Have в SQL:

Предложение HAVING не может использоваться без предложения GROUP BY.

SR.НЕТ. Предложение WHERE Предложение HAVING
1. Предложение WHERE используется для фильтрации записей из таблицы на основе указанного условия. Предложение HAVING используется для фильтрации записей из групп на основе указанного условия.
2. Предложение WHERE можно использовать без предложения GROUP BY.
3. Предложение WHERE реализует операции со строками.
4. Предложение WHERE не может содержать агрегатную функцию Предложение HAVING может содержать агрегатную функцию
5. Предложение WHERE может использоваться с операторами SELECT, UPDATE, DELETE. Предложение HAVING можно использовать только с оператором SELECT.
6. Предложение WHERE используется перед предложением GROUP BY Предложение HAVING используется после предложения GROUP BY
7. Предложение WHERE используется с однорядными функциями, такими как UPPER, LOWER и т. Д. Предложение HAVING используется с многострочными функциями, такими как SUM, COUNT и т. Д.

Внимание, читатель! Не прекращайте учиться сейчас. Изучите SQL для собеседований с помощью курса SQL от GeeksforGeeks.

В чем разница между предложениями WHERE и HAVING?

Из этой статьи вы узнаете, когда использовать WHERE и HAVING. Оба выполняют одинаковые функции, но для разных целей!

Все примеры для этой статьи основаны на Microsoft SQL Server Management Studio и базе данных AdventureWorks2012.Вы можете начать использовать эти бесплатные инструменты, используя мое Руководство по началу работы с SQL Server.

Чем отличаются «Где» и «Имея»?

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

Хотя кажется, что оба предложения делают одно и то же, они делают это по-разному. Фактически, их функции дополняют друг друга.

  • Предложение WHERE используется для фильтрации записей из результата. Фильтр выполняется до того, как будут сделаны какие-либо группировки.
  • Предложение HAVING используется для фильтрации значений из группы.

Прежде чем мы продолжим, давайте рассмотрим формат оператора SQL. Это

 ВЫБРАТЬ
ИЗ
КУДА
ГРУППА ПО
ИМЕЕТ 

Чтобы упростить задачу, мне нравится думать о порядке выполнения операторов SQL сверху вниз. Это означает, что сначала к результату применяется предложение WHERE, а затем остальные строки суммируются в соответствии с GROUP BY.

WHERE пункт

Предложение WHERE используется для фильтрации строк из результатов.Например

 ВЫБРАТЬ СЧЕТЧИК (SalesOrderID)
ОТ Sales.SalesOrderDetail 

Возвращает 121 317 по подсчету, тогда как запрос

 ВЫБРАТЬ СЧЕТЧИК (SalesOrderID)
ОТ Sales.SalesOrderDetail
ГДЕ UnitPrice> 200 

Возвращает 48 159 в качестве счетчика. Это связано с тем, что предложение WHERE отфильтровывает из результатов 73 158 SalesOrderDetails, UnitPrice которых меньше или равно 200.

ИМЕЕТ Пункт

Предложение HAVING используется для фильтрации значений в GROUP BY.Вы можете использовать их для фильтрации таких групп, как

 ВЫБЕРИТЕ SalesOrderID,
         SUM (UnitPrice * OrderQty) КАК TotalPrice
ОТ Sales.SalesOrderDetail
ГРУППА ПО SalesOrderID
ИМЕЮТ SalesOrderID> 50000 

Но их истинная сила заключается в их способности сравнивать и фильтровать результаты агрегированных функций. Например, вы можете выбрать все заказы на сумму более 10 000 долларов США

 ВЫБЕРИТЕ SalesOrderID,
         SUM (UnitPrice * OrderQty) КАК TotalPrice
ОТ ПРОДАЖ.SalesOrderDetail
ГРУППА ПО SalesOrderID
ИМЕЕТ СУММУ (UnitPrice * OrderQty)> 10000 

Поскольку предложение WHERE отображается по одной строке за раз, у него нет способа оценить СУММ по всем SalesOrderID. Предложение HAVING оценивается после создания группировки.

Объединение двух: ГДЕ и ИМЕЕТ

Если в операторах SQL есть и предложение WHERE, и предложение HAVING, помните, что сначала применяется предложение WHERE, затем группируются результаты и, наконец, группы фильтруются в соответствии с предложением HAVING.

Во многих случаях вы можете поместить условие WHERE в предложение HAVING, например

 ВЫБЕРИТЕ SalesOrderID,
         SUM (UnitPrice * OrderQty) КАК TotalPrice
ОТ Sales.SalesOrderDetail
ГРУППА ПО SalesOrderID
ИМЕЕТ СУММУ (UnitPrice * OrderQty)> 10000
         И SalesOrderID> 50000 

против

 ВЫБЕРИТЕ SalesOrderID,
         SUM (UnitPrice * OrderQty) КАК TotalPrice
ОТ Sales.SalesOrderDetail
ГДЕ SalesOrderID> 50000
ГРУППА ПО SalesOrderID
ИМЕЕТ СУММУ (UnitPrice * OrderQty)> 10000 

Если вы можете поместить условие из предложения where в предложение Have, тогда зачем вообще беспокоиться о WHERE? Могу я просто использовать этот запрос?

 ВЫБЕРИТЕ SalesOrderID,
         SUM (UnitPrice * OrderQty) КАК TotalPrice
ОТ ПРОДАЖ.SalesOrderDetail
ГРУППА ПО SalesOrderID
ИМЕЕТ СУММУ (UnitPrice * OrderQty)> 10000 И LineTotal> 10 

На самом деле этот запрос вызывает ошибку. Столбец LineTotal не является ни частью группы по списку полей, ни результатом совокупного итога.

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

Чтобы запрос был действительным, его необходимо переписать как

 ВЫБЕРИТЕ SalesOrderID,
         SUM (UnitPrice * OrderQty) КАК TotalPrice
ОТ ПРОДАЖ.SalesOrderDetail
ГДЕ LineTotal> 100
ГРУППА ПО SalesOrderID
ИМЕЕТ СУММУ (UnitPrice * OrderQty)> 10000 

Подводя итог разнице между WHERE и HAVING:

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

Разница между предложениями WHERE и HAVING в SQL? Пример

Основное различие между предложениями WHERE и HAVING возникает при использовании вместе с предложением GROUP BY.В этом случае WHERE используется для фильтрации строк перед группировкой, а HAVING используется для исключения записей после группировки. Это самое важное отличие, и если вы его запомните, это поможет вам лучше писать SQL-запросы. Это также одна из важных концепций SQL, которую необходимо понять не только с точки зрения собеседования, но и с точки зрения повседневного использования. Я уверен, что вы использовали предложение WHERE, потому что это одно из самых распространенных предложений в SQL вместе с SELECT и используется для указания критериев или условий фильтрации.Вы даже можете использовать предложение WHERE без HAVING или GROUP BY, как вы видели много раз. С другой стороны, HAVING можно использовать только в том случае, если группировка была выполнена с использованием предложения GROUP BY в запросе SQL. Еще одна особенность предложений WHERE и HAVING заключается в том, что предложение WHERE не может содержать агрегатные функции, такие как COUNT (), SUM (), MAX (), MIN () и т. Д., Но предложение HAVING может содержать агрегатные функции.

Также стоит отметить разницу между предложениями WHERE и HAVING в том, что WHERE используется для наложения критерия фильтрации для операторов SELECT, UPDATE, DELETE, а также для функции одной строки и используется перед предложением group by, но HAVING всегда используется после предложения group by.

Если вы начинаете с SQL, то это некоторые из основ, которые вам необходимо изучить, и хороший курс может вам очень помочь. Если вам нужна рекомендация, я предлагаю вам присоединиться к любому из этих лучших онлайн-курсов по SQL и базам данных . В этом списке представлены лучшие курсы с сайтов Udmey, Coursera, Pluralsight и других.

Разница между WHERE и HAVING в SQL

1. Предложение WHERE обрабатывается сразу после предложения FROM в логическом порядке обработки запроса, что означает, что оно обрабатывается до предложения GROUP BY, а предложение HAVING выполняется после создания групп.

2. Если используется в GROUP BY, вы можете ссылаться на любой столбец из таблицы в предложении WHERE, но вы можете использовать только столбцы, которые не сгруппированы или агрегированы.

3. Если вы используете предложение HAVING без group by, оно также может ссылаться на любой столбец, но индекс не будет использоваться в отличие от предложения WHERE. Например, следующий результат имеет тот же набор результатов, однако «where» будет использовать индекс id и выполнить сканирование таблицы

 select * from table where id = 1
выберите * из таблицы с id = 1 

4.Вы можете использовать агрегатную функцию для фильтрации строк с предложением HAVING. Поскольку предложение HAVING обрабатывается после того, как строки были сгруппированы, вы можете ссылаться на агрегатную функцию в логическом выражении. Например, следующий запрос будет отображать только курсы, в которых обучается более 10 студентов:

 SELECT Course, COUNT (Course) как NumOfStudent
ОТ обучения
ГРУППА ПО Курсу
HAVING COUNT (курс)> 10 

5. Еще одно ключевое различие между предложениями WHERE и HAVING состоит в том, что WHERE будет использовать Index, а HAVING — нет; например, следующие два запроса дадут идентичный результат, но WHERE будет использовать Index, а HAVING выполнит сканирование таблицы

 SELECT * FROM Course WHERE Id = 101;
ВЫБЕРИТЕ * ИЗ курса ИМЕЮЩИЙ Id = 102; 

6.Поскольку предложение WHERE оценивается до формирования групп, оно оценивается для каждой строки. С другой стороны, предложение HAVING оценивается после формирования групп; следовательно, он оценивается по группе. Вы также можете ознакомиться с этими бесплатными онлайн-курсами по SQL, чтобы узнать об этом больше.

Когда использовать предложения WHERE и HAVING?

Хотя оба они используются для исключения строк из набора результатов, следует использовать предложение WHERE для фильтрации строк перед группировкой и предложение HAVING для фильтрации строк после группировки.Другими словами, WHERE можно использовать для фильтрации по столбцам таблицы, а HAVING можно использовать для фильтрации по агрегатным функциям, таким как count, sum, avg, min и max.

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

Например, следующий оператор синтаксически верен и дает тот же результат, но второй более эффективен, чем первый, потому что он фильтрует строки перед группировкой:

 SELECT Job, City, State, Count (Employee) from... ИМЕЕТ ...
ВЫБРАТЬ ..... из .. ГДЕ .. 

Вот и все, что касается разницы между предложениями WHERE и HAVING в SQL . Эти различия действительны почти для всех основных баз данных, таких как MySQL, Oracle, SQL Server и PostgreSQL. Просто помните, что WHERE используется для фильтрации строк перед группировкой, а HAVING используется для фильтрации строк после группировки. Вы также можете использовать функцию AGGREGATE вместе с предложением HAVING для фильтрации.

Другие статьи по SQL и вопросы для интервью, которые могут вам понравиться

  • Как объединить более двух таблиц в один запрос (статья)
  • 5 веб-сайтов для БЕСПЛАТНОГО изучения SQL (веб-сайты)
  • 5 бесплатных курсов для изучения базы данных MySQL (курсы)
  • 10 SQL-запросов из интервью (запросов)
  • 5 книг по лучшему изучению SQL (книги)
  • Разница между усечением и удалением в SQL (ответ)
  • Разница между row_number и рангом в SQL? (ответ)
  • 5 бесплатных курсов по базам данных и SQL (курсы)
  • Разница между UNION и UNION ALL в SQL? (ответ)
  • 5 лучших книг по SQL для продвинутых программистов (книги)
  • Разница между SQL, T-SQL и PL / SQL? (ответ)
  • 5 лучших онлайн-курсов по изучению SQL и баз данных (курсы)

Спасибо, что прочитали эту статью.Если вам понравилась эта статья по SQL, поделитесь ею со своими друзьями и коллегами. Если у вас есть какие-либо вопросы или отзывы, напишите нам.

Предложение

SQL HAVING с примерами

Резюме : в этом руководстве вы узнаете, как использовать предложение SQL HAVING для определения условия поиска для группы строк или агрегата.

Введение в предложение SQL HAVING

Предложение HAVING часто используется с предложением GROUP BY в операторе SELECT для фильтрации группы строк на основе указанного условия.Ниже показан синтаксис предложения HAVING :

 

SELECT столбец1, столбец2, агрегатная функция (выражение) ИЗ стол ГРУППА ПО столбцу 1 ИМЕЮЩИЕ состояние;

Предложение HAVING работает так же, как предложение WHERE, если оно не используется с предложением GROUP BY . Разница между предложением HAVING и предложением WHERE состоит в том, что предложение WHERE используется для фильтрации строк, а предложение HAVING используется для фильтрации групп строк.

Давайте рассмотрим несколько примеров использования предложения HAVING.

SQL HAVING examples

Давайте посмотрим на таблицу orderdetails :

SQL HAVING with SUM function example

В этом примере мы найдем заказы на продажу, общая сумма продаж которых превышает 12000 долларов. Мы используем предложение HAVING с предложением GROUP BY , чтобы выполнить это как следующий запрос:

 

SELECT заказ, СУММ (unitPrice * количество) Итого ИЗ Информация для заказа ГРУППА ПО заказу ИМЕЕТ всего> 12000;

Как работает запрос.

  • Сначала для каждой позиции строки заказа SQL вычисляет общую сумму с помощью функции СУММ. (Псевдоним столбца Total используется для форматирования вывода).
  • Во-вторых, предложение GROUP BY группирует выбранные строки по OrderID . Для каждого заказа, у нас есть только одна группа, содержащая OrderID и Total
  • В-третьих, предложение HAVING получает группы, у которых Total больше 12000 .

SQL HAVING with COUNT function example

Следующий запрос выбирает все заказы, в которых есть не менее 5 позиций. Мы используем функцию COUNT с предложениями HAVING и GROUP BY .

 

ВЫБРАТЬ orderID, COUNT (productID) товаров ИЗ Информация для заказа ГРУППА ПО ИДЕНТИФИКАТОРУ ЗАКАЗА ИМЕЮЩИЕ продукты> 5;

Предложение SQL HAVING с примерами функций MAX и MIN

Взгляните на приведенную ниже таблицу продуктов :

Чтобы выбрать самый дорогой продукт в каждой категории, используйте следующий запрос:

 

ВЫБРАТЬ categoryID, productID, productName, MAX (unitprice) ИЗ продукты A КУДА unitprice = ( ВЫБРАТЬ МАКС (цена за единицу) ИЗ продукты B КУДА Б.categoryId = A.categoryID) ГРУППА ПО идентификатору категории;

Обратите внимание, что в предложении WHERE оператора используется подзапрос для получения правильного продукта во внешнем запросе. Для каждой категории, чтобы выбрать самый дорогой продукт, цена которого превышает 100 долларов, мы можем использовать функцию MAX в предложении HAVING следующим образом:

 

SELECT categoryID, productID, productName, MAX (unitprice) ИЗ продукты A КУДА unitprice = ( ВЫБРАТЬ МАКС (цена за единицу) ИЗ продукты B КУДА Б.categoryId = A.categoryID) ГРУППА ПО ИДЕНТИФИКАМ категории ИМЕЮЩИЙ МАКС (цена за единицу)> 100;

Обратите внимание, что выбрана только цена за единицу продукта в целом, превышающую 50 долларов США.

Чтобы выбрать наименее дорогой продукт в каждой категории, мы используем тот же метод, что и самый дорогой продукт в каждой категории, за исключением того, что функция MIN используется вместо функции MAX :

 

SELECT categoryID, productID, productName, MIN (unitprice) ИЗ продукты A КУДА unitprice = ( ВЫБРАТЬ МИН (цена за единицу) ИЗ продукты B КУДА Б.categoryId = A.categoryID) GROUP BY categoryID

Мы можем найти наименее дорогой продукт в каждой категории, цена за единицу которой ниже 5 долларов, используя функцию MIN в предложении HAVING следующим образом:

 

SELECT categoryID, productID, productName, MIN (unitprice) ИЗ продукты A КУДА unitprice = ( ВЫБРАТЬ МИН (цена за единицу) ИЗ продукты B КУДА B.categoryId = A.categoryID) ГРУППА ПО ИДЕНТИФИКАМ категории ИМЕЕТ МИН (цена за единицу) <5;

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

PostgreSQL HAVING

Резюме : в этом руководстве вы узнаете, как использовать предложение PostgreSQL HAVING для определения условия поиска для группы или агрегата.

Введение в предложение HAVING PostgreSQL

Предложение HAVING определяет условие поиска для группы или агрегата.Предложение HAVING часто используется с предложением GROUP BY для фильтрации групп или агрегатов на основе заданного условия.

Следующий оператор иллюстрирует основной синтаксис предложения HAVING :

 

SELECT column1, агрегатная_функция (столбец2) ИЗ table_name ГРУППА ПО column1 ИМЕЮЩИЕ состояние;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом синтаксисе предложение group by возвращает строки, сгруппированные по столбцу column1 .Предложение HAVING определяет условие для фильтрации групп.

Можно добавить другие предложения оператора SELECT , такие как JOIN , LIMIT , FETCH и т. Д.

PostgreSQL оценивает предложение HAVING после FROM , WHERE , GROUP BY и до предложений SELECT , DISTINCT , ORDER BY и LIMIT .

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

HAVING vs. WHERE

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

Другими словами, предложение WHERE применяется к строкам, а предложение HAVING применяется к группам строк.

PostgreSQL HAVING, примеры

Давайте взглянем на таблицу payment в образце базы данных.

1) Использование предложения HAVING в PostgreSQL с примером функции SUM

Следующий запрос использует предложение GROUP BY с функцией SUM () для определения общей суммы каждого клиента:

 

SELECT Пользовательский ИД, СУММА (сумма) ИЗ оплата ГРУППА ПО Пользовательский ИД;

Язык кода: SQL (язык структурированных запросов) (sql)

Следующий оператор добавляет предложение HAVING для выбора единственных клиентов, которые потратили более 200 :

 

SELECT Пользовательский ИД, СУММА (сумма) ИЗ оплата ГРУППА ПО Пользовательский ИД ИМЕЮЩИЕ SUM (сумма)> 200;

Язык кода: SQL (язык структурированных запросов) (sql)

2) Предложение HAVING PostgreSQL с примером COUNT

См. Следующую таблицу customer из образца базы данных:

В следующем запросе используется GROUP BY Пункт , чтобы найти количество покупателей на магазин:

 

ВЫБРАТЬ store_id, COUNT (customer_id) ИЗ покупатель ГРУППА ПО store_id

Язык кода: SQL (язык структурированных запросов) (sql)

Следующий оператор добавляет предложение HAVING для выбора магазина с более чем 300 покупателями:

 

SELECT store_id, COUNT (customer_id) ИЗ покупатель ГРУППА ПО store_id ИМЕЮЩИЕ COUNT (customer_id)> 300;

Язык кода: SQL (язык структурированных запросов) (sql)

Сводка