5.1 Declaração TER
Existe outro operador útil no SQL que é usado com GROUP BY
, chamado HAVING
.
Em seu significado, é completamente análogo ao operador WHERE
. Ele permite apenas WHERE
definir um filtro de linha antes do agrupamento e, com a ajuda, HAVING
você pode definir um filtro que é aplicado aos registros após o agrupamento.
A visão geral da consulta ao usar agrupamento e filtragem de resultados de agrupamento é a seguinte:
SELECT columns
FROM table
WHERE condition
GROUP BY columns
HAVING condition
HAVING
só pode ser usado se a solicitação contiver GROUP BY
.
Vamos escrever uma consulta onde exibimos o número de funcionários contratados por ano.
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
E o resultado desta consulta:
contrato_ano | total |
---|---|
2012 | 1 |
2013 | 1 |
2014 | 1 |
2015 | 2 |
2018 | 1 |
E agora excluímos dela os anos em que um ou menos funcionários foram contratados. Exemplo:
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
HAVING total > 1
E o resultado desta consulta:
contrato_ano | total |
---|---|
2015 | 2 |
5.3 Ordem de execução das declarações
Para escrever consultas SQL corretas e eficientes, você precisa entender como elas são executadas pelo servidor SQL.
O procedimento para realizar ações é estritamente regulamentado e não depende do seu desejo. Você não pode reorganizar os operadores e obter uma ordem diferente.
A consulta SQL é executada em vários estágios nesta ordem.
- Estágio 1 - buscando linhas
- Primeiro, todas as linhas da tabela especificada são selecionadas.
- Em seguida, os campos calculados são adicionados a eles.
- E então, de todas as linhas, apenas aquelas que satisfazem a condição permanecem
WHERE
- Fase 2 - agrupamento
- O agrupamento é então aplicado aos resultados.
- Durante o agrupamento, campos como
COUNT(*)
. - Finalmente, um filtro é aplicado ao resultado do agrupamento
HAVING
. - Fase 3 - classificação
- As linhas obtidas nas etapas anteriores são classificadas usando
ORDER BY
.
Finalmente, o resultado pode ser aparado com LIMIT
e OFFSET
.
GO TO FULL VERSION