데이터베이스를 다룰 때 자주 사용하는 그룹 함수(Group Functions)와 조인(JOIN)은 데이터를 효율적으로 조회하고 분석하는 데 필수적인 도구입니다. 이번 포스팅에서는 그룹 함수와 조인에 대해 자세히 알아보고, 각 기능이 어떻게 사용되는지 실제 SQL 예시를 통해 설명하겠습니다.
Chapter 4: 그룹 함수 (Group Functions)
1. 그룹 함수란?
그룹 함수는 여러 행의 값을 집계하여 하나의 결과를 반환하는 함수입니다. 이러한 함수는 테이블에 있는 데이터를 분석하고 요약하는 데 유용합니다. SQL에서는 SUM
, AVG
, MIN
, MAX
, COUNT
와 같은 기본적인 그룹 함수가 제공됩니다. 그룹 함수는 주로 GROUP BY
절과 함께 사용되며, 여러 행을 하나의 그룹으로 묶어 처리합니다.
주요 그룹 함수
AVG([DISTINCT|ALL] n)
: Null 값을 무시하고n
열의 평균을 계산합니다.SUM([DISTINCT|ALL] n)
: Null 값을 무시하고n
열의 합계를 계산합니다.MIN([DISTINCT|ALL] expr)
: Null 값을 무시하고expr
의 최솟값을 반환합니다.MAX([DISTINCT|ALL] expr)
: Null 값을 무시하고expr
의 최댓값을 반환합니다.COUNT({*|[DISTINCT|ALL] expr})
: 테이블의 행 수를 계산합니다.expr
은 Null 값을 제외하고 계산됩니다.
그룹 함수 예시
SELECT MAX(SALARY), MIN(SALARY), SUM(SALARY), ROUND(AVG(SALARY), 0)
FROM EMPLOYEES;
이 쿼리는 직원의 급여 정보를 분석하여 가장 높은 급여, 가장 낮은 급여, 급여 합계, 평균 급여를 각각 반환합니다.
SELECT COUNT(*), COUNT(COMMISSION_PCT)
FROM EMPLOYEES;
위 쿼리는 전체 직원 수와 COMMISSION_PCT
열에서 Null이 아닌 값의 수를 반환합니다.
2. COUNT 함수
COUNT
함수는 행의 수를 계산하는 함수입니다. 주로 두 가지 방식으로 사용됩니다.
COUNT(*)
: 중복 행과 Null 값을 포함한 전체 테이블의 행 수를 반환합니다.COUNT(expr)
: 지정된 열에서 Null 값을 제외한 행 수를 반환합니다.
3. GROUP BY 절
GROUP BY
절은 데이터를 그룹화하여 그룹마다 집계된 결과를 얻는 데 사용됩니다. 주로 그룹 함수와 함께 사용되며, 데이터를 특정 기준으로 그룹화하여 결과를 도출할 수 있습니다.
구문
SELECT column, group_function(column)
FROM table
[WHERE condition(s)]
[GROUP BY group_by_expression]
[ORDER BY {column|expr} [ASC|DESC]];
GROUP BY 예시
SELECT department_id, AVG(SALARY)
FROM EMPLOYEES
GROUP BY department_id;
이 쿼리는 각 부서별로 평균 급여를 계산합니다.
4. HAVING 절
HAVING
절은 GROUP BY
로 그룹화된 데이터에 조건을 걸 때 사용됩니다. WHERE
절은 그룹화 전에 데이터를 필터링하는 반면, HAVING
절은 그룹화 이후에 그룹별 조건을 지정할 때 유용합니다.
구문
SELECT column, group_function(column)
FROM table
[WHERE condition(s)]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY {column|expr} [ASC|DESC]];
HAVING 절 예시
SELECT department_id, AVG(SALARY)
FROM EMPLOYEES
GROUP BY department_id
HAVING AVG(SALARY) > 5000;
이 쿼리는 각 부서의 평균 급여가 5000 이상인 부서만을 반환합니다.
5. ROLLUP, CUBE, GROUPING
ROLLUP
ROLLUP
구문은 GROUP BY
절과 함께 사용되어 그룹화된 결과에 대한 요약을 제공합니다. 예를 들어, 부서별, 직무별로 그룹화한 데이터를 요약할 수 있습니다.
ROLLUP 예시
SELECT deptno, JOB, COUNT(*), SUM(SALARY)
FROM EMPLOYEES
GROUP BY ROLLUP(deptno, JOB);
이 쿼리는 각 부서와 직무에 대한 합계를 보여주며, ROLLUP을 사용하면 각 그룹에 대한 전체 합계를 추가로 반환합니다.
CUBE
CUBE
구문은 ROLLUP
보다 더 상세한 요약을 제공하며, 모든 가능한 그룹의 조합에 대해 집계된 결과를 반환합니다.
CUBE 예시
SELECT deptno, JOB, COUNT(*), SUM(SALARY)
FROM EMPLOYEES
GROUP BY CUBE(deptno, JOB);
이 쿼리는 모든 부서와 직무 조합에 대한 요약된 결과를 반환합니다.
GROUPING 함수
GROUPING
함수는 ROLLUP
이나 CUBE
로 생성된 결과가 실제 그룹화에 의해 생성된 것인지 확인할 때 사용됩니다. 이 함수는 특정 열이 그룹화된 열인지 여부를 0 또는 1로 반환합니다.
GROUPING 함수 예시
SELECT deptno, JOB, COUNT(*), SUM(SALARY), GROUPING(deptno) AS grp_dept, GROUPING(JOB) AS grp_job
FROM EMPLOYEES
GROUP BY ROLLUP(deptno, JOB);
이 쿼리는 deptno
와 JOB
이 각각 그룹화된 값인지 확인하는 플래그를 제공합니다.
Chapter 5: 조인 (JOIN)
1. JOIN이란?
JOIN은 두 개 이상의 테이블을 연관시켜 데이터를 조회하는 방법입니다. 여러 테이블에서 관련된 데이터를 질의할 때 사용되며, 조인을 통해 테이블 간의 관계를 정의하고 필요한 정보를 결합할 수 있습니다.
2. 조인의 종류
1) INNER JOIN
INNER JOIN
은 기본 조인 방식으로, 두 테이블에서 일치하는 행만을 반환합니다. INNER
키워드는 생략할 수 있습니다.
구문
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
2) OUTER JOIN
OUTER JOIN
에는 세 가지 유형이 있습니다:
- LEFT OUTER JOIN: 왼쪽 테이블의 모든 행과 일치하는 오른쪽 테이블의 데이터를 반환하며, 일치하지 않으면 Null을 반환합니다.
- RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행과 일치하는 왼쪽 테이블의 데이터를 반환하며, 일치하지 않으면 Null을 반환합니다.
- FULL OUTER JOIN: 양쪽 테이블의 모든 행을 반환하며, 일치하지 않는 값은 Null로 표시됩니다.
구문
SELECT columns
FROM table1
LEFT/RIGHT/FULL OUTER JOIN table2
ON table1.column = table2.column;
3) CROSS JOIN
CROSS JOIN
은 두 테이블의 모든 가능한 조합(카테시안 곱)을 반환합니다.
구문
SELECT columns
FROM table1
CROSS JOIN table2;
4) SELF JOIN
SELF JOIN
은 테이블 자기 자신과 조인하는 방식입니다.
3. WHERE 절과 조인
조인 조건과 추가적인 필터 조건을 나눠서 사용하는 것이 좋습니다. 조인 조건은 ON
절에, 필터 조건은 WHERE
절에 명시하여 쿼리를 직관적으로 만들 수 있습니다.
구문
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column
WHERE condition;
4. 예제 문제
1) INNER JOIN 예시
SELECT first_name || ' ' || last_name AS name, department_id
FROM EMPLOYEES
INNER JOIN DEPARTMENTS
ON EMPLOYEES.department_id = DEPARTMENTS.department_id
WHERE employee_id = 200;
2) 여러 테이블 조인 예시
SELECT EMPLOYEES.first_name, EMPLOYEES.job_id, JOBS.job_title
FROM EMPLOYEES
INNER JOIN JOBS
ON EMPLOYEES.job_id = JOBS.job_id
ORDER BY EMPLOYEES.first_name ASC;
이 쿼리는 직원의 이름, 직무 ID, 직무 제목을 조회하고 이름을 기준으로 오름차순 정렬합니다.
'🗄️ Backend > SQL' 카테고리의 다른 글
데이터베이스 트랜잭션 및 테이블 관리 (0) | 2024.10.14 |
---|---|
SQL 서브쿼리 (Subquery)와 데이터 조작 명령어 (DML) 정리 (4) | 2024.10.14 |
숫자 함수 및 SQL 함수 정리 (3) | 2024.10.11 |
SQL SELECT 구문 및 DCL 권한 관리 (0) | 2024.10.11 |
RDBMS (관계형 데이터베이스 관리 시스템)의 이해: 개념과 SQL 기본 구문 (0) | 2024.10.11 |