데이터베이스 문제를 풀다가
"모든 프로젝트에 참가하는 직원의 이름을 검색하"는 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를 적절히 넣어서 조합하면
- 프로젝트에 모두 참여하는 직원
- 프로젝트에 모두 불참하는 직원
- 프로젝트에 하나라도 참여하는 (= 참여하지 않는것이 하나이상인) 직원
이러한 경우를 풀 수 있다.
'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 |
댓글