본문 바로가기
2023-2/데이터베이스

SQL: 모든 프로젝트에 참가하는 직원의 이름을 검색하라

by 철없는민물장어 2023. 10. 21.
728x90

데이터베이스 문제를 풀다가

"모든 프로젝트에 참가하는 직원의 이름을 검색하"는 SQL문을 작성해야했는데

쉽게 방법이 떠오르지가 않았다.

심지어는 답안을 봐도 단번에 이해하기가 힘들었다.

그래서 내 방식대로 이해는 했는데 기록을 안 해두면 까먹을것같아서...

이 글을 적어봄.

 

문제

다음 EMPLOYEE, PROJECT, WORKSON 테이블로 구성된 데이터베이스에서, 

"모든 프로젝트에 참가하는 직원의 이름을 검색하라."를 수행하기 위한 SQL문으로 옳은 것은?

EMPLOYEE(eNo, eName)
PROJECT(pNo,pName)
WORKSON(eNo,pNo)

 

SELECT eName
FROM EMPLOYEE e
WHERE NOT EXISTS(
	SELECT *
    FROM PROJECT p
    WHERE NOT EXISTS(
    	SELECT *
        from WORKSON w
        WHERE w.pid=p.pid and w.eNo=e.eNo));

이중반복문을 돌면서 조건을 확인한다고 생각하니 이해가 쉬웠다.

 

첫번째 select에서 직원 1명 선택,(큰 반복문)

두번째 select에서 프로젝트 1개 선택,(내부 중첩반복문)

세번째 select에서 workson테이블에 해당 직원과 프로젝트가 짝지어진게 있는지 찾음.

=> 짝지어진게 없다면? (즉, 조회결과 레코드 존재하지 않음)

 

=> 두번째 select에서 where not exists가 만족됨

=> 해당 p 레코드가 두번째 select문 결과에 추가됨

(즉, 선택한 직원이 참여하지 않은 프로젝트는 두번째 select문의 결과로 쌓임)

 

=> 첫번째 select에서 where not exists가 만족되지 않으므로(즉, 참여 안한 프로젝트가 있으므로) 해당 직원은 출력하지 않음.

 


이 SQL문에는 두개의 WHERE NOT EXISTS가 있는데,

이 자리에 WHERE EXISTS를 적절히 넣어서 조합하면

 

- 프로젝트에 모두 참여하는 직원

- 프로젝트에 모두 불참하는 직원

- 프로젝트에 하나라도 참여하는 (= 참여하지 않는것이 하나이상인) 직원

 

이러한 경우를 풀 수 있다.

 

728x90

'2023-2 > 데이터베이스' 카테고리의 다른 글

물리적 설계  (0) 2023.12.16
6. ER 모델을 이용한 데이터 모델링  (0) 2023.10.21
5. 데이터베이스 응용 개발  (0) 2023.10.21
4. 고급 SQL  (0) 2023.10.12
3. SQL  (0) 2023.09.26

댓글