TIL 21.

Sol Karsian·2025년 3월 11일
post-thumbnail

오늘은 SQL의 심화 주제인 GROUP BY, HAVING, 집합 연산자, 그리고 다양한 JOIN 방식에 대해 학습했습니다. 관계형 데이터베이스에서 복잡한 데이터 조회와 집계를 수행할 때 필수적으로 사용되는 문법들입니다.

📌 GROUP BY
그룹 함수(SUM, AVG, COUNT 등)는 단일 값만 반환 → 다수 그룹 처리 위해 GROUP BY 사용

같은 값을 가진 행을 그룹으로 묶어 요약된 데이터를 반환

📚 문법
sql
복사
편집
SELECT 컬럼명, 집계함수(컬럼명)
FROM 테이블명
WHERE 조건
GROUP BY 그룹 기준 컬럼
ORDER BY 정렬 기준;
✅ 예제
sql
복사
편집
-- 부서별 급여 합계
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
sql
복사
편집
-- 성별 인원 수 및 급여 합계
SELECT DECODE(SUBSTR(EMP_NO, 8, 1), '1', '남', '2', '여') AS 성별, COUNT(*), SUM(SALARY)
FROM EMPLOYEE
GROUP BY DECODE(SUBSTR(EMP_NO, 8, 1), '1', '남', '2', '여');
📌 HAVING
집계 결과에 조건을 줄 때 사용

WHERE은 행 조건, HAVING은 그룹 조건

📚 문법
sql
복사
편집
SELECT 컬럼명, 집계함수(컬럼명)
FROM 테이블명
GROUP BY 컬럼명
HAVING 집계조건;
✅ 예제
sql
복사
편집
-- 평균 급여가 300만원 이상인 부서
SELECT DEPT_CODE, AVG(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING AVG(SALARY) >= 3000000;
📌 집계 함수 고급: ROLLUP & CUBE
ROLLUP: 위에서 아래로 누적 요약 (계층적)

CUBE: 가능한 모든 조합에 대한 요약

✅ 예제
sql
복사
편집
-- ROLLUP
SELECT DEPT_CODE, JOB_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY ROLLUP(DEPT_CODE, JOB_CODE);

-- CUBE
SELECT DEPT_CODE, JOB_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY CUBE(DEPT_CODE, JOB_CODE);
📌 집합 연산자

연산자 설명
UNION 합집합 (중복 제거)
UNION ALL 합집합 (중복 포함)
INTERSECT 교집합
MINUS 차집합
✅ 예제
sql
복사
편집
-- DEPT_CODE = 'D5' 또는 SALARY >= 300만원
SELECT EMP_ID, EMP_NAME FROM EMPLOYEE WHERE DEPT_CODE = 'D5'
UNION
SELECT EMP_ID, EMP_NAME FROM EMPLOYEE WHERE SALARY >= 3000000;
sql
복사
편집
-- 교집합 (AND 조건 유사)
SELECT EMP_ID FROM EMPLOYEE WHERE DEPT_CODE = 'D5'
INTERSECT
SELECT EMP_ID FROM EMPLOYEE WHERE SALARY >= 3000000;
🔗 JOIN 정리 (JOIN이란?)
여러 테이블 간의 관련 데이터를 연결하여 조회

결과는 하나의 Result Set으로 반환

JOIN 종류 요약

종류 설명
INNER JOIN 일치하는 데이터만 반환
OUTER JOIN 일치하지 않는 데이터도 반환 (LEFT, RIGHT, FULL)
CROSS JOIN 두 테이블의 모든 조합
NON EQUAL JOIN 등호(=)가 아닌 조건으로 조인
SELF JOIN 동일 테이블을 조인
NATURAL JOIN 동일한 이름의 컬럼을 자동 조인
MULTI JOIN N개 이상의 테이블을 조인
✅ INNER JOIN 예제
sql
복사
편집
-- ANSI 방식
SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID;
✅ OUTER JOIN 예제
sql
복사
편집
-- LEFT OUTER JOIN (ANSI)
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE LEFT OUTER JOIN DEPARTMENT
ON DEPT_CODE = DEPT_ID;

-- LEFT OUTER JOIN (Oracle)
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
✅ CROSS JOIN 예제
sql
복사
편집
-- 모든 조합
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE CROSS JOIN DEPARTMENT;
✅ SELF JOIN 예제
sql
복사
편집
-- 사수 정보 조회
SELECT E1.EMP_NAME, NVL(E2.EMP_NAME, '없음') AS MANAGER_NAME
FROM EMPLOYEE E1
LEFT JOIN EMPLOYEE E2 ON E1.MANAGER_ID = E2.EMP_ID;
📊 오늘의 요약
GROUP BY: 그룹으로 묶고 집계

HAVING: 그룹별 조건 지정

ROLLUP, CUBE: 고급 집계

JOIN: 여러 테이블을 하나로 연결

집합 연산자: 결과집합을 합치거나 비교

실무에서는 JOIN + GROUP BY + HAVING + 서브쿼리가 복합적으로 사용됨
오늘 배운 내용은 데이터 분석과 서비스 구현의 핵심 도구임!

profile
개발자 희망자 입니다.

0개의 댓글