HAVING ile filtreleme

SQL Server'da Sorgu Performansını İyileştirme

Dean Smith

Founder, Atamai Analytics

HAVING işlem sırası

1.  FROM
4.  WHERE
6.  HAVING
7.  SELECT
SQL Server'da Sorgu Performansını İyileştirme

WHERE ile satır filtresiyle gruplama

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'da Sorgu Performansını İyileştirme

HAVING ile satır filtreleme

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 ifadesini tekil veya gruplandırılmamış satırları filtrelemek için kullanmayın

Team TotalSGTeamPoints
ATL 2034
BOS 1606
BRK 2126
CHI 2905
CHO 2661
CLE 2489
... ...
SQL Server'da Sorgu Performansını İyileştirme

Gruba göre toplulaştırma

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'da Sorgu Performansını İyileştirme

WHERE ile grup filtreleme

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
WHERE ORebound >= 1000
GROUP BY Team;
  • Tekil satırları filtrelemek için WHERE, gruplandırılmış satırlarda sayısal filtre için HAVING kullanın
Team TotRebounds TotDef TotOff
SQL Server'da Sorgu Performansını İyileştirme

Toplu fonksiyon olmadan

SELECT 
    Team, 
    SUM(DRebound+ORebound) AS TotRebounds,
    SUM(DRebound) AS TotDef,
    SUM(ORebound) AS TotOff
FROM PlayerStats
GROUP BY Team
HAVING ORebound >= 1000;
  • HAVING filtresini bir toplu (aggregate) fonksiyonla sayısal bir sütuna uygulayın
------------------------------------------------
-- HATA
'HAVING' ifadesinde 'PlayerStats.ORebound' sütunu
geçersizdir; çünkü bir toplu fonksiyonda ya da
GROUP BY ifadesinde yer almıyor.
SQL Server'da Sorgu Performansını İyileştirme

Toplu fonksiyonla

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'da Sorgu Performansını İyileştirme

Özet

  • HAVING ifadesini tekil veya gruplandırılmamış satırları filtrelemek için kullanmayın
  • Tekil satırlar için WHERE, gruplandırılmış satırlarda sayısal filtre için HAVING kullanın
  • HAVING yalnızca bir toplu fonksiyondaki sayısal sütuna uygulanabilir
SQL Server'da Sorgu Performansını İyileştirme

Hadi pratik yapalım!

SQL Server'da Sorgu Performansını İyileştirme

Preparing Video For Download...