상품 주문 관리 데이터베이스를 구성하는 세 테이블의 스키마가 다음과 같… | [7급 국가직 데이터베이스론] 26년 1회차 기출문제 상세 페이지
1[7급 국가직 데이터베이스론] 26년 1회차
상품 주문 관리 데이터베이스를 구성하는 세 테이블의 스키마가 다음과 같다. 2026년도(출시연도)에 출시된 PAD(상품종류)가 두 개 이상일 때, 해당 PAD 상품을 모두 한 번 이상 주문한 고객의 고객번호를 출력하는 SQL 문은? (단, 각 테이블의 밑줄 친 속성은 기본키이고, 주문.고객번호와 주문.상품번호는 각각 고객.고객번호와 상품.상품번호를 참조하는 외래키이다)고객(고객번호, 이름)
상품(상품번호, 상품종류, 출시연도)
주문(주문번호, 고객번호, 상품번호, 주문일자)
1
SELECT DISTINCT C.고객번호
FROM 고객 C, 상품 P, 주문 O
WHERE C.고객번호 = O.고객번호 AND P.상품번호 = O.상품번호
AND P.상품종류 = “PAD” AND P.출시연도 = 2026
GROUP BY C.고객번호
HAVING COUNT(*) = (SELECT COUNT(*) FROM 상품
WHERE 상품종류 = “PAD” AND 출시연도 = 2026);
2
SELECT DISTINCT C.고객번호
FROM 고객 C
WHERE NOT EXISTS (
SELECT *
FROM 상품 P
WHERE P.상품종류 = “PAD” AND P.출시연도 = 2026
AND NOT EXISTS (
SELECT *
FROM 주문 O
WHERE C.고객번호 = O.고객번호 AND P.상품번호 =
O.상품번호));
3
SELECT DISTINCT C.고객번호
FROM 고객 C INNER JOIN 주문 O ON C.고객번호 =
O.고객번호 INNER JOIN 상품 P ON P.상품번호 = O.상품번호
WHERE P.상품종류 = “PAD” AND P.출시연도 = 2026
GROUP BY C.고객번호
HAVING COUNT(*) >= 1;
4
SELECT DISTINCT C.고객번호
FROM 고객 C
WHERE C.고객번호 NOT IN (
SELECT 고객번호
FROM 주문
WHERE 상품번호 NOT IN (
SELECT 상품번호
FROM 상품
WHERE 상품종류 = “PAD” AND 출시연도 = 2026));
해설
이중 NOT EXISTS로 ‘주문하지 않은 2026년 PAD 상품이 하나도 없는 고객’을 찾는 SQL이 요구를 정확히 구현한다.
안쪽 질의는 해당 고객이 주문하지 않은 PAD 상품을 찾고, 그런 상품이 없을 때만 고객이 선택되므로 관계대수의 나눗셈과 같다.
- 그룹별 COUNT(*)를 PAD 상품 수와 비교하는 질의는 상품 종류가 아닌 주문 건수를 세므로, 같은 PAD를 여러 번 주문하고 다른 PAD는 주문하지 않은 고객도 선택될 수 있다.
- HAVING COUNT(*) >= 1 질의는 PAD 상품을 하나라도 주문한 고객을 모두 출력한다.
- NOT IN 이중 질의는 PAD가 아닌 상품을 주문한 적이 없는 고객(주문이 없는 고객 포함)을 찾을 뿐, 모든 PAD의 주문 여부를 확인하지 않는다.
오류나 개정된 내용이 보이면 알려주세요