문제
아래 SQL과 같은 결과를 반환하는 SQL로 가장 적절한 것은?
SQLSELECT * FROM A WHERE 번호 IN ( SELECT 번호 FROM B WHERE A.성별 = B.성별 );
① SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE A.성별 = B.성별 AND A.번호 = B.번호) ② SELECT * FROM A JOIN B ON A.성별 = B.성별 ③ SELECT * FROM A WHERE A.성별 IN (SELECT B.성별 FROM B WHERE A.번호 = B.번호) ④ SELECT * FROM A WHERE 번호 = ALL (SELECT 번호 FROM B WHERE A.성별 = B.성별)
정답
1번
해설
정답: 1. 원 SQL은 같은 성별의 B 행 중 A.번호와 같은 번호가 존재하는지 확인하므로 EXISTS에 성별과 번호 조건을 모두 넣은 1번과 같은 의미이다.
오답 풀이
- 1번: IN 조건을 EXISTS로 올바르게 변환한 형태이다.
- 2번: 성별만 같으면 조인되어 번호 조건이 빠진다.
- 3번: 성별 IN 조건으로 바뀌어 원문의 번호 포함 여부와 다르다.
- 4번: ALL은 서브쿼리의 모든 번호와 같아야 하므로 의미가 다르다.
보충 개념 IN은 값이 서브쿼리 결과 집합에 포함되는지 확인한다. EXISTS로 바꿀 때는 동일한 비교 조건을 상관 조건으로 명확히 작성해야 한다.