SQL 실습 예제
이 글에서는 학습한 SQL 지식을 종합적으로 활용할 수 있는 예제를 제공합니다. 실무 시나리오 기반의 문제를 해결하며, 복습 문제와 해설을 통해 이해도를 높입니다. 이를 통해 SQL 실력을 한층 더 발전시킬 수 있습니다.
SQL 예제
이번 예제에서는 HR 데이터베이스를 활용하여 실제 비즈니스 시나리오를 기반으로 SQL 쿼리를 작성해보겠습니다. 이 예제를 통해 학습한 SQL 지식을 종합적으로 활용할 수 있습니다.
시나리오
가상의 회사에서 직원 정보를 관리하고 있습니다. 다음과 같은 요구사항이 있습니다:
- 각 부서의 평균 급여를 조회하시오.
- 급여가 3000 이상인 직원의 이름과 직무를 조회하시오.
- 부서별로 가장 높은 급여를 받는 직원의 이름과 급여를 조회하시오.
이 요구사항을 해결하기 위해 필요한 SQL 쿼리를 단계별로 작성해보겠습니다.
1. 각 부서의 평균 급여 조회
부서별 평균 급여를 계산하기 위해 AVG()
함수를 사용하고, GROUP BY
절을 통해 부서별로 데이터를 그룹화합니다.
SELECT
d.dname AS 부서명,
AVG(e.sal) AS 평균_급여
FROM
dept d
JOIN
emp e ON d.deptno = e.deptno
GROUP BY
d.dname;
위 쿼리는 dept
테이블과 emp
테이블을 조인하여 각 부서의 평균 급여를 계산합니다.
2. 급여가 3000 이상인 직원의 이름과 직무 조회
급여가 3000 이상인 직원의 이름과 직무를 조회하기 위해 WHERE
절을 사용합니다.
SELECT
ename AS 직원명,
job AS 직무
FROM
emp
WHERE
sal >= 3000;
이 쿼리는 emp
테이블에서 급여가 3000 이상인 직원의 이름과 직무를 필터링하여 조회합니다.
3. 부서별로 가장 높은 급여를 받는 직원의 이름과 급여 조회
부서별로 가장 높은 급여를 받는 직원을 찾기 위해 MAX()
함수를 사용하고, 서브쿼리를 활용합니다.
SELECT
e.ename AS 직원명,
e.sal AS 급여,
d.dname AS 부서명
FROM
emp e
JOIN
dept d ON e.deptno = d.deptno
WHERE
e.sal = (SELECT MAX(sal) FROM emp WHERE deptno = e.deptno);
이 쿼리는 각 부서에서 가장 높은 급여를 받는 직원의 이름과 급여를 조회합니다.
이렇게 작성된 SQL 쿼리들은 실제 비즈니스 환경에서 자주 사용되는 패턴을 포함하고 있으며, 학습한 SQL 지식을 종합적으로 활용하는 좋은 예가 됩니다. 각 쿼리를 실행해보면서 결과를 확인하고, SQL의 다양한 기능을 익혀보세요.
실무 시나리오 기반의 문제 해결
이번 섹션에서는 실제 비즈니스 환경에서 발생할 수 있는 SQL 문제를 해결하는 방법을 알아보겠습니다. HR 데이터베이스를 활용하여 다양한 시나리오를 통해 SQL 쿼리를 작성해보겠습니다.
시나리오 1: 특정 직무의 직원 수 조회
회사가 특정 직무에 몇 명의 직원이 있는지 확인하고 싶어합니다. 예를 들어, 'SALESMAN' 직무에 속하는 직원 수를 조회해 보겠습니다.
SELECT
COUNT(*) AS 직원_수
FROM
emp
WHERE
job = 'SALESMAN';
위 쿼리는 emp
테이블에서 'SALESMAN' 직무를 가진 직원의 수를 계산하여 조회합니다. COUNT(*)
함수는 조건에 맞는 모든 행의 수를 세어줍니다.
시나리오 2: 특정 부서의 직원 목록 조회
특정 부서에 속하는 직원들의 목록을 조회하고 싶습니다. 예를 들어, 'ACCOUNTING' 부서의 모든 직원 정보를 확인해 보겠습니다.
SELECT
ename AS 직원명,
job AS 직무,
sal AS 급여
FROM
emp e
JOIN
dept d ON e.deptno = d.deptno
WHERE
d.dname = 'ACCOUNTING';
이 쿼리는 emp
테이블과 dept
테이블을 조인하여 'ACCOUNTING' 부서에 속하는 직원의 이름, 직무, 급여를 조회합니다.
시나리오 3: 급여 인상 필요 직원 조회
회사가 급여 인상이 필요한 직원을 찾고 싶어합니다. 예를 들어, 급여가 1500 이하인 직원의 이름과 급여를 조회해 보겠습니다.
SELECT
ename AS 직원명,
sal AS 급여
FROM
emp
WHERE
sal <= 1500;
이 쿼리는 emp
테이블에서 급여가 1500 이하인 직원의 이름과 급여를 필터링하여 조회합니다.
시나리오 4: 직원의 입사 연도별 분포 조회
회사가 직원의 입사 연도별 분포를 분석하고 싶어합니다. 이를 위해 각 연도별로 직원 수를 조회해 보겠습니다.
SELECT
TO_CHAR(hiredate, 'YYYY') AS 입사_연도,
COUNT(*) AS 직원_수
FROM
emp
GROUP BY
TO_CHAR(hiredate, 'YYYY')
ORDER BY
입사_연도;
이 쿼리는 hiredate
에서 연도를 추출하여 각 연도별 직원 수를 계산합니다. GROUP BY
절을 사용하여 연도별로 데이터를 그룹화하고, ORDER BY
절로 결과를 정렬합니다.
이러한 실무 시나리오 기반의 문제 해결을 통해 SQL 쿼리 작성 능력을 향상시키고, 실제 비즈니스 환경에서의 데이터 분석 능력을 키울 수 있습니다. 각 쿼리를 실행해보며 결과를 확인해보세요.
복습 문제와 해설
이번 섹션에서는 앞서 배운 내용을 바탕으로 복습 문제를 제공하고, 각 문제에 대한 해설을 통해 이해도를 높이겠습니다. 각 문제를 해결해 보면서 SQL 쿼리 작성 능력을 강화할 수 있습니다.
문제 1: 부서별 직원 수 조회
각 부서에 몇 명의 직원이 있는지 조회하는 SQL 쿼리를 작성하세요.
해설
부서별 직원 수를 조회하기 위해 COUNT()
함수를 사용하고, GROUP BY
절로 부서별로 데이터를 그룹화합니다.
SELECT
d.dname AS 부서명,
COUNT(e.empno) AS 직원_수
FROM
dept d
LEFT JOIN
emp e ON d.deptno = e.deptno
GROUP BY
d.dname;
이 쿼리는 dept
테이블과 emp
테이블을 LEFT JOIN하여 각 부서의 직원 수를 계산합니다. LEFT JOIN을 사용하여 부서가 있지만 직원이 없는 경우에도 부서 정보를 포함합니다.
문제 2: 급여가 2000 이상인 직원의 이름과 부서 조회
급여가 2000 이상인 직원의 이름과 해당 부서를 조회하는 SQL 쿼리를 작성하세요.
해설
급여 조건을 만족하는 직원의 이름과 부서 정보를 조회하기 위해 WHERE
절을 사용합니다.
SELECT
e.ename AS 직원명,
d.dname AS 부서명
FROM
emp e
JOIN
dept d ON e.deptno = d.deptno
WHERE
e.sal >= 2000;
이 쿼리는 emp
테이블과 dept
테이블을 조인하여 급여가 2000 이상인 직원의 이름과 부서명을 조회합니다.
문제 3: 가장 높은 급여를 받는 직원의 이름과 급여 조회
가장 높은 급여를 받는 직원의 이름과 급여를 조회하는 SQL 쿼리를 작성하세요.
해설
가장 높은 급여를 찾기 위해 MAX()
함수를 사용하고, 서브쿼리를 활용합니다.
SELECT
ename AS 직원명,
sal AS 급여
FROM
emp
WHERE
sal = (SELECT MAX(sal) FROM emp);
이 쿼리는 emp
테이블에서 가장 높은 급여를 받는 직원의 이름과 급여를 조회합니다. 서브쿼리를 통해 전체 직원 중 최대 급여를 찾습니다.
문제 4: 최근 5년 이내에 입사한 직원의 목록 조회
최근 5년 이내에 입사한 직원의 이름과 입사일을 조회하는 SQL 쿼리를 작성하세요.
해설
현재 날짜에서 5년 전의 날짜를 기준으로 입사한 직원들을 필터링합니다.
SELECT
ename AS 직원명,
hiredate AS 입사일
FROM
emp
WHERE
hiredate >= ADD_MONTHS(SYSDATE, -60);
이 쿼리는 emp
테이블에서 현재 날짜로부터 5년 이내에 입사한 직원의 이름과 입사일을 조회합니다. ADD_MONTHS(SYSDATE, -60)
를 사용하여 5년 전 날짜를 계산합니다.
이러한 복습 문제를 통해 SQL 쿼리 작성 능력을 점검하고, 실력을 더욱 향상시킬 수 있습니다. 각 문제를 해결해 보면서 자신만의 쿼리를 작성해보세요.