특히 눈여겨볼 부분은 조건 서브쿼리의 SELECT 절에 1을 명시한 점입니다. 여기서 1은 아무 의미가 없습니다. EXISTS 연산자의 특성상 메인쿼리의 데이터가 서브쿼리의 결과 집합에 존재하는지 확인하는 부분은 서브쿼리의 WHERE 절에서 처리(AND a.movie_name = b.movie_name)되기 때문에 서브쿼리가 반환하는 칼럼이나 값을 SELECT 절에 명시해 봐야 아무 의미가 없습니다. 따라서 1을 명시하든 *나 임의 값인 ‘A’를 명시하든 특정 칼럼을 명시하든 조건 확인에는 아무런 영향을 주지 않습니다.
코드 9-26
SELECT ranks, movie_name, release_date, sale_amt, rep_country
FROM box_office a
WHERE YEAR(release_date) = 2019
AND ranks BETWEEN 1 AND 100
AND NOT EXISTS (SELECT 1
FROM box_office b
WHERE YEAR(release_date) = 2018
AND ranks BETWEEN 1 AND 100
AND a.rep_country = b.rep_country);
실행결과
코드 9-26은 코드 9-24에서 NOT IN 연산자 대신 NOT EXISTS 연산자를 사용하도록 변경한 쿼리입니다. 조건 확인은 이전 쿼리처럼 조건 서브쿼리의 WHERE 절에서 메인쿼리의 테이블과 서브쿼리의 테이블에 대한 조인 조건을 추가해 수행합니다. 여기서는 2018년 개봉 영화(서브쿼리)와 2019년 개봉 영화(메인쿼리)의 대표 국가가 같은 건을 확인하라는 조건을 주었죠. 따라서 2019년 상위 100개 영화의 대표 국가 중에서 2018년 상위 100개 영화의 대표 국가에 존재하지 않는 건을 체크합니다. 이전 쿼리와 마찬가지로 대만 영화 1편이 조회됐습니다.