Lọc với HAVING

Cải thiện hiệu năng truy vấn trong SQL Server

Dean Smith

Founder, Atamai Analytics

Thứ tự xử lý HAVING

1.  FROM
4.  WHERE
6.  HAVING
7.  SELECT
Cải thiện hiệu năng truy vấn trong SQL Server

Nhóm với bộ lọc hàng 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
... ...
Cải thiện hiệu năng truy vấn trong SQL Server

Lọc hàng với 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'

Không dùng HAVING để lọc từng hàng hoặc chưa nhóm

Team TotalSGTeamPoints
ATL 2034
BOS 1606
BRK 2126
CHI 2905
CHO 2661
CLE 2489
... ...
Cải thiện hiệu năng truy vấn trong SQL Server

Tổng hợp theo nhóm

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
... ... ... ...
Cải thiện hiệu năng truy vấn trong SQL Server

Lọc nhóm với WHERE

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
WHERE ORebound >= 1000
GROUP BY Team;
  • Dùng WHERE để lọc từng hàng, và HAVING để lọc số liệu trên các hàng đã nhóm
Team TotRebounds TotDef TotOff
Cải thiện hiệu năng truy vấn trong SQL Server

Khi không dùng hàm tổng hợp

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
GROUP BY Team
HAVING ORebound >= 1000;
  • Áp dụng bộ lọc HAVING lên cột số bằng một hàm tổng hợp
------------------------------------------------
-- 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.
Cải thiện hiệu năng truy vấn trong SQL Server

Khi dùng hàm tổng hợp

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
Cải thiện hiệu năng truy vấn trong SQL Server

Tóm tắt

  • Không dùng HAVING để lọc các hàng riêng lẻ hoặc chưa nhóm
  • Dùng WHERE cho từng hàng và HAVING để lọc số liệu trên các hàng đã nhóm
  • HAVING chỉ áp dụng cho cột số trong bộ lọc có hàm tổng hợp
Cải thiện hiệu năng truy vấn trong SQL Server

Ayo berlatih!

Cải thiện hiệu năng truy vấn trong SQL Server

Preparing Video For Download...