참조 : 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는 어렵다 어려워;;