Filtrando com HAVING

Melhorando o Desempenho de Consultas no SQL Server

Dean Smith

Founder, Atamai Analytics

Ordem de processamento do HAVING

1.  FROM
4.  WHERE
6.  HAVING
7.  SELECT
Melhorando o Desempenho de Consultas no SQL Server

Agrupando com filtro WHERE na linha

SELECT Team, 
    SUM(TotalPoints) AS TotalSGTeamPoints
FROM PlayerStats
WHERE Position = 'SG'
GROUP BY Team
Team TotalSGTeamPoints
ATL 2034
BOS 1606
BRK 2126
CHI 2905
CHO 2661
CLE 2489
... ...
Melhorando o Desempenho de Consultas no SQL Server

Filtrando linhas com HAVING

SELECT Team, 
    SUM(TotalPoints) AS TotalSGTeamPoints
FROM PlayerStats
WHERE Position = 'SG'
GROUP BY Team
SELECT Team, 
    SUM(TotalPoints) AS TotalSGTeamPoints
FROM PlayerStats
--WHERE Position = 'SG'
GROUP BY Team, Position
HAVING Position = 'SG'

Não use HAVING para filtrar linhas individuais ou não agrupadas

Team TotalSGTeamPoints
ATL 2034
BOS 1606
BRK 2126
CHI 2905
CHO 2661
CLE 2489
... ...
Melhorando o Desempenho de Consultas no SQL Server

Agregando por grupo

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
GROUP BY Team;
Team TotRebounds TotDef TotOff
ATL 3436 2693 743
BOS 3645 2878 767
BRK 3644 2852 792
CHI 3663 2873 790
CHO 3728 2901 827
CLE 3455 2761 694
... ... ... ...
Melhorando o Desempenho de Consultas no SQL Server

Filtrando grupos com WHERE

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
WHERE ORebound >= 1000
GROUP BY Team;
  • Use WHERE para filtrar linhas individuais e HAVING para um filtro numérico em linhas agrupadas
Team TotRebounds TotDef TotOff
Melhorando o Desempenho de Consultas no SQL Server

Sem função de agregação

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
GROUP BY Team
HAVING ORebound >= 1000;
  • Aplique o filtro HAVING a uma coluna numérica usando uma função de agregação
------------------------------------------------
-- ERROR
Column 'PlayerStats.ORebound' is invalid in the 
HAVING clause because it is not contained in 
either an aggregate function or the GROUP BY 
clause.
Melhorando o Desempenho de Consultas no SQL Server

Com função de agregação

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotalOff
FROM PlayerStats
GROUP BY Team
    -- aggregate function SUM()
HAVING SUM(ORebound) >= 1000; 
Team TotRebounds TotDef TotOff
OKC 3695 2671 1024
Melhorando o Desempenho de Consultas no SQL Server

Resumo

  • Não use HAVING para filtrar linhas individuais ou não agrupadas
  • Use WHERE para filtrar linhas individuais e HAVING para filtro numérico em linhas agrupadas
  • HAVING só pode ser aplicado a uma coluna numérica em um filtro com função de agregação
Melhorando o Desempenho de Consultas no SQL Server

Vamos praticar!

Melhorando o Desempenho de Consultas no SQL Server

Preparing Video For Download...