CS/DB

DML : 단일 테이블 검색문 (Part 2)

행복한 개복치 2023. 5. 21. 17:49

GROUP BY / HAVING

GROUP BY 절

: 기준 컬럼 값에 따라 튜플을 그룹별로 묶는 기능을 제공

HAVING 절을 추가하여 원하는 특정 그룹만 선택할 수 있음

일반적으로 집계 함수를 같이 사용하여 그룹별 통계치를 생성함

GROUP BY 절이 생성하는 임시 테이블

표준 SQL

  • GROUP BY 절을 실행하면 “그룹핑 기준 컬럼” 과 “집계 함수 기준 컬럼” 만으로 구성된 임시 테이블을 메모리에 생성함
  • 메모리에 없는 컬럼은 SELECT 절에서 사용할 수 없음

MySQL

  • 모든 컬럼을 메모리에 저장하도록 제어할 수 있음 (ONLY_FULL_GROUP_BY 모드를 제거)
  • 모든 컬럼을 메모리에 저장할 경우, 이 컬럼들을 SELECT 절에서 사용 가능함
  • 그러나 대부분의 경우 기준 컬럼 이외의 컬럼 사용은 의미 없음

집계 함수(Aggregate Functions)

: 다중행 내장 함수의 한 형태로, 다양한 통계치를 계산해줌

주요 함수

  • COUNT(*) : PK 컬럼 값의 개수
  • COUNT([DISTINCT] 컬럼) : NULL 값을 제외한 컬럼 값의 개수
  • SUM(컬럼) : NULL 값을 제외한 컬럼 값의 합계
  • AVG(컬럼) : NULL 값을 제외한 컬럼 값의 평균
  • MIN(컬럼) : NULL 값을 제외한 컬럼 값의 최소값
  • MAX(컬럼) : NULL 값을 제외한 컬럼 값의 최대값
  • STDDEV(컬럼) : NULL 값을 제외한 컬럼 값의 표준편차
  • VARIAN(컬럼) : NULL 값을 제외한 컬럼 값의 분산
  • GROUP_CONCAT([DISTINCT] 컬럼) : NULL 값을 제외한 컬럼 값을 모두 콤마(,)로 연결한 문자열 생성 (비표준 함수)

⚠️ 주의점

  1. 집계 함수는 WHERE 절에 사용할 수 없음 (HAVING 절에는 가능)
  • WHERE 절의 튜플 조건식은 한 개 튜플에서 얻을 수 있는 값으로만 서술해야 함
  1. 집계 함수는 중첩을 허용하지 않음

GROUP_CONCAT()

: 기준 컬럼의 값들을 모두 연결하여, 하나의 문자열 리스트 생성

GROUP_CONCAT( [DISTINCT] 컬럼
              [ORDER BY 컬럼 [ASC|DESC]]
              [SEPARATOR str] )

[예시]

모든 지점을 한 줄에 출력. 단, 지점은 오름차순으로 나열하며 콤마와 공백 문자로 구분함

SELECT GROUP_CONCAT(city ORDER BY city ASC SEPARATOR ', ') AS '지점 리스트'
FROM offices;

HAVING 절

: GROUP BY 절로 생성한 그룹 중, HAVING 절의 그룹 조건식을 만족하는 특정 그룹만 선택함

HAVING 절의 그룹 조건식에서 사용할 수 있는 컬럼

: GROUP BY 절에 의해 생성되는 임시 테이블의 컬럼만 가능함 (표준 SQL)

  • GROUP BY 절의 그룹핑 기준 컬럼
  • SELECT 절의 집계 함수 기준 컬럼을 이용한 (새로운) 집계 함수

💡 그룹 조건식에 집계 함수가 없는 경우, WHERE 절 사용이 더 효율적임

WHERE 절과 HAVING 절의 차이

  • WHERE 절은 튜플을 필터링
  • HAVING 절은 그룹을 필터링

ORDER BY

: 기준 컬럼 값을 이용하여 튜플을 정렬함

  • 오름차순(ASC), 내림차순(DESC)
  • 컬럼명 대신 컬럼 별칭이나 컬럼 위치도 가능

⚠️ GROUP BY 절을 같이 사용할 경우,
ORDER BY 절에는 SELECT 절의 컬럼 리스트에 없는 컬럼을 사용할 수 없음
(단, MySQL에서는 에러없이 실행됨)

컬럼 위치

: SELECT 절의 컬럼 리스트에 나오는 컬럼의 순서

[예시]

SELECT employeeId, name 성명, jobTitle, officeCode
FROM employees
// ORDER BY officeCode DESC, 성명;
ORDER BY 4 DESC, 2;

LIMIT 절

: SELECT 문이 출력하는 튜플의 최대 개수를 제한함

MySQL의 경우, 디폴트 값은 1000

동점자 처리 기능은 없음

Top-N Query

: 순위(등수)가 높은 n개의 튜플을 검색

  • 동점자 처리 기능을 제공해야 함
  • ORDER BY 절은 사용할 수 없음
    • SELECT 문에서 데이터를 먼저 검색한 후 검색 결과에 대해 정렬 작업을 실행하기 때문

윈도우 함수

  • ROW_NUMBER() 함수 : 튜플에 일련번호 부여(1부터 시작), pagination에 활용
  • RANK() 함수 : 튜플 순위 제공(1부터 시작), 동점자 처리

⚠️ - 윈도우 함수는 SELECT 절에서만 사용함
(WHERE 절, GROUP BY 절에서는 사용 불가)

[예시]

SELECT row_number() over (order by msrp desc) 행번호, name, msrp, rank() over (order by msrp desc) 순위
from s_products
order by msrp desc
limit 25;