SQL_SQLD_집계함수_GROUP BY 절_HAVING 절_ORDER BY 절

MR.HAN·2024년 1월 29일

SQL

목록 보기
9/10

집계함수


특성

  • 여러 행들의 그룹이 모여서 그룹당 하나의 결과를 돌려주는 함수
  • WHERE 절에 사용할 수 없음.
  • Nested 형태로 사용 불가 (ex. AVG(SUM(표현식)))
  • 보통 GROUP BY 절과 같이 사용되지만, 단독으로도 사용 가능

종류

# NULL 값을 포함한 행의 수
COUNT(*)

# NULL 값을 제외한 행의 수
COUNT(표현식)

# 합계
SUM()

# 평균, 표준편차, 분산
AVG()
STDDEV()
VARIAN()

# 최대, 최소
MAX()
MIN()


GROUP BY 절


특성

  • GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용
  • SELECT 절에 GROUP BY에 명시되어 있지 않은 컬럼을 작성하면 에러 (집계함수를 사용하면 가능)
# 에러 발생
SELECT POSITION, SALARY FROM PLAYER
GROUP BY POSITION;

# 정상 실행
SELECT POSITION, MAX(SALARY) FROM PLAYER
GROUP BY POSITON;
  • 실행 순서 : FROM → GROUP BY → SELECT
  • 집계 함수는 NULL 값을 가진 행을 제외하고 수행 (COUNT(*)는 예외)



HAVING 절


특성

  • GROUP BY 절의 조건을 표시할 수 있음.
  • GROUP BY 절의 집계 데이터 중, 제한 조건을 두어 만족하는 내용만 조회
  • WHERE 절에는 집계 함수를 사용할 수 없지만, HAVING 절에는 가능
    - 만약 집계 함수가 포함되지 않는다면, WHERE 함수를 사용하는 것이 훨씬 효율적임.(먼저 그룹핑 하기 때문)
# 에러 발생
SELECT POSITION AS 포지션, ROUND(AVG(HEIGHT, 2) AS 평균키 FROM PLAYER # 일반 함수 안에는 가능
WHERE AVG(HEIGHT) >= 180 # 에러
GROUP BY POSITION;

# 정상 실행
SELECT POSITION AS 포지션, ROUND(AVG(HEIGHT, 2) AS 평균키 FROM PLAYER
GROUP BY POSITION
HAVING AVG(HEIGHT) >= 180;
  • WHERE 절을 이용하면 결과값이 바뀔 수 있지만, HAVING 절을 이용하면 결과값은 그대로이고 특정 그룹만 제외됨.
  • SELECT 절에서 사용되지 않은 컬럼이나 집계함수 아니더라도 조건절로 사용 가능
SELECT EMP_NO, AVG(SALARY) FROM SALARIES
GROUP BY EMP_NO
HAVING MAX(BONUS) > 7000

작성 순서

SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY

  • GROUP BY 절과 HAVING 절의 위치를 변경해도 결과 동일하나, 허용하지 않는 벤더 존재

실행 순서

FROM & JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

  • 순서는 달라질 수 있음.(논리적인 순서임, 실제 실행 물리적 순서는 옵티마이저에 의해 결정)



NULL 처리


## 집계함수 & NULL 처리 - 다중 행 함수에서 입력값으로 전체 건수가 NULL 값인 경우만 결과가 NULL, 일부만 NULL인 경우 NULL인 행을 함수의 대상에서 제외 - 100명 중 10명의 성적이 NULL 값인 경우, AVG 함수를 사용하면 NULL 값 제외한 90의 성정 평균 산출 - 따라서, NVL(Oracle) | ISNULL(SQL Server) 함수를 사용할 필요 없음. ```sql # 사용할 필요 없음. SUM(NVL(SAL,0)) SUM(ISNULL(SAL,0)) ``` - CASE 표현 사용시 ELSE 절 생략하면 Default 값은 NULL - GROUP BY 절에 지정된 컬럼에 NULL 포함될 경우, NULL끼리 모아서 그룹(행)을 만듦.

ORDER BY 절


특성

  • SELECT 절의 결과를 다양한 형태로 정렬
  • 컬럼명 대신 ALIAS 명, 컬럼 순서 정수 사용 가능
    - 순서 정수 사용 (단, 조회된 결과를 대상으로)
    - 컬럼명 + ALIAS 명
    - 순서 정수 + ALIAS 명
SELECT DNAME AS DEPT, LOC AS AREA, DEPTNO FROM DEPT
ORDER BY 1, AREA, 3 DESC;
  • 오름차순(ACENDING, Default 값), 내림차순(DECENDING)
  • Oracle에서는 NULL 값을 가장 큰 값으로, SQL Server에서는 NULL 값을 가장 작은 값으로 간주
SELECT BIRTH_DATE, FIRST_NAME, LAST_NAME FROM EMPLOYEES
ORDER BY BIRTH_DATE DESC, LAST_NAME;

CASE WHEN 함수 - 우선순위 정렬

  • ORDER BY 절에 CASE WHEN 함수를 사용하여 세밀한 정렬 가능
SELECT * FROM SHOPS
ORDER BY COUNTRY,
	CASE
    	WHEN COUNTRY = 'USA' THEN STATE
        ELSE CITY
    END;
  • 컬럼마다 우선순위를 숫자로 부여하여 정렬
# 처음에 POSITION이 Administrator인 데이터들 NAME으로 정렬
# POSITION이 다른 값이면 상관없이 NAME으로 정렬
SELECT * FROM DEVELOPER
ORDER BY (
	CASE
    	WHEN POSITION = "Administrator" THEN 0
        ELSE 1
    END, NAME);

실행 순서 다시

5) SELECT 컬럼명
1) FROM 테이블명
2) WHERE 조건식
3) GROUP BY 컬럼명 | 표현식
4) HAVING 그룹 조건식
6) ORDER BY 컬럼명 | 표현식

  • ORDER BY 절에는 SELECT 목록에 나타나지 않은 항목 포함 가능 (데이터 베이스는 SELECT 절 뒤에 명시되지 않은 컬럼도 유지)
SELECT SALARY, POSITION FROM PLAYER
ORDER BY NAME;
  • 예외 경우
# 서브 쿼리 사용 시
SELECT 지역, SUM(매출금액) AS 매출금액
FROM (
	SELECT 지역, 매출금액 FROM 지역별매출
)
ORDER BYASC;

# GROUP BY 절 사용 시 명시되지 않은 컬럼 유지할 수 없음.
SELECT 지역, SUM(매출금액) AS 매출금액 FROM 지역별매출
GROUP BY 지역
ORDER BYASC;

0개의 댓글