SQL NOT EXISTS사용과 관련하여 질문이 있습니다.
95
작성한 질문수 1
안녕하세요. 강의 잘 듣고 있습니다.
강의 16:18 정도에 나오는 2000년대생이 없는 부서의 id와 name을 찾는 것에서 아래와 같이 쿼리를 하셨는데요:
mysql> SELECT D.id, D.name
-> FROM department AS D
-> WHERE NOT EXISTS (
-> SELECT * FROM employee E
-> WHERE D.id = E.dept_id and E.birth_date >= '2000-01-01');
위의 쿼리를 다음과 같이 바꾸니 아무런 결과가 출력되지 않고 Empty set이라고 나옵니다. 혹시 이유를 알 수 있을까요? 두 쿼리에서 다른점은 빨간 글씨로 써놨는데요. subquery에서 department를 다시 D로 한번 불러준 것 외엔 없습니다.
mysql> SELECT D.id, D.name
-> FROM department AS D
-> WHERE NOT EXISTS(
-> SELECT * FROM employee E , department D
-> WHERE D.id =E.dept_id AND E.birth_date >= '2000-01-01');
Empty set (0.00 sec)
감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
언제나처음처럼님, 제시하신 SQL 쿼리에 대해 설명 드리겠습니다.
첫 번째 쿼리에서는 NOT EXISTS 절 내의 서브쿼리에서 employee 테이블과 department 테이블의 조건을 비교하는 방식으로 작성되어 있습니다. 이대로라면 각 부서마다 2000년 이후에 태어난 직원이 존재하지 않는 부서를 반영하는 올바른 결과가 반환됩니다.
하지만 두 번째 쿼리에서는 employee 테이블과 department 테이블이 함께 FROM 절에 명시되어 있습니다. 이렇게 되면 모든 employee-department 조합이 생성되며, Cartesian Product가 발생합니다. 그로 인해 D.id = E.dept_id 조건이 충족되면서 여전히 2000년 이후에 태어난 직원이 존재한다고 해석되기 때문에, 결국 NOT EXISTS 절이 항상 FALSE를 반환하게 됩니다. 그러므로 “Empty set”으로 결과가 나오게 된 것입니다.
서브쿼리 내에서 department 테이블을 중복해서 불러올 필요가 없으며, 첫 번째 쿼리 형태로 유지하는 것이 올바른 결과를 얻는 데 적합합니다.
감사합니다.
vercel실행 - failed to fetch
0
8
1
드랍 테이블로 지운 ordes에 대해서 질문
0
20
1
문제 풀이 1번 질문
0
28
1
아주 작은 정오표 전달드립니다.
0
52
2
mysql워크벤치를 실행할때마다 오류가 뜹니다. 해결 방법좀 가르켜주세요.
0
44
1
온톨로지 구축
0
27
1
실제로 작은 기업에서 기획 롤
1
26
1
함수기반 인덱스
0
29
2
날짜 인덱스관련 질문
0
26
1
복합인덱스 확인법
0
23
0
order_product 까마귀발
0
44
2
공통 코드 , 계층 구조 질문
1
39
1
77번 문제
0
27
1
76번 문제
1
35
2
64번 문제 관련
0
37
2
2,3차 정규화 질문
0
43
2
수강완료 후 문의 드립니다.
1
47
2
실전 모의고사 난이도
0
60
2
Part2 기출 문제 및 해설 자료 파일 없음 형태
0
53
2
강의자료 다운 질문..
0
116
1
요청사항이 있습니다!
0
226
1
테이블 조인(join) 강의에서 마지막 join 예제에 대한 질문이 있습니다.
0
444
1
D.leader_id를 E.id로 변경해도 되나요??
0
376
1
강의자료
0
756
1





