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 WHEREdefinir um filtro de linha antes do agrupamento e, com a ajuda, HAVINGvocê 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
HAVINGsó 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 LIMITe OFFSET.
GO TO FULL VERSION