이번에도 구문을 나눠서 살펴봅시다.
RIGHT JOIN departments b
ON a.dept_no = b.dept_no
departments 테이블에는 총 10개 부서가 등록되어 있습니다. 이 중에서 dept_code의 값이 ‘d010’인 IT 부서는 할당된 관리자가 없습니다. 따라서 dept_manager 테이블에 dept_no 값이 ‘d010’인 건이 없습니다. 그런데 모든 부서를 조회해야 하므로 외부 조인을 해야죠. 조인 조건을 만족하지 않는 데이터가 있는 쪽이 departments고 조인 구문의 오른쪽에 있으므로 RIGHT 조인을 사용합니다.
WHERE SYSDATE() BETWEEN IFNULL(a.from_date, SYSDATE())
AND IFNULL(a.to_date, SYSDATE());
dept_manager 테이블에 IT 부서 정보가 없어 RIGHT 조인을 했는데, 이때 from_date와 to_date 칼럼이 반환하는 값은 NULL입니다. 현재 날짜와 NULL을 비교하면 조건을 제대로 확인하지 못해서 IT 부서 정보를 가져올 수 없죠. 그래서 BETWEEN... AND 연산자에 IFNULL() 함수를 사용합니다. IFNULL() 함수는 첫 번째 매개변수인 from_date, to_date 칼럼 값이 NULL이면 SYSDATE() 함수의 반환값을 반환합니다. 따라서 IT 부서는 SYSDATE() BETWEEN SYSDATE() AND SYSDATE() 조건이 적용되어(조건 확인 결과는 참) IT 부서 정보도 조회할 수 있습니다.
결과를 보면 10개 부서의 이름과 관리자 사번을 조회했는데, IT 부서는 dept_manager 테이블에 할당된 값이 없어서 나머지 칼럼(emp_no, from_date, to_date)의 값은 모두 NULL로 조회됐습니다.