
SELECT DEPARTMENT_ID, AVG(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
→ 부서별 평균 급여를 조회한다.
💡 GROUP BY의 특징
| 집계함수 | 설명 |
|---|---|
| COUNT(*) | 전체 행의 개수 |
| COUNT(컬럼명) | NULL을 제외한 해당 컬럼의 개수 |
| SUM(컬럼명) | 합계 |
| AVG(컬럼명) | 평균 |
| MAX(컬럼명) | 최댓값 |
| MIN(컬럼명) | 최솟값 |
| STDDEV(컬럼명) | 표준편차 |
| VARIANCE(컬럼명) | 분산 |
SELECT DEPARTMENT_ID, AVG(SALARY) AS AVG_SALARY
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING AVG(SALARY) >= 3000;
→ 부서별 평균 급여가 3000 이상인 그룹만 조회한다.
| 구분 | WHERE | HAVING |
|---|---|---|
| 조건 적용 대상 | 개별 행 | 그룹 |
| 적용 시점 | 그룹화 전 | 그룹화 후 |
| 집계함수 사용 | 일반적으로 직접 사용할 수 없음 | 집계 결과에 조건 적용 가능 |
| 사용 목적 | 조건에 맞는 행 필터링 | 조건에 맞는 그룹 필터링 |
조인은 두 개 이상의 테이블을 연결하여 관련된 데이터를 함께 조회하는 방법이다.
일반적으로 테이블 간의 관계는 기본키(PK)와 외래키(FK)를 이용해 연결한다.
다만 반드시 PK와 FK 관계가 있어야만 조인할 수 있는 것은 아니며,
논리적으로 관련된 컬럼을 조건으로 연결할 수도 있다.
| 조인 종류 | 특징 |
|---|---|
| INNER JOIN | 조인 조건을 만족하는 행만 반환 |
| NATURAL JOIN | 이름이 같은 컬럼을 기준으로 자동 조인 |
| JOIN USING | 같은 이름의 조인 컬럼을 지정 |
| JOIN ON | 조인 조건을 직접 지정 |
| CROSS JOIN | 두 테이블의 모든 행 조합 |
| OUTER JOIN | 조인 조건을 만족하지 않는 행도 포함 |
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
INNER JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
→ 부서 번호가 일치하는 직원과 부서 정보만 조회한다.
① 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;
SELECT NAME, DEPARTMENT_NAME
FROM EMPLOYEES
NATURAL JOIN DEPARTMENTS;
SELECT NAME, DEPARTMENT_NAME
FROM EMPLOYEES
JOIN DEPARTMENTS
USING (DEPARTMENT_ID);
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
| 구분 | USING | ON |
|---|---|---|
| 조인 조건 | 동일한 이름의 컬럼 지정 | 조건식을 직접 작성 |
| 컬럼명 | 양쪽 테이블에서 같아야 함 | 서로 달라도 가능 |
| 조건 표현 | 지정한 공통 컬럼으로 조인 | =, 범위 조건 등 다양한 조건 사용 가능 |
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
CROSS JOIN DEPARTMENTS D;
첫 번째 테이블에 3개 행, 두 번째 테이블에 3개 행이 있다면 결과는 총 9개 행이다.
결과 행 수 = 첫 번째 테이블의 행 수 × 두 번째 테이블의 행 수
① 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
SELECT E.NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E
FULL OUTER JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
④ 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은 양쪽 테이블의 모든 행을 보존한다.