문제
다음과 같은 환경에서 조인 조건이 명시적이지 않아 스키마 변경 시 의도치 않은 결과가 발생할 위험이 가장 큰 SQL 구문은?
테이블 ORDERS (10만건), CUSTOMERS (1만건) ORDERS.CUSTOMER_ID에 인덱스 없음 CUSTOMERS.CUSTOMER_ID는 PK
① SELECT * FROM ORDERS WHERE CUSTOMER_ID IN (SELECT CUSTOMER_ID FROM CUSTOMERS WHERE REGION = 'ASIA') ② SELECT * FROM ORDERS O, CUSTOMERS C WHERE O.CUSTOMER_ID = C.CUSTOMER_ID AND C.REGION = 'ASIA' ③ SELECT * FROM ORDERS WHERE EXISTS (SELECT 1 FROM CUSTOMERS WHERE CUSTOMER_ID = ORDERS.CUSTOMER_ID AND REGION = 'ASIA') ④ SELECT * FROM ORDERS NATURAL JOIN CUSTOMERS WHERE REGION = 'ASIA'
정답
4번
해설
④가 정답입니다. NATURAL JOIN은 두 테이블에서 이름이 같은 모든 컬럼을 자동으로 조인 조건으로 사용합니다. 이로 인해 (1) CUSTOMER_ID 외의 동명 컬럼(예: CREATED_DATE 등)이 추가되면 의도하지 않은 컬럼이 조인 조건에 포함되어 결과가 달라지고, (2) 조인 조건이 스키마에 암묵적으로 의존하므로 컬럼 추가/변경 시 쿼리가 조용히 깨질 수 있으며, (3) 동명 컬럼이 하나도 없으면 Cartesian Product가 발생합니다. ①②③은 모두 조인 조건을 명시적으로 기술하므로 유지보수 측면에서 안전합니다.