SQLD 모의고사 11회
50문항 · 제한 시간 90분. 다 풀면 과목별 점수와 합격 여부, 문제마다 해설을 보여 줘요.
1. 다음 사례에서 가장 직접적으로 부족했던 좋은 데이터 모델의 요소는?
온라인 쇼핑몰 S사는 주문·상품·회원·배송 위주로 데이터 모델을 설계하고 서비스를 오픈하였다. 그런데 오픈 직후 반품 접수가 시작되자 반품 사유, 반품 수거일, 환불 금액 등을 저장할 엔터티와 속성이 모델 어디에도 정의되어 있지 않다는 사실이 드러났고, 결국 급히 테이블을 추가하고 프로그램을 수정해야 했다.
- 중복 배제
- 완전성
- 데이터 재사용
- 의사소통
2. 온라인 쇼핑몰 모델링 회의에서 다음과 같은 엔터티 이름이 제안되었다. 엔터티 명명 규칙에 가장 부합하는 것은?
고객이 결제한 주문- 업무 의미가 드러나도록 서술식으로 작성한 이름주문상품들- 엔터티는 여러 인스턴스의 집합이므로 복수형으로 작성한 이름반품- 현업에서 실제로 쓰는 용어를 단수 명사로 간결하게 작성한 이름ORD_DLV_T- 이름 길이를 줄이기 위해 영문 약어를 조합한 이름
3. 온라인 쇼핑몰의
상품엔터티에옵션정보속성을 두고 다음과 같이 값을 저장하도록 설계하였다.상품코드 상품명 옵션정보 P01 라운드티 빨강/S:재고5:+0원, 빨강/M:재고3:+1000원, 검정/L:재고0:+1000원 이 설계에 대한 판단으로 가장 적절한 것은?
- 옵션은 한 상품에 여러 개 존재하고 각각 재고·추가금액이라는 고유한 설명 정보를 가지므로,
상품옵션엔터티로 분리하는 것이 적절하다. - 옵션정보는 하나의 문자열 값으로 저장되므로 단일값 속성에 해당하며 현재 설계가 적절하다.
- 옵션별 재고는 다른 속성으로부터 계산되는 파생 속성이므로 저장하지 않고 조회 시 계산해야 한다.
- 다중값 속성은
옵션1,옵션2,옵션3처럼 같은 성격의 속성을 반복해서 펼쳐 두는 것이 원칙이다.
- 옵션은 한 상품에 여러 개 존재하고 각각 재고·추가금액이라는 고유한 설명 정보를 가지므로,
4. 온라인 쇼핑몰의 업무 규칙이 다음과 같다.
- 모든 배송은 반드시 하나의 주문에 대해 생성된다.
- 하나의 주문은 아직 배송이 시작되지 않아 배송이 없을 수도 있고, 분할 배송되어 배송이 여러 건일 수도 있다.
이를 IE 표기법으로 바르게 나타낸 것은? (
|는 필수 또는 1,o는 선택,{는 여러 건을 뜻하며, 각 기호는 가까이 있는 엔터티에 대한 표시이다.)주문 ||--|{ 배송주문 o|--o{ 배송주문 ||--o| 배송주문 ||--o{ 배송
5. 온라인 쇼핑몰의 엔터티별 주식별자를 정하려 한다. 주식별자 도출 기준에 대한 설명으로 가장 적절하지 않은 것은?
- 해당 업무에서 인스턴스를 구분할 때 실제로 자주 이용하는 속성을 주식별자로 지정한다.
상품명처럼 이름으로 기술되는 속성은 동명 상품이나 이름 변경 가능성이 있으므로 주식별자로 지정하지 않는 것이 좋다.- 복합식별자를 구성할 때는 유일성을 확실히 보장하기 위해 관련 속성을 가능한 한 많이 포함한다.
- 주식별자는 한번 정해지면 변하지 않아야 하므로 업무상 자주 수정되는 속성은 피한다.
6. 온라인 쇼핑몰의
주문테이블은 다음과 같다. PK는주문번호이며, 모든 컬럼은 원자값만 가진다.주문(주문번호, 주문일자, 회원번호, 회원등급, 등급할인율)
업무 규칙상 함수 종속은 다음과 같다.
- 주문번호 → 주문일자, 회원번호
- 회원번호 → 회원등급
- 회원등급 → 등급할인율
이 테이블이 만족하는 가장 높은 정규형과 그 이유로 옳은 것은?
- 제1정규형 - 회원등급이 PK의 일부에만 종속되는 부분 함수 종속이 있다.
- 제2정규형 - PK가 단일 속성이라 부분 함수 종속은 없지만, 주문번호 → 회원번호 → 회원등급 → 등급할인율의 이행 함수 종속이 있다.
- 제3정규형 - 모든 일반 속성이 결국 주문번호에 의해 결정되므로 이행 함수 종속 문제가 없다.
- BCNF - 주문번호 하나로 모든 속성이 결정되므로 모든 결정자가 후보키이다.
7. 온라인 쇼핑몰의 관계를 조인으로 구현할 때의 설명으로 가장 적절하지 않은 것은?
주문→회원관계가 필수(모든 주문은 반드시 한 회원에 속함)이고 주문의 회원번호 FK가 NOT NULL이면, 주문을 기준으로 회원을 INNER JOIN해도 주문 행이 누락되지 않는다.회원쪽에서주문이 선택(주문이 없는 회원 존재)이면, 주문이 없는 회원까지 함께 조회하려면 회원을 기준으로 OUTER JOIN해야 한다.- 1:M 관계인 회원과 주문을 조인 조건으로 INNER JOIN하면, 결과 행 수는 회원 수가 아니라 조건을 만족하는 주문(M쪽) 행 수를 따른다.
- M:N 관계인
회원과상품은 교차 엔터티 없이도 두 테이블의 PK끼리 직접 조인하여 '어떤 회원이 어떤 상품을 찜했는지'를 구할 수 있다.
8. 온라인 쇼핑몰의 ERD 일부를 IE 표기법으로 나타내면 다음과 같다. (
|는 필수,o는 선택,{는 여러 건을 의미한다.) 이 모델을 바탕으로 한 트랜잭션 설계로 가장 적절한 것은?회원 ||--o{ 주문 : 주문한다 주문 ||--|{ 주문상품 : 포함한다 상품 ||--o{ 주문상품 : 판매된다- 주문과 주문상품은 양쪽 모두 필수 관계이므로 주문 INSERT와 주문상품 INSERT를 하나의 트랜잭션으로 묶어 함께 COMMIT해야 한다.
- 회원 쪽에서 주문이 선택이지만, 회원 가입과 첫 주문 입력은 반드시 하나의 트랜잭션으로 묶어 처리해야 한다.
- 상품과 주문상품은 1:M 관계이므로 상품을 등록할 때 주문상품도 최소 1건 함께 입력해야 한다.
- 주문상품은 상품을 참조하므로 상품 등록과 주문 생성은 항상 하나의 트랜잭션으로 처리해야 한다.
9. 다음 [MEMBER] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과로 옳은 것은? (Oracle 기준)
[MEMBER]
MEM_NO GRADE 1 VIP 2 NULL 3 GOLD 4 NULL 5 VIP -- (가) SELECT COUNT(DISTINCT GRADE) FROM MEMBER; -- (나) SELECT COUNT(*) FROM (SELECT DISTINCT GRADE FROM MEMBER); -- (다) SELECT COUNT(*) FROM MEMBER WHERE GRADE IN ('VIP', NULL);- (가) 2, (나) 2, (다) 2
- (가) 3, (나) 3, (다) 4
- (가) 2, (나) 3, (다) 2
- (가) 2, (나) 3, (다) 4
10. 온라인 쇼핑몰의
가격이력엔터티는 본질식별자 (상품코드, 판매채널코드, 회원등급코드, 적용시작일시)로 식별된다. 이 식별자가주문상품,가격변경로그,프로모션적용,정산상세등 여러 하위 엔터티로 상속되면서 하위 테이블의 PK가 계속 길어지고 조인 조건도 복잡해지고 있다. 업무상 같은 (상품, 채널, 등급, 적용시작일시) 조합의 가격은 하나만 존재해야 한다. 가장 적절한 개선 방안은?- 본질식별자를 그대로 유지하고 하위 엔터티로 계속 상속하는 것이 정규화 원칙상 유일한 방법이므로 구조를 바꾸지 않는다.
- 인조식별자
가격이력번호를 주식별자로 두고, (상품코드, 판매채널코드, 회원등급코드, 적용시작일시)에는 UNIQUE 제약을 걸어 업무 중복을 막는다. - 인조식별자
가격이력번호를 주식별자로 두면 본질식별자 조합의 유일성도 자동으로 보장되므로 별도의 제약은 필요 없다. - 속성 수를 줄이기 위해
적용시작일시하나만 주식별자로 지정한다.
11. 다음 SQL에서 ㉠ WHERE 절과 ㉡ SELECT 절이 각각 수행하는 관계 연산으로 옳은 것은?
SELECT MEM_NM, EMAIL -- ㉡ FROM MEMBER WHERE GRADE = 'VIP'; -- ㉠- ㉠ 투영(Projection) / ㉡ 선택(Select)
- ㉠ 조인(Join) / ㉡ 투영(Projection)
- ㉠ 선택(Select) / ㉡ 조인(Join)
- ㉠ 선택(Select) / ㉡ 투영(Projection)
12. PRODUCT 테이블에는 PROD_ID, PROD_NM, CATEGORY, BRAND, PRICE 컬럼이 있다. 다음 중 Oracle(19c 기준)에서 실행 시 오류가 발생하는 SQL은?
SELECT CATEGORY AS CAT, COUNT(*) AS CNT FROM PRODUCT GROUP BY CATEGORY ORDER BY CNT DESC;SELECT CATEGORY AS CAT, COUNT(*) FROM PRODUCT GROUP BY CAT;SELECT P.*, PRICE * 0.9 AS SALE_PRICE FROM PRODUCT P;SELECT PROD_NM || '(' || BRAND || ')' AS "상품 표시명" FROM PRODUCT;
13. 다음 [PRODUCT] 테이블에 SQL을 실행했을 때 결과 건수는?
[PRODUCT]
PROD_ID CATEGORY BRAND 1 의류 A 2 의류 A 3 의류 NULL 4 의류 NULL 5 신발 A 6 신발 B 7 NULL NULL SELECT DISTINCT CATEGORY, BRAND FROM PRODUCT;- 5건
- 6건
- 7건
- 3건
14. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B / C / D 순서)
SELECT LENGTH('S,M,L,XL') - LENGTH(REPLACE('S,M,L,XL', ',')) AS A, SUBSTR('ORD-2025-0042', -4) AS B, INSTR('ORD-2025-0042', '-', -1) AS C, RPAD('VIP', 6, '*') AS D FROM DUAL;3 / 0042 / 4 / VIP***4 / 0042 / 9 / ***VIP3 / 0042 / 9 / VIP***3 / 2025 / 9 / VIP***
15. 다음 [PRODUCT] 테이블에 SQL을 실행한 결과를 PROD_ID 순서로 나열한 것으로 옳은 것은? (Oracle)
[PRODUCT]
PROD_ID PRICE DISC P1 12900 10 P2 8000 NULL P3 25550 20 SELECT PROD_ID, ROUND(PRICE * (100 - NVL(DISC, 0)) / 100, -2) AS SALE_PRICE, CASE WHEN DISC >= 20 THEN 'HOT' WHEN DISC IS NULL THEN 'NONE' ELSE 'SALE' END AS TAG FROM PRODUCT ORDER BY PROD_ID;11610 SALE/8000 NONE/20440 HOT11600 SALE/NULL NONE/20400 HOT11700 SALE/8000 NONE/20500 HOT11600 SALE/8000 NONE/20400 HOT
16. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B / C / D 순서)
SELECT TO_CHAR(ADD_MONTHS(DATE '2025-02-28', 1), 'MM-DD') AS A, MONTHS_BETWEEN(DATE '2025-05-15', DATE '2025-02-15') AS B, TO_CHAR(DATE '2025-03-01' - 1, 'DD') AS C, EXTRACT(DAY FROM DATE '2025-12-25' + 10) AS D FROM DUAL;03-31 / 3 / 28 / 403-28 / 3 / 28 / 403-31 / -3 / 29 / 403-28 / -3 / 28 / 4
17. 다음 [PRODUCT] 테이블에 SQL을 실행했을 때 결과 값은?
[PRODUCT]
PROD_NM CATEGORY PRICE P1 도서 15000 P2 의류 8000 P3 NULL 25000 P4 의류 NULL P5 식품 12000 P6 도서 30000 P7 의류 21000 SELECT COUNT(*) FROM PRODUCT WHERE PRICE NOT BETWEEN 10000 AND 20000 AND CATEGORY <> '도서';- 1
- 2
- 3
- 4
18. WHERE 절의 연산자에 대한 설명으로 가장 적절하지 않은 것은? (Oracle 기준)
<>,!=,^=는 모두 '같지 않다'를 의미한다.- 논리 연산자의 우선순위는 NOT, AND, OR 순이므로 괄호가 없으면 AND가 OR보다 먼저 평가된다.
PRICE BETWEEN 30000 AND 10000처럼 작은 값을 뒤에 쓰면 조건을 만족하는 행이 없다.PROD_NM LIKE '할인%'는 '할인'으로 시작하는 값을 찾되, 값이 정확히 '할인' 두 글자인 행은 포함하지 않는다.
19. 다음 [ORDERS] 테이블에 SQL을 실행한 결과로 옳은 것은? (MEM_NO, DAYS, CNT 순서로 표기)
[ORDERS]
ORD_NO MEM_NO ORD_DT AMT 1 M1 2025-03-01 10000 2 M1 2025-03-01 25000 3 M1 2025-03-05 12000 4 M2 2025-03-02 30000 5 M2 2025-03-09 35000 6 M3 2025-03-03 5000 7 M3 2025-03-03 40000 8 M4 2025-03-04 NULL SELECT MEM_NO, COUNT(DISTINCT ORD_DT) AS DAYS, COUNT(AMT) AS CNT FROM ORDERS GROUP BY MEM_NO HAVING MAX(AMT) - MIN(AMT) >= 10000 ORDER BY MEM_NO;(M1, 3, 3),(M3, 2, 2)(M1, 2, 3),(M3, 1, 2),(M4, 1, 0)(M1, 2, 3),(M3, 1, 2)(M1, 2, 3),(M2, 2, 2),(M3, 1, 2)
20. PRODUCT(PROD_ID, CATEGORY, PRICE) 테이블에 대해 Oracle(19c 기준)에서 실행할 때 오류 없이 실행되는 SQL은?
SELECT COUNT(*), SUM(PRICE) FROM PRODUCT HAVING COUNT(*) >= 1;SELECT CATEGORY, COUNT(*) FROM PRODUCT GROUP BY CATEGORY HAVING PRICE >= 10000;SELECT CATEGORY, MAX(PRICE) FROM PRODUCT GROUP BY 1;SELECT CATEGORY, AVG(MAX(PRICE)) FROM PRODUCT GROUP BY CATEGORY;
21. 다음 [REVIEW] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle 기준)
[REVIEW]
RV_ID PROD_ID STAR LIKES 1 A 5 10 2 B NULL 3 3 C 4 10 4 D 5 NULL 5 E 4 7 SELECT RV_ID FROM REVIEW ORDER BY STAR DESC, LIKES;- 1, 4, 3, 5, 2
- 2, 1, 4, 5, 3
- 2, 4, 1, 5, 3
- 4, 1, 5, 3, 2
22. 다음 [ORDERS] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은?
[ORDERS]
MEM_NO AMT M1 100 M1 200 M2 500 M3 50 M3 60 M3 70 M4 300 SELECT MEM_NO FROM ORDERS GROUP BY MEM_NO ORDER BY COUNT(*) DESC, SUM(AMT);- SELECT 절에 없는 집계 함수로 정렬하므로 오류가 발생한다.
- M3, M1, M2, M4
- M1, M3, M4, M2
- M3, M1, M4, M2
23. 다음 [MEMBER] 테이블의 REF_NO는 추천인의 MEM_NO이다(FK 제약 없음). SQL을 실행한 결과의 REF 값을 MEM_NO 순서대로 나열한 것으로 옳은 것은? (Oracle 기준)
[MEMBER]
MEM_NO NAME GRADE REF_NO 1 가 VIP NULL 2 나 GOLD 1 3 다 SILVER 1 4 라 GOLD 2 5 마 SILVER 9 SELECT M.MEM_NO, NVL(R.NAME, '-') AS REF FROM MEMBER M, MEMBER R WHERE M.REF_NO = R.MEM_NO(+) AND R.GRADE(+) = 'VIP' ORDER BY M.MEM_NO;(+)를 상수와 비교하는 조건에는 사용할 수 없으므로 오류가 발생한다.-, 가, 가, 나, --, 가, 가, -, -가, 가(2행)
24. 조인에 대한 설명으로 가장 적절한 것은?
- Non-EQUI JOIN은
=이외의 연산자(BETWEEN, >, <= 등)를 조인 조건으로 사용하여 두 테이블을 연결한다. - N개의 테이블을 카티션 곱 없이 조인하려면 최소 N개의 조인 조건이 필요하다.
- CROSS JOIN의 결과 행 수는 두 테이블 행 수의 합과 같다.
- SELF JOIN은 같은 테이블을 한 번만 참조하므로 테이블 별칭 없이도 컬럼을 구분할 수 있다.
- Non-EQUI JOIN은
25. 다음 세 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 값으로 옳은 것은?
[MEMBER]
MEM_NO NAME 1 가 2 나 3 다 4 라 [ORDERS]
ORD_NO MEM_NO 101 1 102 1 103 2 104 3 [DELIVERY]
DLV_NO ORD_NO D1 101 D2 103 -- (가) SELECT COUNT(*) FROM MEMBER M LEFT OUTER JOIN ORDERS O ON M.MEM_NO = O.MEM_NO INNER JOIN DELIVERY D ON O.ORD_NO = D.ORD_NO; -- (나) SELECT COUNT(*) FROM MEMBER M LEFT OUTER JOIN ORDERS O ON M.MEM_NO = O.MEM_NO LEFT OUTER JOIN DELIVERY D ON O.ORD_NO = D.ORD_NO;- (가) 2, (나) 5
- (가) 4, (나) 5
- (가) 5, (나) 5
- (가) 2, (나) 4
26. 다음 SQL과 같은 결과를 반환하는 SQL로 가장 적절한 것은? (Oracle 기준, 결과에 완전히 같은 행이 중복되는 경우는 없으며 행의 출력 순서는 고려하지 않는다.)
SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M FULL OUTER JOIN COUPON C ON M.MEM_NO = C.MEM_NO;SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M LEFT OUTER JOIN COUPON C ON M.MEM_NO = C.MEM_NO UNION ALL SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M RIGHT OUTER JOIN COUPON C ON M.MEM_NO = C.MEM_NO;SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M, COUPON C WHERE M.MEM_NO(+) = C.MEM_NO(+);SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M LEFT OUTER JOIN COUPON C ON M.MEM_NO = C.MEM_NO UNION SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M RIGHT OUTER JOIN COUPON C ON M.MEM_NO = C.MEM_NO;SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M INNER JOIN COUPON C ON M.MEM_NO = C.MEM_NO UNION ALL SELECT M.MEM_NO, C.CPN_CD FROM MEMBER M LEFT OUTER JOIN COUPON C ON M.MEM_NO = C.MEM_NO;
27. 다음 [PRODUCT] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과 값으로 옳은 것은?
[PRODUCT]
PROD_ID CATEGORY PRICE 1 도서 12000 2 도서 NULL 3 도서 18000 4 의류 15000 5 의류 25000 6 식품 9000 7 의류 20000 -- (가) SELECT COUNT(*) FROM PRODUCT WHERE PRICE > ALL (SELECT PRICE FROM PRODUCT WHERE CATEGORY = '도서'); -- (나) SELECT COUNT(*) FROM PRODUCT WHERE PRICE > ANY (SELECT PRICE FROM PRODUCT WHERE CATEGORY = '도서'); -- (다) SELECT COUNT(*) FROM PRODUCT WHERE PRICE > ALL (SELECT PRICE FROM PRODUCT WHERE CATEGORY = '도서' AND PRICE IS NOT NULL);- (가) 2, (나) 4, (다) 2
- (가) 0, (나) 4, (다) 2
- (가) 0, (나) 5, (다) 2
- (가) 2, (나) 5, (다) 2
28. 서브쿼리에 대한 설명으로 가장 적절하지 않은 것은? (Oracle 기준)
=같은 단일행 비교 연산자와 함께 쓴 서브쿼리가 2건 이상을 반환하면 오류가 발생한다.- 연관 서브쿼리는 메인쿼리의 컬럼을 참조하며, 메인쿼리의 각 행마다 서브쿼리가 수행되는 것처럼 동작한다.
- FROM 절에 쓰는 인라인 뷰 안에서는 ORDER BY를 사용할 수 있다.
- 스칼라 서브쿼리는 SELECT 절에서만 사용할 수 있으며 WHERE 절이나 ORDER BY 절에서는 사용할 수 없다.
29. 다음 [CPN_A], [CPN_B] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle 기준)
[CPN_A]
CPN_CD C1 C2 NULL NULL C3 [CPN_B]
CPN_CD C2 NULL C4 -- (가) SELECT CPN_CD FROM CPN_A UNION SELECT CPN_CD FROM CPN_B; -- (나) SELECT CPN_CD FROM CPN_A INTERSECT SELECT CPN_CD FROM CPN_B; -- (다) SELECT CPN_CD FROM CPN_A MINUS SELECT CPN_CD FROM CPN_B;- (가) 5, (나) 2, (다) 2
- (가) 4, (나) 1, (다) 2
- (가) 6, (나) 2, (다) 2
- (가) 5, (나) 1, (다) 3
30. MEM_2024, MEM_2025 테이블은 모두 MEM_NO(NUMBER), NAME(VARCHAR2) 컬럼을 가진다. 다음 중 Oracle에서 실행 시 오류가 발생하는 SQL은?
SELECT MEM_NO AS ID FROM MEM_2024 UNION SELECT MEM_NO FROM MEM_2025 ORDER BY ID;SELECT MEM_NO AS ID FROM MEM_2024 UNION SELECT MEM_NO AS NO FROM MEM_2025 ORDER BY NO;SELECT MEM_NO, NAME FROM MEM_2024 UNION SELECT MEM_NO, NULL FROM MEM_2025 ORDER BY 2;SELECT MEM_NO FROM MEM_2024 UNION ALL SELECT MEM_NO FROM MEM_2025 ORDER BY 1 DESC;
31. 다음 [SALES] 테이블에 SQL을 실행했을 때 결과 건수와, CATEGORY가 NULL인 행의 TOT 값으로 옳은 것은?
[SALES]
CATEGORY BRAND AMT 의류 A 100 의류 B 200 의류 A 50 신발 A 300 신발 C 100 가방 B 80 SELECT CATEGORY, SUM(AMT) AS TOT FROM SALES GROUP BY ROLLUP(CATEGORY, BRAND) HAVING GROUPING(BRAND) = 1;- 9행, 830
- 3행, 830
- 4행, 830
- 4행, 350
32. 다음 SQL과 같은 그룹핑 결과를 만드는 GROUP BY 절은? (행의 출력 순서는 고려하지 않는다.)
SELECT CATEGORY, BRAND, SUM(AMT) FROM SALES GROUP BY CUBE(CATEGORY, BRAND);GROUP BY ROLLUP(CATEGORY, BRAND)GROUP BY GROUPING SETS (CATEGORY, BRAND, ())GROUP BY GROUPING SETS ((CATEGORY, BRAND), CATEGORY, BRAND)GROUP BY GROUPING SETS ((CATEGORY, BRAND), CATEGORY, BRAND, ())
33. 다음 [ORDERS] 테이블에 SQL을 실행했을 때 S2 값을 출력 순서대로 나열한 것으로 옳은 것은?
[ORDERS]
MEM_NO ORD_SEQ AMT M1 1 100 M1 2 200 M1 3 50 M2 1 300 M2 2 100 SELECT MEM_NO, ORD_SEQ, SUM(AMT) OVER (PARTITION BY MEM_NO ORDER BY ORD_SEQ ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS S2 FROM ORDERS ORDER BY MEM_NO, ORD_SEQ;100, 300, 350, 300, 400100, 300, 250, 300, 400100, 300, 250, 350, 400300, 250, 50, 400, 100
34. 다음 [ORDERS] 테이블에 SQL을 실행했을 때 GAP 값을 출력 순서대로 나열한 것으로 옳은 것은? (Oracle, ORD_DT는 시각 정보가 없는 DATE 타입)
[ORDERS]
MEM_NO ORD_DT M1 2025-03-01 M1 2025-03-04 M1 2025-03-10 M2 2025-03-02 M2 2025-03-03 SELECT MEM_NO, ORD_DT, LEAD(ORD_DT) OVER (PARTITION BY MEM_NO ORDER BY ORD_DT) - ORD_DT AS GAP FROM ORDERS ORDER BY MEM_NO, ORD_DT;3, 6, NULL, 1, NULLNULL, 3, 6, NULL, 13, 6, 0, 1, 03, 9, NULL, 1, NULL
35. 윈도우 함수에 대한 설명으로 가장 적절하지 않은 것은?
- PARTITION BY를 생략하면 전체 결과 집합을 하나의 파티션으로 보고 함수를 적용한다.
SUM(AMT) OVER (PARTITION BY MEM_NO)처럼 ORDER BY 없이 쓰면 각 행에 해당 파티션 전체의 합계가 출력된다.- ROW_NUMBER는 ORDER BY 값이 같은 행에는 같은 번호를 부여하고, 그다음 번호는 같은 행의 수만큼 건너뛴다.
- 윈도우 함수는 결과 행 수를 줄이지 않으므로, 순위로 행을 걸러 내려면 인라인 뷰로 감싼 뒤 바깥 WHERE 절에서 조건을 건다.
36. 다음 [PRODUCT] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, 출력 순서대로 표기)
[PRODUCT]
PROD_NM SALES_CNT 가방 120 모자 NULL 셔츠 300 양말 110 장갑 80 SELECT PROD_NM FROM (SELECT PROD_NM FROM PRODUCT ORDER BY SALES_CNT DESC) WHERE ROWNUM <= 3;- 셔츠, 가방, 양말
- 셔츠, 가방, 모자
- 가방, 모자, 셔츠
- 모자, 셔츠, 가방
37. 다음 [BEST] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle 12c 이상 기준)
[BEST]
PROD_ID SALES A 500 B 400 C 400 D 300 E 300 F 200 -- (가) SELECT COUNT(*) FROM (SELECT RANK() OVER (ORDER BY SALES DESC) AS RK FROM BEST) WHERE RK <= 3; -- (나) SELECT COUNT(*) FROM (SELECT DENSE_RANK() OVER (ORDER BY SALES DESC) AS RK FROM BEST) WHERE RK <= 3; -- (다) SELECT PROD_ID FROM BEST ORDER BY SALES DESC FETCH FIRST 2 ROWS WITH TIES;- (가) 3, (나) 3, (다) 2
- (가) 3, (나) 5, (다) 3
- (가) 4, (나) 5, (다) 3
- (가) 3, (나) 5, (다) 2
38. 쇼핑몰의 상품 카테고리가 다음 [CATEGORY] 테이블에 저장되어 있다. SQL의 실행 결과로 옳은 것은? (Oracle 기준)
[CATEGORY]
CAT_ID CAT_NM PARENT_ID 1 전체 NULL 2 패션 1 3 가전 1 4 남성의류 2 5 여성의류 2 6 신발 2 7 운동화 6 8 TV 3 9 구두 6 SELECT COUNT(*) AS CNT, MAX(LEVEL) AS MX FROM CATEGORY WHERE LEVEL > 1 START WITH CAT_NM = '패션' CONNECT BY PRIOR CAT_ID = PARENT_ID;- CNT = 5, MX = 3
- CNT = 6, MX = 3
- CNT = 5, MX = 4
- CNT = 3, MX = 2
39. 다음 [CATEGORY] 테이블에 셀프 조인 SQL을 실행했을 때 출력되는 C.CAT_NM을 모두 나열한 것은?
[CATEGORY]
CAT_ID CAT_NM PARENT_ID 1 전체 NULL 2 패션 1 3 가전 1 4 남성의류 2 5 여성의류 2 6 신발 2 7 운동화 6 8 TV 3 9 구두 6 SELECT C.CAT_NM, P.CAT_NM AS PARENT_NM FROM CATEGORY C INNER JOIN CATEGORY P ON C.PARENT_ID = P.CAT_ID LEFT OUTER JOIN CATEGORY G ON P.PARENT_ID = G.CAT_ID WHERE G.CAT_NM IS NULL;- 전체
- 전체, 패션, 가전
- 남성의류, 여성의류, 신발, TV
- 패션, 가전
40. 다음 [SALES_W] 테이블은 상품별 월 판매수량을 열로 펼쳐 저장한 것이다. SQL의 실행 결과로 옳은 것은? (Oracle 기준, (MON, CNT, TOT)를 출력 순서대로 표기)
[SALES_W]
PROD_NM M1 M2 M3 가방 10 NULL 30 모자 NULL NULL 5 셔츠 20 15 NULL SELECT MON, COUNT(*) AS CNT, SUM(QTY) AS TOT FROM SALES_W UNPIVOT (QTY FOR MON IN (M1 AS 'M1', M2 AS 'M2', M3 AS 'M3')) GROUP BY MON ORDER BY MON;(M1, 3, 30),(M2, 3, 15),(M3, 3, 35)(M1, 2, 30),(M2, 1, 15)(M1, 2, 30),(M2, 1, 15),(M3, 2, 35)(M1, 2, 30),(M2, 2, 15),(M3, 2, 35)
41. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, A / B 순서로 표기)
SELECT REGEXP_REPLACE('010-1234-5678', '([0-9]{3})-([0-9]{3,4})-([0-9]{4})', '\1-****-\3') AS A, REGEXP_SUBSTR('kim.sj@shop.co.kr', '@([a-z]+)', 1, 1, NULL, 1) AS B FROM DUAL;010-****-5678/shop010-****-5678/@shop***-****-5678/shop010-1234-****/shop.co.kr
42. 다음 [PRODUCT] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 값으로 옳은 것은? (Oracle 기준, 기본 설정에서 정규 표현식은 대소문자를 구분하며, 표의
AB 123은 가운데에 공백 한 칸이 있는 값이다.)[PRODUCT]
PROD_CD AB123 ab123 AB1234 A1234 XY001 XY01A AB 123 -- (가) SELECT COUNT(*) FROM PRODUCT WHERE REGEXP_LIKE(PROD_CD, '^[A-Z]{2}[0-9]{3}$'); -- (나) SELECT COUNT(*) FROM PRODUCT WHERE REGEXP_LIKE(PROD_CD, '^[A-Z]{2}[0-9]{3}$', 'i');- (가) 2, (나) 2
- (가) 2, (나) 3
- (가) 3, (나) 3
- (가) 3, (나) 4
43. Oracle에서 아래 문장을 순서대로 실행한 후 마지막 SELECT의 결과로 옳은 것은? (결과는 COUNT(QTY), SUM(QTY), COUNT(MEMO) 순서)
CREATE TABLE CART ( MEM_NO NUMBER, PROD_ID NUMBER, QTY NUMBER DEFAULT 1, MEMO VARCHAR2(20) DEFAULT '없음' ); INSERT INTO CART (MEM_NO, PROD_ID) VALUES (1, 10); -- ① INSERT INTO CART VALUES (1, 20, NULL, NULL); -- ② INSERT INTO CART (MEM_NO, PROD_ID, QTY) VALUES (2, 10, 3); -- ③ INSERT INTO CART (MEM_NO, PROD_ID, MEMO) -- ④ SELECT MEM_NO, PROD_ID + 1, '복사' FROM CART WHERE QTY IS NOT NULL; SELECT COUNT(QTY), SUM(QTY), COUNT(MEMO) FROM CART;6, 8, 64, 6, 55, 7, 54, 6, 4
44. 다음 두 테이블에 대해 (가), (나) UPDATE 문을 각각 원래 데이터에서 실행한 후
SELECT SUM(PRICE) FROM PRODUCT;의 결과로 옳은 것은?[PRODUCT]
PROD_ID PRICE 1 1000 2 2000 3 3000 4 4000 [NEW_PRICE]
PROD_ID PRICE 1 1500 3 2500 5 9000 -- (가) UPDATE PRODUCT P SET PRICE = (SELECT N.PRICE FROM NEW_PRICE N WHERE N.PROD_ID = P.PROD_ID); -- (나) UPDATE PRODUCT P SET PRICE = (SELECT N.PRICE FROM NEW_PRICE N WHERE N.PROD_ID = P.PROD_ID) WHERE EXISTS (SELECT 1 FROM NEW_PRICE N WHERE N.PROD_ID = P.PROD_ID);- (가) 10000, (나) 10000
- (가) 4000, (나) 4000
- (가) 4000, (나) 10000
- (가) 13000, (나) 10000
45. ORDERS 테이블에는 ORD_NO가 1, 2인 두 행이 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행했을 때 최종적으로 ORDERS에 남아 있는 ORD_NO는? (오류가 발생한 문장은 무시하고 다음 문장이 실행된다고 가정한다.)
INSERT INTO ORDERS (ORD_NO) VALUES (3); SAVEPOINT s1; INSERT INTO ORDERS (ORD_NO) VALUES (4); SAVEPOINT s2; DELETE FROM ORDERS WHERE ORD_NO <= 2; ROLLBACK TO s1; ROLLBACK TO s2; INSERT INTO ORDERS (ORD_NO) VALUES (5); COMMIT;- 1, 2, 3, 4, 5
- 1, 2, 3, 5
- 3, 4, 5
- 1, 2, 5
46. Oracle의 자동 커밋·자동 롤백에 대한 설명으로 가장 적절하지 않은 것은?
- DML을 실행한 뒤 COMMIT 없이 CREATE TABLE을 실행하면, 앞서 실행한 DML도 함께 커밋된다.
- DML을 실행한 뒤 GRANT 문을 실행하면 앞선 DML은 암묵적으로 커밋된다.
- SQL*Plus를 EXIT로 정상 종료하면 커밋되고, 세션이 비정상 종료되면 진행 중이던 트랜잭션은 롤백된다.
- DML을 실행한 뒤 이미 존재하는 테이블 이름으로 CREATE TABLE을 실행해 오류가 나면, 앞선 DML은 커밋되지 않은 상태로 남아 ROLLBACK으로 취소할 수 있다.
47. Oracle에서 아래와 같이 COUPON 테이블을 생성하고 ㄱ~ㅅ을 순서대로 실행했다. 실패하는 INSERT 문을 모두 고른 것은?
CREATE TABLE COUPON ( CPN_ID NUMBER PRIMARY KEY, CPN_CD VARCHAR2(10) UNIQUE, DISC_RATE NUMBER CHECK (DISC_RATE BETWEEN 1 AND 50), MEM_NO NUMBER NOT NULL ); ㄱ. INSERT INTO COUPON VALUES (1, 'WELCOME', 10, 100); ㄴ. INSERT INTO COUPON VALUES (2, NULL, NULL, 101); ㄷ. INSERT INTO COUPON VALUES (3, NULL, 60, 102); ㄹ. INSERT INTO COUPON VALUES (4, NULL, 50, 103); ㅁ. INSERT INTO COUPON VALUES (5, 'WELCOME', 20, 104); ㅂ. INSERT INTO COUPON VALUES (NULL, 'VIP', 5, 105); ㅅ. INSERT INTO COUPON (CPN_ID, CPN_CD, DISC_RATE) VALUES (6, 'VIP', 5);- ㄷ, ㅁ, ㅂ, ㅅ
- ㄴ, ㄷ, ㅁ, ㅂ, ㅅ
- ㄷ, ㄹ, ㅁ, ㅂ, ㅅ
- ㄷ, ㅁ, ㅅ
48. Oracle에서 아래와 같이 테이블과 FK 제약조건이 정의되어 있고 데이터가 입력되어 있다. 두 DELETE 문을 순서대로 실행한 후(오류가 발생한 문장은 무시하고 진행) ORDERS와 ORDER_ITEM의 행 수로 옳은 것은?
- MEMBER: MEM_NO 1, 2, 3
- ORDERS: (101, 회원 1), (102, 회원 2), (103, 회원 2), (104, 회원 3)
- ORDER_ITEM: (101, 1), (102, 1), (102, 2), (103, 1), (104, 1)
- REVIEW: (R1, 회원 1)
CREATE TABLE ORDERS ( ORD_NO NUMBER PRIMARY KEY, MEM_NO NUMBER REFERENCES MEMBER(MEM_NO) ON DELETE CASCADE ); CREATE TABLE ORDER_ITEM ( ORD_NO NUMBER REFERENCES ORDERS(ORD_NO) ON DELETE CASCADE, SEQ NUMBER ); CREATE TABLE REVIEW ( RV_ID VARCHAR2(5) PRIMARY KEY, MEM_NO NUMBER REFERENCES MEMBER(MEM_NO) ); DELETE FROM MEMBER WHERE MEM_NO = 1; DELETE FROM MEMBER WHERE MEM_NO = 2;- ORDERS 4건, ORDER_ITEM 5건
- ORDERS 1건, ORDER_ITEM 1건
- ORDERS 2건, ORDER_ITEM 2건
- ORDERS 3건, ORDER_ITEM 4건
49. 아래 DCL을 순서대로 실행했다. 실행 후 SHOP.ORDERS에 대해 SELECT 권한을 가진 사용자와 UPDATE 권한을 가진 사용자를 바르게 짝지은 것은? (Oracle, KIM·LEE·PARK은 접속 권한 외에 다른 권한이 없다.)
-- DBA 실행 CREATE ROLE R_ORD; CREATE ROLE R_CS; GRANT R_ORD TO R_CS; GRANT R_CS TO LEE; GRANT R_ORD TO KIM; -- SHOP 실행 GRANT SELECT ON SHOP.ORDERS TO R_ORD; GRANT SELECT ON SHOP.ORDERS TO PARK; GRANT UPDATE ON SHOP.ORDERS TO R_CS; REVOKE SELECT ON SHOP.ORDERS FROM R_ORD;- SELECT: LEE, PARK / UPDATE: LEE
- SELECT: PARK / UPDATE: LEE
- SELECT: PARK / UPDATE: 없음
- SELECT: KIM, LEE, PARK / UPDATE: LEE
50. Oracle의 롤(ROLE)에 대한 설명으로 가장 적절하지 않은 것은?
- 기본 제공 롤인 CONNECT에는 데이터베이스 접속 권한인 CREATE SESSION이 포함되어 있다.
- 기본 제공 롤인 RESOURCE는 CREATE TABLE, CREATE SEQUENCE 등 객체 생성 권한을 묶은 롤이다.
- 롤에 권한을 추가하거나 회수하면 그 롤을 부여받은 모든 사용자에게 변경이 반영되므로 권한 관리가 쉬워진다.
- 롤에는 시스템 권한만 담을 수 있으며, SELECT·INSERT 같은 오브젝트 권한은 롤에 부여할 수 없다.
AI가 SQLD 출제 범위를 바탕으로 새로 만든 예상 문제이며, 실제 기출문제가 아닙니다.