SQLD 모의고사 19회
50문항 · 제한 시간 90분. 다 풀면 과목별 점수와 합격 여부, 문제마다 해설을 보여 줘요.
1. 영화관 예매 시스템을 설계하면서 업무를 여러 관점에서 분석하고 있다. 데이터 모델링의 세 가지 관점과 그 분석 활동을 짝지은 것으로 가장 적절한 것은?
- 데이터 관점 - 예매 접수부터 결제·발권까지 업무가 어떤 순서로 처리되는지 시나리오로 분석한다.
- 상관 관점 - '예매 취소' 업무가 수행될 때
좌석데이터의 상태가 어떻게 바뀌는지 CRUD 매트릭스로 분석한다. - 프로세스 관점 -
관객과예매엔터티 사이에 어떤 관계가 있는지 정의한다. - 상관 관점 -
관객엔터티가 가져야 할 속성(이름, 생년월일 등)을 도출한다.
2. 공연 예매 시스템의 엔터티 이름을 정하려고 한다. 엔터티 명명 원칙에 대한 설명으로 가장 적절하지 않은 것은?
- 가능하면 현업에서 실제로 쓰는 업무 용어를 사용한다.
- 약어 사용은 가급적 제한하여
PRF_SCH보다공연회차처럼 의미가 드러나게 한다. - 엔터티는 여러 인스턴스의 집합이지만 이름은
관객들이 아닌관객처럼 단수 명사로 쓴다. - 같은 의미의 엔터티라도 사용하는 부서가 다르면
영업예매,고객센터예매처럼 부서별로 다른 이름을 부여해 구분한다.
3.
상영엔터티에 상영번호, 영화코드, 상영관번호, 상영시작시각 속성이 정의되어 있다. 엔터티·인스턴스·속성·속성값의 관계에 대한 설명으로 가장 적절한 것은?- 하나의 상영 인스턴스에서 '상영시작시각' 속성은 하나의 속성값만 가진다.
상영엔터티는 인스턴스가 1건만 존재하더라도 엔터티로 성립하는 데 문제가 없다.- 하나의 상영 인스턴스는 엔터티에 정의된 속성 중 업무상 필요한 일부 속성만 선택적으로 가진다.
- 한 상영의 상영시작시각이 여러 개 필요하다면 하나의 속성에 '10:00,13:30'처럼 여러 값을 함께 저장하는 것이 원칙이다.
4. 다음 중 관계(Relationship)와 관계 페어링(Pairing)에 대한 설명으로 가장 적절한 것은?
- 관계 페어링은 엔터티와 엔터티 사이의 연관성을 뜻하고, 관계는 개별 인스턴스 사이의 연결을 뜻한다.
- 한 엔터티에 속한 인스턴스들은 모두 동일한 관계 페어링을 가져야 한다.
- 관객 '김영희'가 예매 'B001'을 신청한 것처럼 인스턴스 간의 개별 연결이 관계 페어링이며, 관계 페어링의 집합이 관계이다.
- 두 엔터티 사이에는 오직 하나의 관계만 정의할 수 있다.
5.
예매엔터티의 속성이 다음과 같다.- 예매번호: 예매 시 시스템이 순차적으로 부여하는 번호. 다른 엔터티(결제, 발권)가 이 값을 참조한다.
- 모바일티켓번호: 예매마다 유일하게 발급되며 예매번호 대신 인스턴스를 식별할 수도 있다. 다른 엔터티가 참조하지 않는다.
- 관객번호:
관객엔터티의 주식별자를 관계를 통해 받아온 속성
식별자 분류에 대한 설명으로 가장 적절한 것은?
- 예매번호는 다른 엔터티와 관계를 연결하는 데 쓰일 수 없으므로 보조식별자이다.
- 모바일티켓번호는 인스턴스를 유일하게 식별할 수 있지만 대표성을 갖지 못하므로 보조식별자이다.
- 관객번호는
예매엔터티 내부에서 스스로 만들어진 내부식별자이다. - 예매번호는 시스템이 순차적으로 부여한 값이므로 본질식별자에 해당한다.
6. 다음
상영테이블의 PK는 상영ID 단일 컬럼이다. 업무 규칙상 영화제목과 러닝타임은 영화코드에 의해 결정된다.상영ID 영화코드 영화제목 러닝타임 상영관번호 상영일시 S01 M10 파묘 134 1 2026-10-20 10:00 S02 M10 파묘 134 2 2026-10-20 13:00 S03 M20 듄 166 1 2026-10-20 14:00 영화 '듄'의 유일한 상영 일정인 S03을 삭제하자 '듄'의 제목과 러닝타임 정보까지 함께 사라졌다. 이 현상과 그 해결 방법을 짝지은 것으로 가장 적절한 것은?
- 삽입 이상 - 다중값 종속을 제거하는 제4정규화
- 삭제 이상 - 부분 함수 종속을 제거하는 제2정규화
- 갱신 이상 - 이행 함수 종속을 제거하는 제3정규화
- 삭제 이상 - 이행 함수 종속을 제거하는 제3정규화
7.
상영관→상영→예매로 이어지는 1:M 관계를 두 가지 방식으로 설계하였다. 예매 건별로 상영관명을 조회하려 할 때의 설명으로 가장 적절한 것은?-- (A) 식별 관계로 설계 상영관 (상영관번호 PK, 상영관명) 상영 (상영관번호 PK/FK, 상영순번 PK, 영화코드, 시작시각) 예매 (상영관번호 PK/FK, 상영순번 PK/FK, 좌석번호 PK, 관객번호) -- (B) 비식별 관계로 설계 상영관 (상영관번호 PK, 상영관명) 상영 (상영ID PK, 상영관번호 FK, 영화코드, 시작시각) 예매 (예매ID PK, 상영ID FK, 좌석번호, 관객번호)- 두 설계 모두
예매와상영관을 연결하려면 반드시상영테이블을 거쳐 조인해야 한다. - (B) 설계에서는
예매에 상영관번호가 있으므로상영을 거치지 않고상영관과 바로 조인할 수 있다. - (A) 설계에서는
예매의 PK에 상영관번호가 상속되어 있으므로상영을 거치지 않고예매와상영관을 직접 조인할 수 있다. - (A) 설계는 (B) 설계보다
예매의 PK 컬럼 수가 적어 하위 테이블로의 조인 조건이 더 단순하다.
- 두 설계 모두
8. 공연 예매 트랜잭션과 관련된 상황을 트랜잭션의 특성(ACID)과 짝지었다. 가장 적절하지 않은 것은?
- 좌석 2매를 예매하던 중 두 번째 좌석 INSERT가 실패하자 이미 입력된 첫 번째 좌석까지 모두 취소되었다. - 일관성(Consistency)
- 결제 완료 후 COMMIT 응답을 받은 직후 서버가 다운되었지만, 재기동 후에도 예매 내역이 그대로 남아 있었다. - 지속성(Durability)
- 관객 A의 예매 트랜잭션이 끝나기 전에는 관객 B가 '좌석은 점유되었으나 결제는 안 된' 중간 상태를 볼 수 없다. - 고립성(Isolation)
- '한 회차의 한 좌석에는 유효한 예매가 1건만 존재한다'는 규칙이 트랜잭션 수행 전후에 모두 지켜진다. - 일관성(Consistency)
9. Oracle에서 다음과 같이 테이블을 만들고 데이터를 입력하였다. SQL의 결과로 옳은 것은? (결과는 C1 / C2 / C3 순서)
CREATE TABLE AUD_MEMO (ID NUMBER, NOTE VARCHAR2(10)); INSERT INTO AUD_MEMO VALUES (1, 'VIP'); INSERT INTO AUD_MEMO VALUES (2, ''); INSERT INTO AUD_MEMO VALUES (3, NULL); INSERT INTO AUD_MEMO VALUES (4, ' '); SELECT COUNT(NOTE) AS C1, SUM(CASE WHEN NOTE IS NULL THEN 1 ELSE 0 END) AS C2, SUM(NVL(LENGTH(NOTE), 0)) AS C3 FROM AUD_MEMO;- 3 / 1 / 4
- 2 / 2 / 3
- 3 / 1 / 3
- 2 / 2 / 4
10.
예매좌석엔터티의 본질식별자는 (예매번호, 상영ID, 좌석번호)이다. 이 식별자가 하위 엔터티(발권,입장기록)로 계속 상속되어 설계자가 인조식별자예매좌석ID(시퀀스)를 PK로 도입하려 한다. 이에 대한 설명으로 가장 적절하지 않은 것은?- 하위 엔터티로 상속되는 FK 컬럼 수가 줄어 조인 조건과 SQL이 단순해진다.
- PK가
예매좌석ID하나로 바뀌어도 같은 상영의 같은 좌석이 중복 입력되는 것은 PK 제약이 막아 주므로 별도의 제약은 필요 없다. - 실제 조회가 주로 (상영ID, 좌석번호) 조건으로 이루어진다면 PK 인덱스 외에 별도의 인덱스가 추가로 필요해질 수 있다.
- 본질식별자를 구성하는 컬럼이 많아 하위로 계속 상속되는 경우는 인조식별자 도입을 검토할 만한 상황이다.
11. 다음 두 릴레이션에 대해 **'모든 상영관에서 한 번 이상 상영된 영화'**를 구하려고 한다. 이 요구에 해당하는 관계 연산과 그 결과로 가장 적절한 것은?
[상영실적]
영화 상영관 A 1 A 2 A 3 B 1 B 2 C 1 C 2 C 3 [상영관목록]
상영관 1 2 3 - 곱집합(Product) - A, C
- 조인(Join) - A, B, C
- 나누기(Division) - A, C
- 나누기(Division) - A, B, C
12. 다음 [TICKET] 테이블에 SQL을 실행했을 때 AMT 값을 TID 순서대로 나열한 것으로 옳은 것은?
[TICKET]
TID PRICE QTY DISC 1 12000 2 1000 2 15000 1 NULL 3 NULL 3 0 4 10000 2 500 SELECT TID, PRICE * QTY - DISC * 2 AS AMT FROM TICKET ORDER BY TID;- 22000, NULL, NULL, 19000
- 22000, 15000, NULL, 19000
- 46000, NULL, 0, 39000
- 22000, 15000, 0, 19000
13. 다음 [BOOKING] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과로 옳은 것은? ((가)와 (다)는 결과 행 수, (나)는 결과 값)
[BOOKING]
SHOW_ID SEAT_GRADE S1 R S1 R S1 NULL S2 S S2 NULL S2 NULL S1 S -- (가) SELECT DISTINCT SHOW_ID, SEAT_GRADE FROM BOOKING; -- (나) SELECT COUNT(DISTINCT SEAT_GRADE) FROM BOOKING; -- (다) SELECT DISTINCT SEAT_GRADE FROM BOOKING;- (가) 5 / (나) 3 / (다) 3
- (가) 7 / (나) 2 / (다) 3
- (가) 5 / (나) 2 / (다) 2
- (가) 5 / (나) 2 / (다) 3
14. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B / C 순서)
SELECT SUBSTR('SEAT-H12', -3, 2) AS A, REPLACE('2026-10-20', '-') AS B, UPPER(SUBSTR('imax', 1, 1)) || LOWER(SUBSTR('IMAX', 2)) AS C FROM DUAL;12/20261020/ImaxH1/20261020/ImaxH1/2026 10 20/IMAX-H/ NULL /Imax
15. 영화의 러닝타임 135분을 여러 형태로 표시하려고 한다. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B / C 순서)
SELECT TRUNC(135 / 60) || '시간 ' || MOD(135, 60) || '분' AS A, CEIL(135 / 60) AS B, ROUND(135 / 60, 1) AS C FROM DUAL;2시간 15분/ 2 / 2.22.25시간 15분/ 3 / 2.32시간 15분/ 3 / 2.32시간 15분/ 3 / 2.2
16. 다음 [SHOW] 테이블에 SQL을 실행했을 때 GB 값을 ID 순서대로 나열한 것으로 옳은 것은? (Oracle, 문자열 비교는 대소문자를 구분한다.)
[SHOW]
ID DT HH 1 SAT 9 2 SUN 14 3 MON 23 4 TUE 15 5 sat 20 SELECT ID, CASE WHEN HH < 11 THEN '조조' WHEN HH >= 22 THEN '심야' ELSE DECODE(DT, 'SAT', '주말', 'SUN', '주말', '일반') END AS GB FROM SHOW ORDER BY ID;- 조조, 주말, 심야, 일반, 일반
- 조조, 주말, 심야, 일반, 주말
- 주말, 주말, 심야, 일반, 일반
- 조조, 주말, 일반, 일반, 일반
17. 다음 [BOOKING] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과로 옳은 것은?
[BOOKING]
ID PRICE GRADE 1 15000 VIP 2 12000 R 3 9000 NULL 4 13000 S 5 8000 R -- (가) SELECT COUNT(*) FROM BOOKING WHERE PRICE BETWEEN 13000 AND 9000; -- (나) SELECT COUNT(*) FROM BOOKING WHERE GRADE NOT IN ('VIP', 'S'); -- (다) SELECT COUNT(*) FROM BOOKING WHERE NOT (GRADE = 'R' OR PRICE > 13000);- (가) 2 / (나) 2 / (다) 2
- (가) 0 / (나) 3 / (다) 2
- (가) 2 / (나) 2 / (다) 1
- (가) 0 / (나) 2 / (다) 1
18. [BOOKING] 테이블의 PRICE 컬럼 값이 다음과 같다. 아래 SQL의 빈칸에 각 조건을 넣었을 때, 결과 값이 나머지 셋과 다른 조건은? (Oracle)
PRICE 8000 10000 12000 NULL 15000 SELECT COUNT(*) FROM BOOKING WHERE ________ ;NOT PRICE < 10000NVL(PRICE, 10000) >= 10000PRICE BETWEEN 10000 AND 15000PRICE IN (10000, 12000, 15000)
19. 다음 [BOOKING] 테이블에 SQL을 실행한 결과로 옳은 것은?
[BOOKING]
MOVIE CUST QTY 파묘 C1 2 파묘 C1 1 파묘 C2 1 듄 C1 4 듄 C1 1 웡카 C2 1 웡카 C3 1 웡카 C4 1 SELECT MOVIE, COUNT(*) AS CNT, SUM(QTY) AS TOT FROM BOOKING GROUP BY MOVIE HAVING COUNT(DISTINCT CUST) >= 2 AND SUM(QTY) > 3 ORDER BY MOVIE;- 파묘 | 3 | 4 (1행)
- 파묘 | 2 | 4 (1행)
- 웡카 | 3 | 3, 파묘 | 3 | 4 (2행)
- 듄 | 2 | 5, 파묘 | 3 | 4 (2행)
20. MOVIE(TITLE, GENRE, RATING, RUNTIME) 테이블에 대해 Oracle에서 실행할 때 오류가 발생하는 SQL은?
-- (가) SELECT GENRE, COUNT(*) FROM MOVIE GROUP BY GENRE, RATING; -- (나) SELECT COUNT(*) FROM MOVIE GROUP BY GENRE; -- (다) SELECT GENRE, RUNTIME, AVG(RUNTIME) FROM MOVIE GROUP BY GENRE; -- (라) SELECT GENRE, MAX(RUNTIME) - MIN(RUNTIME) FROM MOVIE GROUP BY GENRE HAVING AVG(RUNTIME) > 100;- (가)
- (나)
- (다)
- (라)
21. ORDER BY 절에 대한 설명으로 가장 적절한 것은? (Oracle 기준)
ORDER BY 2와 같은 위치 번호는 SELECT 목록에 없는 컬럼을 가리키는 데에도 사용할 수 있다.- ORDER BY 절은 SELECT 절보다 나중에 처리되므로 SELECT에서 정의한 별칭을 사용할 수 있고, 별칭·위치 번호·컬럼명을 섞어서 쓸 수도 있다.
- 인라인 뷰 안에서 ORDER BY 절을 사용하면 문법 오류가 발생한다.
- ORDER BY 절을 생략하면 결과는 항상 PK 오름차순으로 정렬되어 출력된다.
22. 다음 [SHOW] 테이블에 SQL을 실행한 결과의 ID 출력 순서로 옳은 것은? (Oracle, 문자는 '1관' < '2관' 순서로 정렬된다.)
[SHOW]
ID SCREEN START_TM 1 2관 14:00 2 1관 NULL 3 1관 10:30 4 2관 09:00 5 NULL 11:00 SELECT ID FROM SHOW ORDER BY SCREEN DESC, START_TM;- 4, 1, 3, 2, 5
- 5, 1, 4, 2, 3
- 4, 1, 2, 3, 5
- 5, 4, 1, 3, 2
23. 좌석 배치도에서 **나란히 붙은 두 빈 좌석(연석)**을 찾으려고 한다. 다음 [SEAT] 테이블에 SQL을 실행했을 때 결과 행 수는?
[SEAT]
ROW_CD NO ST A 1 빈 A 2 빈 A 3 빈 A 4 예매 A 5 빈 B 1 예매 B 2 빈 B 3 빈 C 1 빈 SELECT A.ROW_CD, A.NO AS NO1, B.NO AS NO2 FROM SEAT A, SEAT B WHERE A.ROW_CD = B.ROW_CD AND B.NO = A.NO + 1 AND A.ST = '빈' AND B.ST = '빈';- 3
- 4
- 5
- 6
24. 다음 세 테이블에 SQL을 실행한 결과로 옳은 것은?
[AUDIENCE]
AID NAME AGE 1 민수 8 2 지영 17 3 철수 35 4 영희 70 [AGE_RULE]
GB MIN_AGE MAX_AGE RATE 어린이 0 12 50 청소년 13 18 30 성인 19 64 0 경로 65 120 40 [BOOKING]
BID AID PRICE B1 1 10000 B2 2 12000 B3 3 12000 B4 3 15000 B5 5 10000 SELECT SUM(B.PRICE * (100 - R.RATE) / 100) AS PAY FROM BOOKING B, AUDIENCE A, AGE_RULE R WHERE B.AID = A.AID AND A.AGE BETWEEN R.MIN_AGE AND R.MAX_AGE;- 34400
- 49000
- 40400
- 50400
25. 다음 세 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 값으로 옳은 것은?
[MOVIE]
MID M1 M2 M3 [SHOW]
SID MID HID S1 M1 H1 S2 M1 H2 S3 M2 H9 [HALL]
HID H1 H2 H3 -- (가) SELECT COUNT(*) FROM MOVIE M LEFT OUTER JOIN SHOW S ON M.MID = S.MID LEFT OUTER JOIN HALL H ON S.HID = H.HID; -- (나) SELECT COUNT(*) FROM MOVIE M LEFT OUTER JOIN SHOW S ON M.MID = S.MID INNER JOIN HALL H ON S.HID = H.HID;- (가) 4 / (나) 4
- (가) 3 / (나) 2
- (가) 4 / (나) 3
- (가) 4 / (나) 2
26. 다음 [MOVIE], [SHOW] 테이블에 SQL을 실행한 결과로 옳은 것은? (C1 / C2 순서)
[MOVIE]
MID GENRE M1 액션 M2 드라마 M3 액션 [SHOW]
SID MID S1 M1 S2 M2 S3 M2 S4 M3 SELECT COUNT(*) AS C1, COUNT(S.SID) AS C2 FROM MOVIE M LEFT OUTER JOIN SHOW S ON M.MID = S.MID AND M.GENRE = '액션';- 2 / 2
- 3 / 2
- 4 / 2
- 3 / 3
27. 다음 [BOOKING] 테이블에 대해 Oracle에서 실행할 때 오류가 발생하는 SQL은?
[BOOKING]
BID MID PRICE B1 M1 12000 B2 M1 15000 B3 M2 9000 B4 M3 15000 B5 M2 12000 -- (가) SELECT BID FROM BOOKING WHERE PRICE = (SELECT PRICE FROM BOOKING WHERE MID = 'M1'); -- (나) SELECT BID FROM BOOKING WHERE PRICE = (SELECT MAX(PRICE) FROM BOOKING WHERE MID = 'M1'); -- (다) SELECT BID FROM BOOKING WHERE PRICE = (SELECT PRICE FROM BOOKING WHERE MID = 'M3'); -- (라) SELECT BID FROM BOOKING WHERE PRICE = (SELECT PRICE FROM BOOKING WHERE MID = 'M9');- (가)
- (나)
- (다)
- (라)
28. 다음 [MOVIE], [SHOW] 테이블에 SQL을 실행한 결과로 옳은 것은? (출력 순서대로 표기)
[MOVIE]
MID TITLE M1 파묘 M2 듄 M3 웡카 M4 범죄도시 [SHOW]
MID HID M1 H1 M1 H2 M2 H1 M2 H3 M3 H2 M4 H1 M4 H1 SELECT M.TITLE FROM MOVIE M WHERE EXISTS (SELECT 1 FROM SHOW S WHERE S.MID = M.MID AND S.HID = 'H1') AND NOT EXISTS (SELECT 1 FROM SHOW S WHERE S.MID = M.MID AND S.HID = 'H2') ORDER BY M.MID;- 듄
- 파묘, 듄, 범죄도시
- 듄, 범죄도시
- 듄, 범죄도시, 범죄도시
29. 온라인 예매 고객과 현장 예매 고객 테이블이 다음과 같다. (가)~(다) SQL의 결과 행 수로 옳은 것은? (Oracle)
[ONLINE_BK]
CUST C1 C2 C2 C3 [OFFLINE_BK]
CUST C3 C4 C4 -- (가) SELECT CUST FROM ONLINE_BK UNION SELECT CUST FROM OFFLINE_BK WHERE 1 = 2; -- (나) SELECT CUST FROM ONLINE_BK MINUS SELECT CUST FROM OFFLINE_BK; -- (다) SELECT CUST FROM OFFLINE_BK INTERSECT SELECT CUST FROM ONLINE_BK;- (가) 4 / (나) 3 / (다) 1
- (가) 3 / (나) 2 / (다) 1
- (가) 3 / (나) 3 / (다) 2
- (가) 4 / (나) 2 / (다) 1
30. 두 이벤트의 쿠폰 사용 기록이 다음과 같다. (가), (나) SQL의 결과로 옳은 것은? (Oracle, 행의 순서는 고려하지 않는다.)
[EVENT_A]
COUPON_CD A10 NULL B20 B20 [EVENT_B]
COUPON_CD NULL B20 C30 -- (가) SELECT COUPON_CD FROM EVENT_A INTERSECT SELECT COUPON_CD FROM EVENT_B; -- (나) SELECT COUPON_CD FROM EVENT_A MINUS SELECT COUPON_CD FROM EVENT_B;- (가) B20 (1행) / (나) A10, NULL (2행)
- (가) B20 (1행) / (나) A10 (1행)
- (가) B20, B20 (2행) / (나) A10 (1행)
- (가) NULL, B20 (2행) / (나) A10 (1행)
31. 다음 [SALES] 테이블에 SQL을 실행했다. 결과에서 MOVIE가 NULL로 출력되는 행의 수와, 그중 G가 0인 행의 TOT 값으로 옳은 것은?
[SALES]
THEATER MOVIE AMT 강남 파묘 100 강남 듄 200 홍대 파묘 300 홍대 NULL 50 SELECT THEATER, MOVIE, SUM(AMT) AS TOT, GROUPING(MOVIE) AS G FROM SALES GROUP BY ROLLUP(THEATER, MOVIE);- 4행 / 50
- 3행 / 50
- 4행 / 350
- 3행 / 350
32. 다음 [SALES] 테이블에 SQL을 실행했을 때 결과 행 수는?
[SALES]
THEATER MOVIE GRADE AMT 강남 파묘 일반 10 강남 파묘 VIP 20 강남 듄 일반 30 홍대 파묘 일반 40 홍대 파묘 일반 50 SELECT THEATER, MOVIE, GRADE, SUM(AMT) FROM SALES GROUP BY THEATER, CUBE(MOVIE, GRADE);- 10
- 11
- 12
- 14
33. 다음 [REVIEW] 테이블에 SQL을 실행했을 때, RID가 3인 행의 RN, RK, CN 값으로 옳은 것은?
[REVIEW]
RID MOVIE STAR 1 파묘 5 2 파묘 3 3 파묘 5 4 듄 4 5 듄 2 6 파묘 4 SELECT RID, ROW_NUMBER() OVER (PARTITION BY MOVIE ORDER BY STAR DESC, RID) AS RN, RANK() OVER (PARTITION BY MOVIE ORDER BY STAR DESC) AS RK, COUNT(*) OVER (PARTITION BY MOVIE ORDER BY STAR DESC) AS CN FROM REVIEW;- 2 / 1 / 1
- 1 / 1 / 2
- 2 / 2 / 2
- 2 / 1 / 2
34. 다음 [DAILY_AUD] 테이블에 SQL을 실행했을 때 S 값을 DAY 순서대로 나열한 것으로 옳은 것은? (DAY는 숫자형)
[DAILY_AUD]
DAY AUD 1 100 2 200 4 300 5 100 8 400 SELECT DAY, SUM(AUD) OVER (ORDER BY DAY RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) AS S FROM DAILY_AUD ORDER BY DAY;- 100, 300, 600, 600, 800
- 100, 300, 500, 400, 400
- 100, 300, 500, 600, 800
- 100, 300, 600, 400, 400
35. MOVIE(TITLE, GENRE, AUD) 테이블에 대해 Oracle에서 실행할 때 오류가 발생하는 SQL은?
-- (가) SELECT TITLE FROM MOVIE WHERE RANK() OVER (ORDER BY AUD DESC) <= 3; -- (나) SELECT TITLE FROM (SELECT TITLE, RANK() OVER (ORDER BY AUD DESC) AS RK FROM MOVIE) WHERE RK <= 3; -- (다) SELECT TITLE, AUD FROM MOVIE ORDER BY RANK() OVER (ORDER BY AUD DESC); -- (라) SELECT GENRE, SUM(AUD), RANK() OVER (ORDER BY SUM(AUD) DESC) AS RK FROM MOVIE GROUP BY GENRE;- (가)
- (나)
- (다)
- (라)
36. SHOW_STAT(HALL, TITLE, AUD) 테이블에서 상영관(HALL)별로 관객수(AUD)가 가장 많은 영화를 조회하려 한다. 같은 상영관에서 최다 관객수가 동률이면 해당 영화를 모두 출력해야 한다. 요구사항을 만족하는 SQL은? (Oracle 12c 이상)
-- (가) SELECT HALL, TITLE FROM (SELECT HALL, TITLE, ROW_NUMBER() OVER (PARTITION BY HALL ORDER BY AUD DESC) AS RN FROM SHOW_STAT) WHERE RN = 1; -- (나) SELECT HALL, TITLE FROM (SELECT HALL, TITLE FROM SHOW_STAT ORDER BY AUD DESC) WHERE ROWNUM <= 1; -- (다) SELECT HALL, TITLE FROM (SELECT HALL, TITLE, RANK() OVER (PARTITION BY HALL ORDER BY AUD DESC) AS RK FROM SHOW_STAT) WHERE RK = 1; -- (라) SELECT HALL, TITLE FROM SHOW_STAT ORDER BY AUD DESC FETCH FIRST 1 ROWS WITH TIES;- (가)
- (나)
- (다)
- (라)
37. 다음 [MOVIE] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, 출력 순서대로 표기)
[MOVIE]
TITLE AUD 파묘 1000 듄 NULL 웡카 800 범죄도시 1200 외계인 800 SELECT TITLE FROM (SELECT TITLE, AUD FROM MOVIE ORDER BY AUD DESC) WHERE ROWNUM <= 3;- 범죄도시, 파묘, 웡카
- 범죄도시, 파묘, 웡카, 외계인
- 범죄도시, 파묘, 듄
- 듄, 범죄도시, 파묘
38. 다음 [VENUE] 테이블에 SQL을 실행했을 때 결과 행 수와 '강남1관'의 LV 값으로 옳은 것은? (Oracle 기준)
[VENUE]
ID NAME PID 1 전국 NULL 2 서울 1 3 부산 1 4 강남점 2 5 홍대점 2 6 서면점 3 7 강남1관 4 8 강남2관 4 9 홍대1관 5 SELECT NAME, LEVEL AS LV FROM VENUE START WITH NAME = '서울' CONNECT BY PRIOR ID = PID;- 6행 / 4
- 6행 / 3
- 9행 / 3
- 5행 / 3
39. 다음 [VENUE] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준)
[VENUE]
ID NAME PID 1 전국 NULL 2 서울 1 3 부산 1 4 강남점 2 5 홍대점 2 6 서면점 3 7 강남1관 4 8 강남2관 4 9 홍대1관 5 SELECT NAME FROM VENUE WHERE CONNECT_BY_ISLEAF = 1 START WITH NAME = '강남2관' CONNECT BY ID = PRIOR PID;- 전국
- 강남2관
- 강남1관, 강남2관
- 서울
40. 다음 [BOOKING] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, THEATER | R | S 순서로 표기)
[BOOKING]
BID THEATER GRADE QTY 1 강남 R 2 2 강남 S 3 3 강남 R 1 4 홍대 S 4 5 홍대 A 5 SELECT * FROM (SELECT THEATER, GRADE, QTY FROM BOOKING) PIVOT (SUM(QTY) FOR GRADE IN ('R' AS R, 'S' AS S)) ORDER BY THEATER;- 강남 | 3 | 3, 홍대 | 0 | 4
- 강남 | 3 | 3, 홍대 | NULL | 9
- 강남 | 3 | 3, 홍대 | NULL | 4
- 강남 | 2 | 3, 홍대 | NULL | 4
41. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, C1 / C2 순서)
SELECT REGEXP_SUBSTR('파묘,,듄,웡카', '[^,]+', 1, 2) AS C1, REGEXP_COUNT('파묘,,듄,웡카', '[^,]+') AS C2 FROM DUAL;- NULL / 4
듄/ 3- NULL / 3
듄/ 4
42. 예매번호 형식은 'B + 숫자 4자리 + 하이픈 + 구분코드(M 또는 E)'이다. 다음 [BOOKING] 테이블에 SQL을 실행했을 때 결과 값은? (Oracle 기준)
[BOOKING]
BNO B2026-M B026-E b2026-M B2026-ME B20261-E B1234-E B0000-M B9999-E SELECT COUNT(*) FROM BOOKING WHERE REGEXP_LIKE(BNO, '^B[0-9]{4}-(M|E)$');- 1
- 2
- 3
- 4
43. 다음 두 테이블에 대해 아래 MERGE 문을 실행(Oracle)한 후
SELECT SUM(PRICE) FROM SEAT_PRICE;의 결과는?[SEAT_PRICE]
GRADE PRICE R 12000 S 10000 A 8000 [NEW_PRICE]
GRADE PRICE R 13000 S 9000 VIP 20000 B 7000 MERGE INTO SEAT_PRICE T USING NEW_PRICE S ON (T.GRADE = S.GRADE) WHEN MATCHED THEN UPDATE SET T.PRICE = S.PRICE WHERE S.PRICE > T.PRICE WHEN NOT MATCHED THEN INSERT (GRADE, PRICE) VALUES (S.GRADE, S.PRICE) WHERE S.PRICE >= 10000;- 50000
- 57000
- 51000
- 58000
44. Oracle에서 아래 문장을 순서대로 실행한 후 마지막 SELECT의 결과로 옳은 것은? (C1 / C2 / C3 순서)
CREATE TABLE TICKET ( TID NUMBER PRIMARY KEY, PRICE NUMBER DEFAULT 10000, STATUS CHAR(1) DEFAULT 'N' ); INSERT INTO TICKET (TID) VALUES (1); INSERT INTO TICKET VALUES (2, NULL, 'Y'); INSERT INTO TICKET (TID, PRICE) SELECT TID + 10, PRICE * 2 FROM TICKET; UPDATE TICKET SET PRICE = PRICE + 1000 WHERE STATUS = 'N'; SELECT COUNT(*) AS C1, COUNT(PRICE) AS C2, SUM(PRICE) AS C3 FROM TICKET;- 4 / 2 / 32000
- 4 / 4 / 63000
- 2 / 2 / 31000
- 4 / 2 / 31000
45. SEAT 테이블에는 ('A1', '빈'), ('A2', '빈') 두 행이 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행하였다. 오류가 발생한 문장은 무시하고 진행했을 때, 최종적으로 SEAT의 전체 행 수와 ST가 '예매'인 행 수로 옳은 것은?
UPDATE SEAT SET ST = '예매' WHERE NO = 'A1'; SAVEPOINT SP1; UPDATE SEAT SET ST = '예매' WHERE NO = 'A2'; SAVEPOINT SP2; DELETE FROM SEAT WHERE NO = 'A1'; ROLLBACK TO SP1; INSERT INTO SEAT VALUES ('A3', '예매'); COMMIT; ROLLBACK TO SP2; DELETE FROM SEAT WHERE ST = '빈'; ROLLBACK;- 2행 / 1행
- 3행 / 2행
- 3행 / 3행
- 2행 / 2행
46. 두 트랜잭션이 아래 순서로 실행되었다. TX1에서 발생한 현상과, 이 현상을 방지할 수 있는 가장 낮은 격리 수준을 짝지은 것으로 옳은 것은? (ANSI 표준 기준)
-- ① TX1 SELECT PRICE FROM SEAT_PRICE WHERE GRADE = 'VIP'; -- 15000 -- ② TX2 UPDATE SEAT_PRICE SET PRICE = 18000 WHERE GRADE = 'VIP'; COMMIT; -- ③ TX1 (아직 같은 트랜잭션 안에서 다시 조회) SELECT PRICE FROM SEAT_PRICE WHERE GRADE = 'VIP'; -- 18000- Dirty Read - READ COMMITTED
- Phantom Read - SERIALIZABLE
- Non-Repeatable Read - READ COMMITTED
- Non-Repeatable Read - REPEATABLE READ
47. Oracle에서 아래와 같이 SHOW_T 테이블을 생성한 뒤 ㄱ~ㅁ의 INSERT 문을 각각 실행하였다. 성공한 INSERT 문을 모두 고른 것은?
CREATE TABLE SHOW_T ( SID NUMBER PRIMARY KEY, ST NUMBER, ET NUMBER, HALL VARCHAR2(5) DEFAULT 'H1' NOT NULL, CONSTRAINT SHOW_T_CK CHECK (ET > ST) ); -- ㄱ INSERT INTO SHOW_T (SID, ST, ET) VALUES (1, 900, 1100); -- ㄴ INSERT INTO SHOW_T VALUES (2, 1300, NULL, 'H2'); -- ㄷ INSERT INTO SHOW_T VALUES (3, 1500, 1500, 'H2'); -- ㄹ INSERT INTO SHOW_T VALUES (4, 1000, 1200, NULL); -- ㅁ INSERT INTO SHOW_T (SID, ET) VALUES (5, 800);- ㄱ
- ㄱ, ㄹ
- ㄱ, ㄴ, ㅁ
- ㄱ, ㄴ, ㄹ, ㅁ
48. 공연 예매 DB에서 VIEW, INDEX, SEQUENCE를 활용하려 한다. 이에 대한 설명으로 가장 적절하지 않은 것은?
- 관객용 뷰의 SELECT 정의를 바꿀 때는
ALTER VIEW 뷰이름 AS SELECT ...문으로 기존 정의를 수정한다. - 뷰는 데이터를 직접 저장하지 않는 가상 테이블이며, 관객의 연락처처럼 민감한 컬럼을 빼고 필요한 컬럼만 노출하는 보안 목적으로 활용할 수 있다.
- 예매 테이블의 공연일자 컬럼에 인덱스를 만들면 조회는 빨라질 수 있지만, INSERT·UPDATE·DELETE 시 인덱스도 함께 갱신되어 부하가 늘어난다.
- Oracle에서는 SEQUENCE로 예매번호 같은 순번을 생성할 수 있고, SQL Server에서는 주로 IDENTITY 속성으로 자동 증가 값을 만든다.
- 관객용 뷰의 SELECT 정의를 바꿀 때는
49. 공연 예매 DB의 권한 관리에 대한 설명으로 가장 적절하지 않은 것은? (Oracle 기준)
- 테이블 소유자는 자신이 만든 테이블에 대해 별도의 GRANT 없이 모든 오브젝트 권한을 가진다.
- 시스템 권한을 다시 부여할 수 있게 하려면 WITH ADMIN OPTION을, 오브젝트 권한은 WITH GRANT OPTION을 사용한다.
- ROLE에는 시스템 권한과 오브젝트 권한을 함께 담을 수 있고, ROLE을 다른 ROLE에 부여할 수도 있다.
- WITH GRANT OPTION으로 받은 오브젝트 권한을 회수해도, 그 사용자가 다른 사용자에게 다시 부여한 권한은 회수되지 않고 그대로 남는다.
50. SCOTT와 사용자들이 아래 순서로 DCL을 실행했다. 모든 문장이 실행된 후 SCOTT.SHOW_T에 대해 SELECT 권한을 가진 사용자를 모두 고른 것은? (Oracle, SCOTT는 SHOW_T의 소유자이며 SCOTT 자신은 제외한다.)
-- SCOTT 실행 GRANT SELECT ON scott.show_t TO u1 WITH GRANT OPTION; GRANT SELECT ON scott.show_t TO u2 WITH GRANT OPTION; -- U1 실행 GRANT SELECT ON scott.show_t TO u3; -- U2 실행 GRANT SELECT ON scott.show_t TO u3; -- SCOTT 실행 REVOKE SELECT ON scott.show_t FROM u1;- U2
- U2, U3
- U1, U2, U3
- U3
AI가 SQLD 출제 범위를 바탕으로 새로 만든 예상 문제이며, 실제 기출문제가 아닙니다.