inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Giới thiệu về cơ sở dữ liệu & SQL do nhà phát triển phụ trợ cấp cao giảng dạy

Truy vấn lồng (subquery)

SQL NOT EXISTS사용과 관련하여 질문이 있습니다.

126

alwaysdayone

1 câu hỏi đã được viết

0

안녕하세요. 강의 잘 듣고 있습니다.

강의 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)

 

감사합니다.

sql dbms/rdbms

Câu trả lời 1

0

communityai8509

안녕하세요, 인프런 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 테이블을 중복해서 불러올 필요가 없으며, 첫 번째 쿼리 형태로 유지하는 것이 올바른 결과를 얻는 데 적합합니다.

감사합니다.

조회 대상 행이 적을 때도 Using filesort 제거를 고려해야 하나요?

0

20

2

강의 관련 질문드립니다.

1

42

2

SYSDATE 입력

0

33

1

테이블 생성 시 PK 및 제약조건 문의

0

40

1

TCL 문의

0

32

1

PK를 AUTO_INCREMENT UUID를 UNIQUE로 하는것에 대해

0

41

2

본질 및 인조 식별자 질문

0

32

1

pk를 auto increment로 하는것에 대해서

0

43

2

슈퍼키 문의

0

37

1

질문있습니다!

0

40

1

3-13 리텐션 과제 제출합니다!

0

63

2

getOrCreate / Unique? 멱등 처리 질문

1

64

2

경쟁상태

0

52

1

stmt

0

44

1

실행 통계2 explain analyze 조인 쿼리

0

55

1

3강 인덱스 구조 강의 자료 문의

1

63

1

조회 메서드에서 @Transactional(readOnly=true) 질문

1

43

1

68강 문제 풀이

0

44

1

현대 쿼리 복잡성에 관한 질문

0

92

3

강의자료 다운 질문..

0

146

1

요청사항이 있습니다!

0

251

1

테이블 조인(join) 강의에서 마지막 join 예제에 대한 질문이 있습니다.

0

460

1

D.leader_id를 E.id로 변경해도 되나요??

0

399

1

강의자료

0

779

1