다음과 같은 데이터베이스 스키마(schema)와 이에 대한 설명을 참조하여 질의 “학과명 ‘컴퓨터공학과’에서 개설한 교과목 모두를 이수한 학생의 학번과 성명을 검색하시오”를 작성한 SQL 문장으로 옳은 것은?
<데이터베이스 스키마> | ||
교과목(교과목번호, 교과목명, 학과명, 학점)
이수(강좌번호, 학번, 교과목번호, 성적)
강좌(강좌번호, 교과목번호, 개설학년도, 개설학기, 분반)
학생(학번, 성명, 학과명, 입학연도) | ||
<설 명> | ||
○ 밑줄 친 애트리뷰트는 기본키이고, 이탤릭체인 애트리뷰트는 외래키이다.
○ 이수 릴레이션의 강좌번호는 강좌 릴레이션의 강좌번호를 참조하고 학번은 학생 릴레이션의 학번을 참조하며 교과목번호는 교과목 릴레이션의 교과목번호를 참조한다.
○ 강좌 릴레이션의 교과목번호는 교과목 릴레이션의 교과목번호를 참조한다.
○ 이수 릴레이션의 교과목번호는 질의 성능 향상을 위하여 중복시켰다.
○ 모든 학과들은 1개 이상의 교과목들을 개설하고 있는 것으로 가정한다. | ||
- ①
SELECT DISTINCT A.학번, A.성명 FROM 학생 AS A, 이수 AS B WHERE A.학번 = B.학번 AND EXISTS (SELECT C.교과목번호 FROM 교과목 AS C WHERE B.교과목번호 = C.교과목번호 AND C.학과명 = ‘컴퓨터공학과’);
- ②
SELECT A.학번, A.성명 FROM 학생 AS A WHERE NOT EXISTS ((SELECT 교과목번호 FROM 교과목 WHERE 학과명 = ‘컴퓨터공학과’) EXCEPT (SELECT B.교과목번호 FROM 이수 AS B WHERE A.학번 = B.학번));
- ③
SELECT DISTINCT A.학번, A.성명 FROM 학생 AS A, 이수 AS B WHERE A.학번 = B.학번 AND B.교과목번호 = ALL (SELECT 교과목번호 FROM 교과목 WHERE 학과명 = ‘컴퓨터공학과’);
- ④
SELECT A.학번, A.성명 FROM 학생 AS A WHERE A.학번 IN (SELECT B.학번 FROM 이수 AS B WHERE A.학번 = B.학번 AND EXISTS (SELECT C.교과목번호 FROM 교과목 AS C WHERE C.학과명 = ‘컴퓨터공학과’ AND C.교과목번호 = B.교과목번호));
선지를 골라 바로 채점해 보세요.
정답 ②
출처: 인사혁신처 공개 기출(공공데이터포털, 이용허락 제한 없음)