더북(TheBook)

코드가 가장 복잡하네요. 나눠서 살펴보죠.

INNER JOIN dept_emp b
   ON a.dept_no = b.dept_no
WHERE SYSDATE() BETWEEN b.from_date AND b.to_date
GROUP BY a.dept_name

부서별로 사원 수를 구해야 하므로 부서 정보가 있는 departments 테이블과 사원 정보가 있는 dept_emp 테이블을 내부 조인합니다. 그리고 기준이 현재이므로 WHERE 절에서 SYSDATE() 함수의 반환값이 dept_emp의 from_date와 to_date 사이에 있는지 확인합니다. 마지막으로 부서명 칼럼인 departments 테이블의 dept_name을 GROUP BY 절에 명시하면 부서별 총 사원 수를 구할 수 있습니다.

UNION
SELECT '전체', COUNT(*)
 FROM dept_emp
WHERE SYSDATE() BETWEEN from_date AND to_date;

전체 사원 수는 COUNT() 함수로 구할 수 있죠. 그리고 현재 근무 중이어야 하므로 dept_emp 테이블에서 현재 날짜가 from_date와 to_date 사이에 오는 건만 조회합니다. 따라서 두 번째 SELECT 문으로 현재 부서에 속한 전체 사원 수를 반환합니다. 그리고 이 문장을 첫 번째 SELECT 문과 UNION으로 연결하면 부서별 사원 수와 전체 부서의 총 사원 수를 한 번에 구할 수 있습니다. UNION 절을 사용할 때는 연결하는 SELECT 문의 결과 집합과 칼럼 수와 순서를 모두 맞춰야 하므로 두 번째 SELECT 절에 ‘전체’를 추가했습니다.

이 장에서 배운 내용을 토대로 몇 가지 쿼리를 작성해 봤습니다. 일반적으로 원하는 정보를 추출하려면 지금까지 배운 기본적인 SELECT 문을 비롯해 SQL 함수, 집계 쿼리, 내부와 외부 조인, UNION 절 등을 복합적으로 사용해 하나의 쿼리를 만들어야 합니다. 따라서 이 절에서 소개한 실습 쿼리들을 잘 이해한 후, 이리저리 수정해 보고 결과를 확인해 보세요. 이런 과정을 여러 번 거쳐야 SQL 문장을 능숙하게 작성할 수 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.