
정답on delete cascade는 참조하는 '행 전체'를 연쇄 삭제하는 것이지 외래키 '열'을 삭제하는 것이 아니므로 틀린 설명입니다.
핵심 개념
참조 무결성과 외래키 삭제 규칙(ON DELETE)
참조 무결성 제약조건은 외래키 값이 반드시 참조되는 릴레이션의 기본키 값 중 하나이거나 널이어야 한다는 규칙입니다. 참조되는(부모) 테이블의 행이 삭제되면 이 규칙이 깨질 수 있으므로, SQL은 FOREIGN KEY 정의에 ON DELETE 옵션을 붙여 연쇄 동작을 지정합니다. CASCADE는 참조하는 행까지 함께 삭제하고, SET NULL은 외래키 값을 널로 바꾸며, SET DEFAULT는 미리 정의된 기본값으로 바꾸고, NO ACTION(또는 RESTRICT)은 위반이 발생하면 삭제 연산 자체를 거부합니다. 각 옵션이 '무엇을' 바꾸는지(행 전체인지 열 값인지)를 구분하는 것이 이 문항의 핵심입니다.
선지별 해설
①on delete set null은 피참조 행이 삭제될 때 그 행을 참조하던 튜플의 외래키 열 값을 null로 바꾸어 무결성을 유지합니다. 다만 해당 외래키 열이 NOT NULL로 선언되어 있으면 사용할 수 없습니다.
②on delete cascade는 참조되는 행이 삭제되면 그것을 참조하던 튜플(행) 자체를 연쇄적으로 삭제합니다. '외래키 열을 삭제한다'는 표현은 열(컬럼) 구조를 제거한다는 뜻이 되는데, 이는 ALTER TABLE DROP COLUMN에 해당하는 스키마 변경이므로 삭제 규칙과는 무관합니다.
③on delete set default는 피참조 행이 삭제되면 외래키 열을 열 정의에 명시된 DEFAULT 값으로 바꿉니다. 이때 그 기본값도 피참조 테이블에 존재하는 값이어야 참조 무결성이 유지됩니다.
④on delete no action은 아무 보정 동작을 하지 않는 대신, 삭제로 인해 참조 무결성이 깨지는 경우 그 삭제 연산 자체를 거부(오류 반환)합니다. 즉 참조하는 행이 남아 있으면 부모 행을 지울 수 없습니다.

정답동아리로 GROUP BY한 뒤 HAVING SUM(학생수) >= 10으로 그룹 조건을 주고 SUM(과제수)를 출력하는 ①번이 옳습니다.
핵심 개념
GROUP BY와 HAVING — 집계 결과에 대한 조건 지정
SQL에서 조건절은 적용 시점이 다릅니다. WHERE는 그룹화 이전에 개별 행을 걸러내므로 SUM, COUNT 같은 집계함수를 쓸 수 없고, HAVING은 GROUP BY로 묶인 그룹의 집계 결과에 조건을 거는 절입니다. 이 문항의 과제 테이블은 (학년, 동아리)별로 행이 나뉘어 있으므로 '동아리에 가입한 학생 수'는 동아리별로 SUM(학생수)를 구해야 나옵니다. 따라서 동아리로 GROUP BY한 뒤 HAVING SUM(학생수) >= 10으로 그룹을 거르고, 그 그룹의 SUM(과제수)를 출력하는 구조가 되어야 합니다.
선지별 해설
①GROUP BY 동아리로 동아리별 그룹을 만들고, HAVING SUM(학생수) >= 10으로 총 가입 학생 수가 10명 이상인 그룹만 남긴 뒤 SUM(과제수)를 출력하므로 요구사항을 정확히 만족합니다.
②WHERE절에는 집계함수 SUM()을 사용할 수 없습니다. WHERE는 그룹이 만들어지기 전 개별 행에 적용되기 때문이며, GROUP BY도 없어 동아리별 합계를 낼 수 없으므로 문법 오류가 납니다.
③GROUP BY 없이 HAVING만 쓰면 테이블 전체가 하나의 그룹으로 취급되어 동아리별 결과가 나오지 않고, 집계되지 않은 열인 동아리를 SELECT할 수도 없어 표준 SQL에서는 오류입니다.
④WHERE 학생수 >= 10은 학년별 개별 행 단위 조건이라 '동아리 전체 가입 학생 수'와 다릅니다. 예를 들어 C동아리는 총 13명(5+8)이지만 어느 행도 10 이상이 아니어서 아예 제외되고, A동아리도 3학년 행(5명)이 빠진 채 과제수가 합산되므로 결과가 달라집니다.