Предисловие: 1.where нельзя размещать после GROUP BY 2. HAVING используется вместе с GROUP BY и ставится после GROUP BY. Функция в настоящее время эквивалентна WHERE 3. В условиях WHERE не может быть агрегатных функций, таких как SUM(), AVG() и т. д., в то время как HAVING может Где и Имея — это своего рода фильтрация результатов запроса, а написанная точка — оператор, задающий условия. Его использование, сходства и различия описаны ниже. Примечание. Поле, используемое в этой статье, представляет собой таблицу emp под пользователем по умолчанию scott в базе данных oracle, sal представляет зарплату сотрудника, а deptno представляет номер отдела.
1. Агрегатная функция
Прежде чем объяснять, давайте сначала разберемся с агрегатными функциями: агрегатные функции иногда называют статистическими функциями, и их функция обычно состоит в том, чтобы выполнять статистику по набору данных, например находить максимальное значение, минимальное значение, общее число и среднее значение. ( MAX, MIN, COUNT, AVG) и т. д. Фундаментальное отличие этих функций от других функций заключается в том, что они обычно работают с несколькими записями. Простой пример: SELECT SUM(sal) FROM emp, где SUM используется для подсчета суммы поля sal (salary) в таблице emp.В результате запрос возвращает только один результат — сумму заработной платы. Используя предложение GROUP BY, функции SUM и COUNT можно заставить работать с данными, принадлежащими группе.
2. где пункт
where используется только для значения, возвращаемого из предложения from, и каждая строка данных, возвращаемых предложением from, будет оценена и отфильтрована по условиям в предложении where. В предложении where разрешены операторы сравнения (>, =, , !=| и т. д.) и логические операторы (и, или, не). Поскольку все знакомы с оператором where, я не буду вдаваться в подробности.
Три, имеющих оговорку
Предложение have обычно используется с предложением order by. Потому что роль have заключается в дополнительной фильтрации результатов группировки статистики с помощью group by. Например: Теперь нужно найти номер отдела, сумма зарплаты которого больше 10000? первый шаг:
select deptno,sum(sal) from emp group by deptno;
Результаты фильтрации следующие:
DEPTNO SUM(SAL)
—— ——-
30 9400
20 10875
10 8750
Мы видим желаемый результат. Но что, если мы хотим, чтобы сумма заработной платы отдела превышала 10 000? Затем я подумал о том, чтобы отфильтровать результаты групповой статистики, чтобы помочь нам завершить ее. Шаг 2:
select deptno,sum(sal) from emp group by deptno having sum(sal)>10000;
Результаты фильтрации следующие:
DEPTNO SUM(SAL)
—— ——-
20 10875
Конечно, этот результат именно то, что мы хотим.
В-четвертых, давайте лучше разберемся в них, сравнив предложение where и предложение have.
В процессе запроса оператор агрегации (сумма, минимум, максимум, среднее, количество) выполняется до предложения наличия.Просто понятно, что я могу выполнять фильтрацию только после статистических результатов. Предложение where выполняется с приоритетом над оператором агрегирования (sum, min, max, avg, count) во время процесса запроса, поскольку оно фильтруется предложение за предложением. Предложение HAVING позволяет нам фильтровать группы данных после фильтрации. , а предложение WHERE фильтрует записи перед объединением. Например: Теперь нам нужны номера отделов, где номер отдела не равен 10, а сумма зарплаты больше 8000? Мы анализируем таким образом: отфильтровываем отделы, номер отдела которых не равен 10, через предложение where, затем подсчитываем заработную плату отдела, а затем используем предложение have для фильтрации статистических результатов.
select deptno,sum(sal) from emp
where deptno!='10' group by deptno
having sum(sal)>8000;
Результаты фильтрации следующие:
DEPTNO SUM(SAL)
—— ——-
30 9400
20 10875
Пять сходств и различий
Их сходство заключается в определении условий поиска, разница в том, что предложение where предназначено для одного фильтра, а предложение has относится к группам, а не к отдельным строкам. И, наконец, лучший способ понять условия наличия и предложения where — это порядок обработки этих предложений в базовом операторе select: предложение where может получать данные, выводимые только предложением from, в то время как предложение have может получать данные из группы с помощью , Вход в предложение where или from.