Filteren met HAVING

De queryprestaties verbeteren in SQL Server

Dean Smith

Founder, Atamai Analytics

Verwerkingsvolgorde van HAVING

1.  FROM
4.  WHERE
6.  HAVING
7.  SELECT
De queryprestaties verbeteren in SQL Server

Groeperen met WHERE-rijfilter

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
... ...
De queryprestaties verbeteren in SQL Server

Rijfilteren met 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'

Gebruik HAVING niet om individuele of niet-gegroepeerde rijen te filteren

Team TotalSGTeamPoints
ATL 2034
BOS 1606
BRK 2126
CHI 2905
CHO 2661
CLE 2489
... ...
De queryprestaties verbeteren in SQL Server

Aggregatie per groep

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
... ... ... ...
De queryprestaties verbeteren in SQL Server

Groepsfilteren met WHERE

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
WHERE ORebound >= 1000
GROUP BY Team;
  • Gebruik WHERE voor individuele rijen en HAVING voor een numerieke filter op gegroepeerde rijen
Team TotRebounds TotDef TotOff
De queryprestaties verbeteren in SQL Server

Zonder aggregatiefunctie

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
GROUP BY Team
HAVING ORebound >= 1000;
  • Pas de HAVING-filter toe op een numerieke kolom met een aggregatiefunctie
------------------------------------------------
-- ERROR
Kolom 'PlayerStats.ORebound' is ongeldig in de 
HAVING-clausule omdat deze niet is opgenomen in 
een aggregatiefunctie of de GROUP BY-
clausule.
De queryprestaties verbeteren in SQL Server

Met aggregatiefunctie

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
De queryprestaties verbeteren in SQL Server

Samenvatting

  • Gebruik HAVING niet voor individuele of on-gegroepeerde rijen
  • Gebruik WHERE voor individuele rijen en HAVING voor een numerieke filter op gegroepeerde rijen
  • HAVING kan alleen op een numerieke kolom met een aggregatiefunctie worden toegepast
De queryprestaties verbeteren in SQL Server

Laten we oefenen!

De queryprestaties verbeteren in SQL Server

Preparing Video For Download...