한줄 요약: 액셀 함수
... 놀랍게도 진짜다. 직접 알아보자.
이름만 봐도 촉이 온다. 말 그대로 갯수를 반환해준다. 언제까지 스크롤 내려서 행의 수를 확인할까.
SELECT COUNT(*)
FROM players;--단, COUNT만 *를 사용할 수 있다! 나머지는 안됨.
--결과: 16564
그렇다면 *가 아닌 birthYear로 한다면 똑같은 결과가 나올까? 어짜피 모든 행은 birthYear 열을 가지니 말이다.
SELECT COUNT(birthYear)
FROM players
--결과: 16323
결과가 다르다. 이유인 즉슨, 이번 시간에 다루는 집계 함수는 NULL을 무시하기 때문이다. 어찌보면 꽤나 좋은 기능.
이번엔 birthCity를 기준으로 잡아보자. 1만여명 선수들의 태어난 도시들이 적혀져 있다. 이때 이 도시들의 개수를 세고 싶다면 어떻게 할까? 그렇다면 같은 도시에서 태어난 경우를 제외시켜야 한다. 즉 중복을 제거한다는 뜻이다. 이럴 때 사용하는 것이 DISTINCT다.
SELECT COUNT(DISTINCT birthCity)--결과:4427
FROM players;
--SELECT DISTINCT COUNT(birthCity)로 하면 정상적으로 되지 않는다.
결과는 4427이 나온다. 생각보다 도시가 꽤나 많다. DISTINCT의 역할은 앞서 이야기하다 싶이 중복을 제거한다. 그런데 주석에 적힌대로 하면 적용되지 않는 것에 유의해라. 이미 COUNT로 통해 나온 결과가 한 뭉탱이기에 중복 제거가 적용이 안되는 것.
문자만 봐도 합, 평균을 구하는 집계 함수임을 알 수 있다. 우리 예제에선 선수들의 평균 체중(파운드 단위여서 그런지 100단위로 적혀있다.)을 반환하는 쿼리문을 작성해보자.
SELECT AVG(weight)
FROM players;--182
SELECT SUM(weight)/COUNT(weight)
FROM players;--182
이 둘은 같은 결과를 내뱉는다. 당연한 말씀.
여기서 끝내면 심심하니, 만약 weight 값이 NULL인 경우, 0으로 처리하는 조건문을 추가해보자. 이전 시간에 배운 CASE를 활용하면 쉽게 구할 수 있다.
SELECT AVG(CASE WHEN weight is NULL THEN 0 ELSE weight END)
FROM players;--173
정상적으로 처리가 되어 이전과 다르게 173으로 평균이 낮아진 모습이다.
MIN과 MAX도 마찬가지로 쉽게 이용할 수 있다.
SELECT MIN(weight)
FROM players;--65?
65파운드가 나온다...
SELECT MAX(weight)
FROM players;--320???
... 뭔가 DB 값이 이상한게 섞인 듯싶다. 그게 아니고서야 29kg 사람과 145kg 사람이 있다는 뜻인데...
아무튼 간에 여기에 더하여 MIN,MAX는 다른 집계함수와 다르게 문자열이나 날짜 단위에서도 사용할 수 있는 장점이 있다.