안녕하세요. 전산직 공무원 준비를 하고 있는 사람입니다.
sql 문제에서 학원 선생님의 수업을 듣고도 무슨 소리인지 된통 알 수가 없어
인터넷으로 이리저리 검색하다가 DATABASE.SARANG.NET을 찾게 되어 이렇게 고수님들께 질문 드립니다.
문제)
다음 EMPLOYEE, PROJECT, WORKSON 테이블로 구성된 데이터베이스에서 "모든 프로젝트에 참가하는 직원의 이름을 검색하라"를 수행하기 위한 SQL문으로 옳은 것은?
EMPLOYEE(eNo, eName)
PROJECT(pNo, pName)
WORKSON(eNo, pNo)
정답)
SELECT eName
FROM EMPLOYEE E
WHERE NOT EXISTS(
SELECT P.pNo
FROM PROJECT P
WHERE NOT EXISTS(
SELECT W.pNo
FROM WORKSON W
WHERE P.pNo = W.pNo AND E.eNo = W.eNo
)
);
위의 sql 문장이 정답인데요.
먼저 부속질의와 조인에 대한 기본적인 개념은 확실히 알고 있습니다.
그런데 제일 안쪽 부속질의를 보면 WHERE 문장에서 부속질의 바깥 부분의 PROJECT 테이블 참조를 볼 수 있는데
어떻게 안쪽 부속질의에서 조인을 하지 않았는데 가져다 쓸 수 있는 것이죠??
그리고 부속질의의 결과는 P.pNo이고 처음 질의는 EMPLOYEE 테이블에서의 WHERE절이고 EMPLOYEE에는 pNo 속성이 있지도 않은데 어떻게 비교를 할 수 있는 것이죠?
그래서 저는 부속질의를 하면 자동으로 조인 된다던가, 아니면 그냥 참조가 가능하게끔 DBMS가 통제를 해준다던가라고만 생각했었습니다.
다음은 다시 제일 안쪽 부속질의를 보면 여기서는 한 명이라도 프로젝트에 참가한 직원의 pNo을 출력할 것이고
그 다음 부속질의에서는 한 명도 참가하지 않은 pNo이 출력될 것입니다.
그럼 최종적으로 한 명도 참가하지 않은 pNo의 NOT EXISTS이니 다시
한 명이라도 프로젝트에 참가한 직원의 pNo을 출력하는 거 아닌가요??
계속 생각해본 결과
SELECT eName FROM EMPLOYEE E WHERE NOT EXISTS 괄호 안에는
한 명이라도 참가한 프로젝트와 한명도 참가하지 않은 프로젝트가 들어있으니깐
그것을 뺀 나머지는 모두 참가하는 건가?? 라고 생각했습니다.
그런데 한 명이라도 참가한 프로젝트는 모든 프로젝트에 참가한 직원의 프로젝트도 포함되어 있는데
그럼 출력이 0이 되야 하는거 아닌가요??
제 생각으로는 첫번째, 두번째 질문에 대한 이해가 떨어져서 이 문제의 이해를 못하고 있는 것 같습니다.
장황하게 썼는데 공무원 데이터베이스 시험에서 SQL문은 고득점을 받는냐 안 받는냐의 기로가 되는 문제입니다.
고수님들 잘 좀 부탁드리겠습니다. |