Chapter 4: Summarizing and Grouping Data
참조 : The Programmer's Guide to SQL
- 레코드 갯수 세기
- COUNT(*) : 모든 레코드 갯수
- COUNT(DISTINCT 컬럼) : 해당 컬럼의 값이 NULL이 아니고 중복되지 않는 레코드 갯수
- COUNT(ALL 컬럼) : COUNT(컬럼) 형태로 쓰면 default로 ALL을 붙여서 사용함. 중복 허용.
- 합계 구하기
- SUM(DISTINCT 컬럼)
- SUM(ALL 컬럼)
- 평균 구하기
- AVG(컬럼)
- 오라클은 숫자 타입이 NUMBER라서 정수가 아닌 수도 담을 수 있다. 따라서 정수만 담긴 컬럼의 평균 값이 소수가 나올 수 있다.
- 최소/최대값 구하기
- MIN(컬럼)
- MAX(컬럼)
- 그룹핑 하기
- SELECT ColumnA, AggFunc(AggFuncSpec) FROM Table
WHERE WhereSpec
GROUP BY ColumnA; - 주의할 것 : SELELT 절에 있는 ColumnA는 써도 되고 안 써도 되지만, 다른 컬럼은 쓰면 안 됌.
- 그룹핑 후에 조건 주기
- SELECT StudentID, AVG(Mark) AS AverageMark
FROM StudentExam
GROUP BY StudentID
HAVING AVG(Mark) < 50 OR AVG(Mark) > 70; - WHERE 절은 그룹핑 하기 전에 실행되기 때문에, 그룹핑의 결과를 다룰 수는 없슴.
- 따라서 HAVING을 사용하여 그룹핑 후에 조건을 줄 수 있슴.
- 상위에서 N개의 레코드 가져오기
- 오라클의 ROWNUM 사용하기.
- SELECT StudentID, AverageMark FROM (
SELECT StudentID, AVG(Mark) AS AverageMark
FROM StudentExam
GROUP BY StudentID
ORDER BY AverageMark DESC
)
WHERE ROWNUM <= 5; - ROWNUM 키워드는 WHERE 절에서만 사용할 수 있다.
- 랭킹 매기기
- 오라클에서 RANK() OVER () 사용하기
- SELECT Ranking, StudentID, AverageMark FROM (
SELECT RANK() OVER (ORDER BY AVG(Mark) DESC) AS Ranking,
StudentID, AVG(Mark) AS AverageMark
FROM StudentExam
GROUP BY StudentID)
WHERE Ranking <= 4; - 소수점 이하를 모두 버렸을 때, 순위를 매기면 누가 더 높은 것인지 알 수 있다.
- Analytic Functions
- 함수() OVER () 문법으로 SQL 표준은 아닌데 오라클에서 사용 가능한 문법.
- SELECT StudentID, Mark, AVG(Mark) OVER
(PARTITION BY StudentID
ORDER BY StudentID, Mark) Running_Avg_by_Student
FROM StudentExam
ORDER BY StudentID, Mark; - OVER는 어렵다 어려워;;