책 내용 질문하기
쿼리 작성
도서
2026 시나공 컴퓨터활용능력1급 실기 기본서
페이지
286
조회수
84
작성일
2026-09-05
작성자
권*산
첨부파일

<재학생>과 <봉사내역> 테이블을 이용하여 시수의 합계가 10이상인 학생의 '비고' 필드의 값을 '우수 봉사 학생' 으로 변경하는 <우수봉사학생처리> 업데이트 쿼리를 작성한 후 실행하시오. (In 연산자와 하위 쿼리 사용) 이게 문제인데 해설에 in (select 학번 from 봉사내역 group by 학번 having sum(시수)>=10) 이렇게 되어있는데 책에 실행을 누르면 "5행을 새로 고칩니다."라는 메시지가 떠야 한다는데 저는 "21행을 새로 고칩니다."가 뜹니다... 똑같이 했는데 무슨 문제일까요?

답변
2026-09-07 09:37:57

안녕하세요.

이 경우 가장 가능성이 높은 원인은 바깥쪽 업데이트 쿼리에 <봉사내역> 테이블까지 추가한 경우입니다.

문제에서 “<재학생>과 <봉사내역> 테이블을 이용”한다고 되어 있어 두 테이블을 쿼리 디자인 화면에 모두 추가하기 쉽지만, In 연산자와 하위 쿼리를 사용하라는 문제에서는 바깥쪽에는 <재학생>만 있어야 합니다. <봉사내역>은 하위 쿼리 안에서만 사용합니다.

정답 구조는 다음과 같아야 합니다.

UPDATE 재학생
SET 재학생.비고 = "우수 봉사 학생"
WHERE 재학생.학번 In
(
    SELECT 학번
    FROM 봉사내역
    GROUP BY 학번
    HAVING Sum(시수) >= 10
);

여기서 하위 쿼리는 먼저 봉사내역을 학번별로 묶어 시수 합계가 10 이상인 학생만 찾습니다. 예를 들어 그 학생이 5명이면 바깥쪽 <재학생> 테이블에서 그 5명만 업데이트되므로 “5행을 새로 고칩니다.”가 나오는 것이 정상입니다.

반대로 디자인 화면에 재학생과 봉사내역을 둘 다 올려놓고 연결해 놓으면 SQL이 대략 다음처럼 될 수 있습니다.

UPDATE 재학생
INNER JOIN 봉사내역
ON 재학생.학번 = 봉사내역.학번
SET 재학생.비고 = "우수 봉사 학생"
WHERE 재학생.학번 In
(
    SELECT 학번
    FROM 봉사내역
    GROUP BY 학번
    HAVING Sum(시수) >= 10
);

이 경우 한 학생에게 봉사내역이 여러 건 있기 때문에 학생 5명이 아니라 연결된 봉사내역 레코드까지 포함하여 21행처럼 크게 잡힐 수 있습니다.

따라서 디자인 보기에서 확인해 보세요. 위쪽 테이블 영역에 <재학생>만 있어야 합니다. <봉사내역> 테이블이 보인다면 삭제하세요. 삭제한다고 실제 테이블이 삭제되는 것은 아니고, 현재 쿼리에서만 빠지는 것입니다.

그리고 조건에는 다음처럼 입력하면 됩니다.

필드: 학번
테이블: 재학생
조건:
In (SELECT 학번 FROM 봉사내역 GROUP BY 학번 HAVING Sum(시수)>=10)

핵심은 재학생 = 업데이트 대상, 봉사내역 = 하위 쿼리에서 조건을 계산하는 자료로 역할을 분리하는 것입니다.

따라서 수식 In (select 학번 from 봉사내역 group by 학번 having sum(시수)>=10) 자체가 같더라도, 쿼리 위쪽에 봉사내역을 추가해 놓았는지 여부에 따라 5행과 21행의 차이가 발생할 수 있습니다.

즐거운 하루 되세요.

  • 관리자
    2026-09-07 09:37:57

    안녕하세요.

    이 경우 가장 가능성이 높은 원인은 바깥쪽 업데이트 쿼리에 <봉사내역> 테이블까지 추가한 경우입니다.

    문제에서 “<재학생>과 <봉사내역> 테이블을 이용”한다고 되어 있어 두 테이블을 쿼리 디자인 화면에 모두 추가하기 쉽지만, In 연산자와 하위 쿼리를 사용하라는 문제에서는 바깥쪽에는 <재학생>만 있어야 합니다. <봉사내역>은 하위 쿼리 안에서만 사용합니다.

    정답 구조는 다음과 같아야 합니다.

    UPDATE 재학생
    SET 재학생.비고 = "우수 봉사 학생"
    WHERE 재학생.학번 In
    (
        SELECT 학번
        FROM 봉사내역
        GROUP BY 학번
        HAVING Sum(시수) >= 10
    );

    여기서 하위 쿼리는 먼저 봉사내역을 학번별로 묶어 시수 합계가 10 이상인 학생만 찾습니다. 예를 들어 그 학생이 5명이면 바깥쪽 <재학생> 테이블에서 그 5명만 업데이트되므로 “5행을 새로 고칩니다.”가 나오는 것이 정상입니다.

    반대로 디자인 화면에 재학생과 봉사내역을 둘 다 올려놓고 연결해 놓으면 SQL이 대략 다음처럼 될 수 있습니다.

    UPDATE 재학생
    INNER JOIN 봉사내역
    ON 재학생.학번 = 봉사내역.학번
    SET 재학생.비고 = "우수 봉사 학생"
    WHERE 재학생.학번 In
    (
        SELECT 학번
        FROM 봉사내역
        GROUP BY 학번
        HAVING Sum(시수) >= 10
    );

    이 경우 한 학생에게 봉사내역이 여러 건 있기 때문에 학생 5명이 아니라 연결된 봉사내역 레코드까지 포함하여 21행처럼 크게 잡힐 수 있습니다.

    따라서 디자인 보기에서 확인해 보세요. 위쪽 테이블 영역에 <재학생>만 있어야 합니다. <봉사내역> 테이블이 보인다면 삭제하세요. 삭제한다고 실제 테이블이 삭제되는 것은 아니고, 현재 쿼리에서만 빠지는 것입니다.

    그리고 조건에는 다음처럼 입력하면 됩니다.

    필드: 학번
    테이블: 재학생
    조건:
    In (SELECT 학번 FROM 봉사내역 GROUP BY 학번 HAVING Sum(시수)>=10)

    핵심은 재학생 = 업데이트 대상, 봉사내역 = 하위 쿼리에서 조건을 계산하는 자료로 역할을 분리하는 것입니다.

    따라서 수식 In (select 학번 from 봉사내역 group by 학번 having sum(시수)>=10) 자체가 같더라도, 쿼리 위쪽에 봉사내역을 추가해 놓았는지 여부에 따라 5행과 21행의 차이가 발생할 수 있습니다.

    즐거운 하루 되세요.

· 5MB 이하의 zip, 문서, 이미지 파일만 가능합니다.
· 폭언, 욕설, 비방 등은 관리자에 의해 경고없이 삭제됩니다.