SQL 집계함수, 그룹화, 서브 쿼리

DA_LEESUNHO·2025년 10월 28일

Learning Base

목록 보기
2/15

FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY

SQL 동작 순서를 명시
알아두고 항시 습관화하기


SQL 집계함수 (COUNT, MAX, MIN, SUM, AVG)

1) 집계함수 : 여러 행, 열로부터 하나의 결과 값을 반환
2) 전체 데이터 혹은 특정 컬럼을 대상으로 사용 가능
3) SELECT 문에서 사용

집계함수기능
COUNT테이블의 "행" 수 변환
SUM테이블의 열 합계 반환
AVG테이블의 열 평균 변환
MIN테이블의 열 최소 값 변환
MAX테이블의 열 최대 값 변환
select COUNT(col) from DB명.테이블명					## col 행의 갯수 변환
select MAX(col) from DB명.테이블명					## col 열의 최댓 값 변환

SQL 그룹화 (GROUP BY, HAVING)

GROUP BY

1) 집계함수를 통해 기준 별 값을 변환하고자 한다면, "GROUP BY" 절은 필수
-- 전체 데이터 기준인 경우 제외
2) 집계함수에 그룹(기준)이 더해진 개념

3) WHERE 절 이후 작성

## 집계함수와 GROUP BY 절을 함께 사용하는 SQL문
select 기준컬럼, 집계함수(조건컬럼을 기준으로 여러개의 집계함수 동시사용 가능)   
from 테이블명
where 조건     ## (생략가능)
group by 기준컬럼
; 

학습 전 겪었던 오류 (주의 사항)
위 쿼리에서 GROUP BY 를 안 쓰는 경우, 오류가 발생한다.
이유는, 집계함수는 설명과 같이 하나의 결과 값을 반환한다.

SELECT 문에서 이외 컬럼 (위에서는 기준 컬럼) 이 있다면,
해당 컬럼은 N 개의 값을 출력하기에..


GROUP BY 절을 통해 기준 컬럼을 기준으로,
기준컬럼 당 한 개의 값을 반환 시킬 수 있도록 해야 정상적으로 동작한다.

HAVING

1) HAVING 절은 GROUP BY 절에 의한 결과를 필터링 할 때 사용
2) GROUP BY 절 뒤에 위치함
3) WHERE 절과 차이점 존재

구분필터링 시점
WHEREGROUP BY 전 데이터 필터링
HAVINGGROUP BY 결과값을 가지고 데이터 필터링

ex)

select 성별, avg(나이)as avg_age 2️⃣  -- 집계함수를 통한 avg_age 컬럼 생성
from basic.table 
where 나이>=311️⃣					-- 기존 테이블의 컬럼으로만 필터링 가능
group by 성별 2️⃣
having AVG_AGE>41 3️⃣				-- GROUP BY 후 avg_age 컬럼에 대해 필터링 진행

서브 쿼리

1) N 번의 쿼리문을 얻은 결과 값을, 하나의 쿼리로 작성 및 실행 할 수 있게 하는 역할
2) JOIN, UNION 동작 수행을 대체 할 수 있는 방법을 제공
3) 실행 순서 : 내부 → 외부 쿼리
4) 특징
: ( ) 안 SELECT, FROM 명시 필요
: 서브쿼리 마지막 ; 사용 불가
: ORDER BY 절 사용 불가

서브 쿼리의 종류

보통 인라인 뷰가 가장 많이 쓰인다.
나머지는 간단히만 내용 숙지 후 필요한 경우 서치하여 바로 사용 할 수 있도록 하자

1) 중첩(일반) 서브쿼리
: WHERE 절에서 사용
: 서브쿼리의 결과에 따라 달라지는 조건 절

2) 스칼라 서브쿼리
: SELECT 절에서 사용
: 하나의 컬럼처럼 사용


3) 인라인 뷰 서브쿼리
: FROM 절에서 사용
: 하나의 테이블 처럼 사용
: AS 구문을 이용하여 반드시 별칭 지정
: JOIN, UNION 사용 시 가장 유용하게 사용 됨

select a.actor_cnt, count(distinct a.game_account_id) as accnt
from(
	select game_account_id, count(distinct game_actor_id) as actor_cnt
	from basic.users
	where level >=30
	group by 1
	having actor_cnt >=2
	) as a						-- 서브쿼리 별칭 a 지정
group by 1
profile
성장과 회고를 기록하는 일기장

0개의 댓글