not exists 와 except를 이용한 문제 0 2 7,660

by SirUM [SQL Query] not exists except =all [2017.04.16 00:35:31]


안녕하세요 쿼리를 배우고 있는 초짜중의 초짜입니다 ㅠㅠ.. 공부하다가 도저히 해결되지 않아서 여기에 질문 욜려요.

제가 풀려고 했던 문제는 다음과 같습니다.

 

Biology Department 에서 개설한 모든 수업을 들은 학생의 이름과 ID를 select 하시오.

 

입니다.

테이블은 Student, Course, Takes 가 있습니다.

 

각각 students 에는 ID, Name 의 정보가 들어있고,

course 테이블에는 Dept_name, course_id 의 정보가 들어있으며

takes 테이블에는 course_id, id(해당 수업을 들은 학생의 id) 정보가 들어있습니다.

 

이 테이블들의 정보를 이용하여 어떻게 쿼리를 짜야 해당 문제를 풀 수 있을까요

참고로 해당 문제의 솔루션은

select distinct S.ID , S.name

from student as S

where not exists (( select course_id

                         from  course

                         where dept_name = 'Biology')

                         except

                       ( select T.course_id

                         from takes T

                         where S.ID = T.ID));

 

라고는 되어있는데... 전 이 솔루션부분에서 S.ID = T.ID 부분도 잘 이해가 되질 않습니다 ㅠㅠㅠㅠ

 

예를들어 테이블이 아래와 같이 구성되어있따면

student

id name
1 lee
2 kim
3 AAA
4 BBB
5 CCC

takes

id course_id
1 A
1 B
1 C
2 A
2 B
3 A
3 C
4 B
4 C
5 A

course

course_id dept_name
A Biology
B Biology
C Music
D ComputerScience

 

Biology 에서 개설한 A,B 수업을 모두 들은 학생, 즉 id 가 1,2 번인 학생을 뽑고 싶은겁니다..!

by 마농 [2017.04.17 09:19:13]

0. Except 는 MSSQL 명령어인듯 하네요.
  - 오라클의 Minus 와 같은 의미구요.
  - 차집합입니다.
1. (select course_id from course where dept_name = 'Biology')
  - Biology Department 에서 개설한 모든 수업
2. (select T.course_id from takes T where S.ID = T.ID)
  - 학생 한명(T.ID)이 들은 모든 코스를 의미합니다.
  - 상관관계 서브쿼리로 메인의 결과집합에 대해 학생한명 마다 반복 수행됩니다.
3. (1) Except (2)
  - Biology Department 에서 개설한 모든 수업 중에
  - 학생 한명(T.ID)이 들은 모든 코스를 제외(Except)시킨거죠.
4. Not Exists (3)
  - (3) 의 결과가 없다면? (1)의 코스를 (2)에서 모두 들었다는 의미입니다.
5. Distinct 는
  - 필요 없어 보이네요.


by SirUM [2017.04.17 11:52:10]

허억 ㅠ0ㅜ)!!!! not exists , exists 에 대한 이해도문제였던것 같습니다...! 친절하고 빠른 답변 정말 감사합니다 ㅠㅠㅠㅠ 더 열심히 공부해야할것 같네요 lllorz

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입