강의에서 소개한 집계함수로는 다음과 같다.
COUNT
SUM
AVG
MIN
MAX
위 사진에서 알 수 있는 사실은
집계함수의 특징 중 하나는 NULL값을 무시한다는 것이다.
COUNT(*)를 한 개수와 COUNT(birthYear)를 한 개수가 다른데, 이는 birthYear의 값이 NULL로 저장이 된 경우가 있어서 그렇다.
두번째 사실은 SELECT할때 DISTINCT 키워드를 붙이면 중복된 값을 제외하고 가져오게 되는데, distinct birthCity, birthMonth, birthDay 이렇게 되어 있으면 저 세 열의 값을 한뭉텅이로 보고 중복을 제외한다는 것이다.
GROUP BY를 사용하면 열에서 같은 값을 하나로 묶어버리기 때문에 그룹으로 묶인 각 열들의 다른 행의 값들은 소실된다.
즉,
birthYear | birthMonth
2001 5
2001 6
2001 7
2002 8
2002 9
GROUP BY birthYear로 하면
birthYear
2001
2002
이렇게 묶이게 될 것이고 birthYear가 2001이었던 birthMonth의 5, 6, 7은 2001 하나의 행에 할당될 수 없으므로 잊혀지게 될 것이다.
따라서 집계함수를 사용할때 GROUP BY를 사용하고 GROUP으로 묶어준 열만 SELECT할 수 있다.
GROUP BY teamID, yearID 로 한 경우
BOS 2004
BOS 2004
BOS 2005
BOS 2005
BOS 2006
이렇게 있을떄
GROUP BY teamID
BOS
GROUP BY yearID
2004
2005
2006
GROUP BY teamID, yearID
BOS 2004
BOS 2005
BOS 2006
SELECT teamID, SUM(HR) AS homeRuns
FROM batting
WHERE yearID = 2004
GROUP BY teamID
HAVING SUM(HR) >= 200
ORDER BY homeRuns DESC;
SELECT COUNT(DISTINCT birthCity) FROM players;
SELECT AVG(CASE WHEN weight IS NULL THEN 0 ELSE weight END) FROM players;
SELECT TOP 1 teamID, COUNT(teamID) AS playerCount, SUM(HR) AS homeRuns
FROM batting
WHERE yearID = 2004
GROUP BY teamID
ORDER BY homeRuns DESC;
SELECT teamID, SUM(HR) AS homeRuns
FROM batting
WHERE yearID = 2004
GROUP BY teamID
HAVING SUM(HR) >= 200
ORDER BY homeRuns DESC;
SELECT teamID, yearID, SUM(HR) AS homeRuns
FROM batting
GROUP BY teamID, yearID
ORDER BY homeRuns DESC;