Фільтрування за HAVING

Покращення продуктивності запитів у SQL Server

Dean Smith

Founder, Atamai Analytics

Порядок обробки HAVING

1.  FROM
4.  WHERE
6.  HAVING
7.  SELECT
Покращення продуктивності запитів у SQL Server

Групування з рядковим фільтром WHERE

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
... ...
Покращення продуктивності запитів у SQL Server

Фільтрування рядків через 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'

Не використовуйте HAVING для фільтрації окремих або не згрупованих рядків

Team TotalSGTeamPoints
ATL 2034
BOS 1606
BRK 2126
CHI 2905
CHO 2661
CLE 2489
... ...
Покращення продуктивності запитів у SQL Server

Агрегування за групою

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
... ... ... ...
Покращення продуктивності запитів у SQL Server

Фільтрація груп через WHERE

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
WHERE ORebound >= 1000
GROUP BY Team;
  • Використовуйте WHERE для фільтрації окремих рядків, а HAVING — для числового фільтра по згрупованих рядках
Team TotRebounds TotDef TotOff
Покращення продуктивності запитів у SQL Server

Без агрегатної функції

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
GROUP BY Team
HAVING ORebound >= 1000;
  • Застосовуйте фільтр HAVING до числового стовпця через агрегатну функцію
------------------------------------------------
-- 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.
Покращення продуктивності запитів у SQL Server

З агрегатною функцією

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
Покращення продуктивності запитів у SQL Server

Підсумок

  • Не використовуйте HAVING для фільтрації окремих або не згрупованих рядків
  • Використовуйте WHERE для окремих рядків, а HAVING — для числового фільтра по згрупованих рядках
  • HAVING можна застосувати лише до числового стовпця в фільтрі з агрегатною функцією
Покращення продуктивності запитів у SQL Server

Давайте потренуємось!

Покращення продуктивності запитів у SQL Server

Preparing Video For Download...