[ SQLD 필기 ] - GROUP BY, HAVING, 조인!

Mandung2·2026년 10월 12일

SQLD 자격증 도전기

목록 보기
3/6
post-thumbnail

📊 GROUP BY, HAVING절

GROUP BY절이란?

  • GROUP BY절은 특정 컬럼을 기준으로 데이터를 그룹화할 때 사용한다.
  • 그룹별로 집계함수를 적용하여 통계 정보를 구할 수 있다.
SELECT DEPARTMENT_ID, AVG(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

→ 부서별 평균 급여를 조회한다.

💡 GROUP BY의 특징

  • 그룹화할 기준 컬럼을 지정한다.
  • 그룹별 집계 결과를 조회할 때 집계함수를 함께 사용할 수 있다.
  • GROUP BY에 지정하지 않은 일반 컬럼은 원칙적으로 SELECT절에 단독으로 작성할 수 없다.
    단, 집계함수에 포함된 경우는 가능하다.
  • GROUP BY 없이도 집계함수를 사용하면 전체 테이블을 하나의 그룹으로 집계할 수 있다.

*여기서 집계함수란?

  • 집계함수는 여러 행의 데이터를 계산하여 하나의 결과값을 반환한다.
집계함수설명
COUNT(*)전체 행의 개수
COUNT(컬럼명)NULL을 제외한 해당 컬럼의 개수
SUM(컬럼명)합계
AVG(컬럼명)평균
MAX(컬럼명)최댓값
MIN(컬럼명)최솟값
STDDEV(컬럼명)표준편차
VARIANCE(컬럼명)분산
  • ⚠️ 집계함수의 NULL 처리
    일반적인 집계함수는 NULL을 제외하고 계산한다. 단, COUNT(*)는 NULL 여부와 관계없이 행 자체를 센다.

HAVING절이란?

  • HAVING절은 그룹화한 결과에 조건을 적용하여 특정 그룹만 조회할 때 사용한다.
SELECT DEPARTMENT_ID, AVG(SALARY) AS AVG_SALARY
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING AVG(SALARY) >= 3000;

→ 부서별 평균 급여가 3000 이상인 그룹만 조회한다.
구분WHEREHAVING
조건 적용 대상개별 행그룹
적용 시점그룹화 전그룹화 후
집계함수 사용일반적으로 직접 사용할 수 없음집계 결과에 조건 적용 가능
사용 목적조건에 맞는 행 필터링조건에 맞는 그룹 필터링

GROUP BY와 HAVING의 특징

  • HAVING은 일반적으로 GROUP BY 뒤에 작성한다.
  • HAVING은 그룹 기준 컬럼이나 집계함수를 이용해 조건을 지정한다.
  • HAVING은 GROUP BY 없이도 사용할 수 있다.
    이 경우 집계 쿼리에서 전체 결과를 하나의 그룹으로 보고 조건을 적용할 수 있다.
  • Oracle의 일반적인 SQLD 시험 기준으로 SELECT절에서 정의한 별칭은 GROUP BY나 HAVING에서 그대로 사용할 수 없다고 기억하자.

🔗 조인(JOIN)

조인이란?

  • 조인은 두 개 이상의 테이블을 연결하여 관련된 데이터를 함께 조회하는 방법이다.

  • 일반적으로 테이블 간의 관계는 기본키(PK)와 외래키(FK)를 이용해 연결한다.

  • 다만 반드시 PK와 FK 관계가 있어야만 조인할 수 있는 것은 아니며,

  • 논리적으로 관련된 컬럼을 조건으로 연결할 수도 있다.


조인의 종류

조인 종류특징
INNER JOIN조인 조건을 만족하는 행만 반환
NATURAL JOIN이름이 같은 컬럼을 기준으로 자동 조인
JOIN USING같은 이름의 조인 컬럼을 지정
JOIN ON조인 조건을 직접 지정
CROSS JOIN두 테이블의 모든 행 조합
OUTER JOIN조인 조건을 만족하지 않는 행도 포함

1. INNER JOIN (내부 조인)

  • 두 테이블에서 조인 조건을 만족하는 행만 조회한다.
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
INNER JOIN DEPARTMENTS D
    ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

→ 부서 번호가 일치하는 직원과 부서 정보만 조회한다.
  • 결과에는 김민수와 인사팀, 이지은과 개발팀이 포함된다.
    부서 번호가 30인 박준호는 일치하는 부서가 없으므로 결과에서 제외된다.

💡 INNER JOIN의 특징

  • INNER는 생략할 수 있다.
  • 조인 조건을 만족하는 행만 반환한다.
  • Oracle에서는 기존의 쉼표 조인과 WHERE 조건을 이용하는 방식으로도 작성할 수 있다.

2. EQUI JOIN과 NON-EQUI JOIN

① EQUI JOIN (동등 조인)

  • 조인 조건에 등호(=)를 사용하는 조인이다.
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
JOIN DEPARTMENTS D
    ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

→ 두 테이블의 부서 번호가 같은 행을 연결한다.

② NON-EQUI JOIN (비동등 조인)

  • 조인 조건에 등호가 아닌 비교 연산자를 사용하는 조인이다.
SELECT E.NAME, G.GRADE
FROM EMPLOYEES E
JOIN SALARY_GRADE G
    ON E.SALARY BETWEEN G.MIN_SALARY AND G.MAX_SALARY;

3. NATURAL JOIN

  • NATURAL JOIN은 두 테이블에 이름이 같은 컬럼을 자동으로 찾아 해당 컬럼을 기준으로 조인한다.
SELECT NAME, DEPARTMENT_NAME
FROM EMPLOYEES
NATURAL JOIN DEPARTMENTS;

⚠️ NATURAL JOIN의 특징

  • 같은 이름을 가진 컬럼을 자동으로 조인 조건으로 사용한다.
  • 공통 컬럼이 여러 개라면 해당 공통 컬럼들이 조인 조건에 함께 사용된다.
  • 조인 결과에서 공통 컬럼은 중복해서 표시되지 않는다.
  • 컬럼 이름이 같다는 이유만으로 자동 연결되므로 의도하지 않은 조인이 발생할 수 있다.

4. JOIN USING

  • USING은 두 테이블에서 이름이 같은 조인 컬럼을 직접 지정하는 방식이다.
SELECT NAME, DEPARTMENT_NAME
FROM EMPLOYEES
JOIN DEPARTMENTS
USING (DEPARTMENT_ID);

USING의 특징

  • 조인에 사용할 공통 컬럼을 직접 지정한다.
  • USING 안에는 양쪽 테이블에 공통으로 존재하는 컬럼명을 작성한다.
  • USING에 지정한 컬럼은 테이블 별칭을 붙여 참조할 수 없다.

5. JOIN ON

  • ON은 조인 조건을 직접 작성하는 방식이다.
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
JOIN DEPARTMENTS D
    ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

USING과 ON의 차이

구분USINGON
조인 조건동일한 이름의 컬럼 지정조건식을 직접 작성
컬럼명양쪽 테이블에서 같아야 함서로 달라도 가능
조건 표현지정한 공통 컬럼으로 조인=, 범위 조건 등 다양한 조건 사용 가능

6.CROSS JOIN (교차 조인)

  • CROSS JOIN은 두 테이블의 모든 행을 서로 조합한다.
    이를 카티션 곱(Cartesian Product)이라고 한다.
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
CROSS JOIN DEPARTMENTS D;

첫 번째 테이블에 3개 행, 두 번째 테이블에 3개 행이 있다면 결과는 총 9개 행이다.

결과 행 수 = 첫 번째 테이블의 행 수 × 두 번째 테이블의 행 수


7. OUTER JOIN (외부 조인)

  • 외부 조인은 조인 조건을 만족하는 행뿐만 아니라, 조건을 만족하는 상대 테이블의 행이 없는 경우에도 한쪽 또는 양쪽 테이블의 행을 반환한다.
  • 일치하는 행이 없으면 상대 테이블의 컬럼은 NULL로 표시된다.

① LEFT OUTER JOIN

  • 왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에서 일치하는 행을 연결한다.
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
LEFT OUTER JOIN DEPARTMENTS D
    ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

→ 부서 정보가 없는 직원도 결과에 포함된다.

② RIGHT OUTER JOIN

  • 오른쪽 테이블의 모든 행을 반환한다.
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
RIGHT OUTER JOIN DEPARTMENTS D
    ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

→ 직원이 없는 부서도 결과에 포함된다.

③ FULL OUTER JOIN

  • 왼쪽과 오른쪽 테이블의 모든 행을 반환한다.
  • 양쪽에서 일치하는 행은 연결하고, 일치하지 않는 행은 반대쪽 컬럼을 NULL로 표시한다.
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
FULL OUTER JOIN DEPARTMENTS D
    ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

④ Oracle의 (+) 표기법

  • Oracle에서는 기존 방식으로 외부 조인에 (+)를 사용할 수 있다.
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E, DEPARTMENTS D
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID(+);

위 예시에서는 DEPARTMENTS 쪽에 (+)가 있으므로 왼쪽 테이블인 EMPLOYEES의 모든 행을 보존한다. 즉, 현대적인 문법의 LEFT OUTER JOIN과 같은 방향이다.


✨ 마무리 요약

  • GROUP BY : 데이터를 특정 기준으로 그룹화하고 집계한다.

  • 집계함수 : COUNT(*)는 전체 행을 세고, COUNT(컬럼명)은 해당 컬럼의 NULL을 제외한다. 일반적인 집계함수도 NULL을 제외하고 계산한다.

  • WHERE와 HAVING : WHERE는 그룹화하기 전 개별 행을 필터링하고, HAVING은 그룹화한 결과에 조건을 적용한다.

  • INNER JOIN : 조인 조건을 만족하는 행만 조회한다.

  • EQUI JOIN과 NON-EQUI JOIN : 각각 등호(=)를 사용하는 조인과 그 외의 비교 조건을 사용하는 조인이다.

  • NATURAL JOIN, USING, ON : 공통 컬럼을 자동으로 찾는 방식, 공통 컬럼을 직접 지정하는 방식, 조인 조건을 직접 작성하는 방식이다.

  • CROSS JOIN : 두 테이블의 모든 행을 조합하며, 결과 행 수는 각 테이블의 행 수를 곱한 값이다.

  • OUTER JOIN : 일치하는 데이터가 없는 행도 포함한다. LEFT는 왼쪽, RIGHT는 오른쪽, FULL은 양쪽 테이블의 모든 행을 보존한다.

0개의 댓글