SQLD 모의고사 15회
50문항 · 제한 시간 90분. 다 풀면 과목별 점수와 합격 여부, 문제마다 해설을 보여 줘요.
1. 항공사가 예약 시스템을 재설계하면서 좋은 데이터 모델의 요소를 적용하였다. 요소와 적용 사례를 짝지은 것으로 가장 적절하지 않은 것은?
- 통합성 - 승객 정보를 예약·마일리지·탑승 업무가 각자 정의하지 않고, 한 곳에서 한 번만 정의한 뒤 모든 업무가 참조하도록 하였다.
- 업무 규칙 - '좌석 등급은 F, C, Y 중 하나이다'라는 규칙을 모델에 표현하여 개발자와 현업이 같은 규칙을 공유하도록 하였다.
- 데이터 재사용 - 운임 조회 화면 한 곳에서만 쓰기 편한 형태로 예약 데이터를 설계하여, 그 화면의 처리 방식에 맞추었다.
- 완전성 - 업무 분석 중 수하물 위탁 정보가 모델에 빠져 있음을 발견하고 이를 모델에 추가하였다.
2. 항공 예약 시스템을 분석하며 엔터티 후보에 대해 나온 의견이다. 가장 적절한 것은?
- '기내식메뉴'는 다른 항공사 시스템에서는 엔터티가 될 수 있더라도, 이 예약 시스템의 업무에서 관리할 필요가 없다면 엔터티로 도출하지 않는다.
- '승객명'은 모든 예약에 반드시 필요한 중요한 정보이므로 독립된 엔터티로 도출한다.
- '좌석'은 항공기마다 인스턴스가 수백 개씩 생기므로 항공기별로 엔터티를 각각 나누어 정의한다.
- '탑승권발행'은 승객·항공편과의 관계만 표현하면 되므로 속성이 하나도 없는 엔터티로 정의해도 된다.
3. 항공 예약 시스템의 엔터티·인스턴스·속성·속성값의 관계에 대한 설명으로 가장 적절한 것은?
- 엔터티는 속성을 하나 이상 가지면 충분하므로, '좌석번호' 속성 하나만 가진
좌석엔터티도 바람직한 설계이다. - 한 인스턴스에서 하나의 속성은 여러 값을 가질 수 있으므로, 승객의 여러 연락처를 '연락처' 속성 하나에 쉼표로 이어 저장한다.
- 업무에서 '출발일시'를 날짜와 시각으로 나누어 검색·집계해야 하더라도, 의미상 하나의 값이므로 반드시 하나의 속성으로 정의한다.
예약엔터티의 한 인스턴스에서 '예약상태' 속성은 하나의 속성값만 가진다.
- 엔터티는 속성을 하나 이상 가지면 충분하므로, '좌석번호' 속성 하나만 가진
4.
승객과예약엔터티 사이의 관계를 정의하려 한다. 관계와 관계명에 대한 설명으로 가장 적절하지 않은 것은?- 하나의 관계는 양쪽 끝에 관계명을 하나씩 가지므로, 승객 기준 '요청한다', 예약 기준 '요청된다'처럼 두 개의 관계명을 붙인다.
- 관계명은 이미 발생한 사실을 나타내야 하므로 '예약했다'처럼 과거형으로 표현하는 것이 원칙이다.
- '관련이 있다', '관계된다'처럼 구체적이지 않은 동사는 관계명으로 사용하지 않는다.
- ERD에서는 존재적 관계와 행위적 관계를 구분하지 않고 같은 관계선으로 표현한다.
5.
승객엔터티의 주식별자로 '여권번호'를 검토하였다. 여권번호는 승객마다 서로 다르고 거의 바뀌지도 않는다. 그러나 국내선만 이용하는 승객은 여권 없이 예약할 수 있어서, 여권번호 값이 없는 승객이 존재한다.이 때문에 여권번호가 주식별자로 부적합하다고 판단했을 때, 그 근거가 되는 주식별자의 특징은?
- 유일성
- 존재성
- 최소성
- 불변성
6. 항공사의 운항 통계 화면이 여러 테이블을 조인하느라 느리다는 불만이 접수되었다. 이에 대한 판단으로 가장 적절한 것은?
- 정규화된 모델은 조인이 늘어나 조회 성능이 항상 저하되므로, 통계 조회가 느리면 즉시 관련 테이블을 병합한다.
- 반정규화는 데이터 무결성에 영향을 주지 않으므로, 별도의 정합성 관리 방안 없이 적용해도 된다.
- 반정규화를 적용하기 전에 인덱스 조정, 뷰, 클러스터링, 파티셔닝, 응용 로직 변경 같은 다른 방법을 먼저 검토한다.
- 정규화를 하면 입력·수정·삭제 성능이 일반적으로 저하되므로, 예약 입력이 많은 시스템은 정규화를 하지 않는 것이 원칙이다.
7.
PASSENGER와PAX_DETAIL은 1:1(선택) 관계,PASSENGER와BOOKING은 1:M 관계이며 데이터는 다음과 같다.PASSENGER
PAX_ID NAME P1 김 P2 이 P3 박 P4 최 PAX_DETAIL
PAX_ID PASSPORT_NO P1 M111 P3 M333 BOOKING
BK_NO PAX_ID B1 P1 B2 P1 B3 P3 B4 P4 다음 SQL의 결과 건수와, 결과 중 PASSPORT_NO가 NULL인 행의 수로 옳은 것은?
SELECT P.PAX_ID, D.PASSPORT_NO, B.BK_NO FROM PASSENGER P LEFT OUTER JOIN PAX_DETAIL D ON P.PAX_ID = D.PAX_ID INNER JOIN BOOKING B ON P.PAX_ID = B.PAX_ID;- 4건 / 1건
- 3건 / 0건
- 5건 / 2건
- 4건 / 2건
8. 항공권 구매 트랜잭션은 다음 세 단계로 구성된다.
- 예약(BOOKING) INSERT
- 좌석(SEAT)의 상태를 '배정'으로 UPDATE
- 결제(PAYMENT) INSERT
업무 요구사항은 "3단계의 결제 입력이 실패하면 앞서 처리한 예약 등록과 좌석 배정도 모두 취소되어, 결제 없는 예약이 남아서는 안 된다"이다. 이 요구와 가장 관련 있는 트랜잭션 특성은?
- 일관성(Consistency)
- 고립성(Isolation)
- 지속성(Durability)
- 원자성(Atomicity)
9.
PAX테이블의 데이터가 다음과 같을 때, (가)와 (나) SQL의 결과로 옳은 것은? (Oracle 기준)PAX_ID MILE GRADE P1 500 G P2 NULL S P3 100 NULL P4 NULL NULL -- (가) SELECT COUNT(*) FROM PAX WHERE NOT (MILE >= 300 AND GRADE = 'G'); -- (나) SELECT COUNT(*) FROM PAX WHERE NOT (MILE >= 300 OR GRADE = 'S');- (가) 3, (나) 1
- (가) 2, (나) 2
- (가) 2, (나) 0
- (가) 3, (나) 0
10.
운항엔터티의 본질식별자는 (항공사코드, 편명, 출발일자)이며, 이 세 속성이예약,탑승,수하물,좌석배정테이블에 모두 FK로 상속되어 있다. 설계자는 시퀀스로 생성하는 인조식별자 '운항ID'를 운항의 PK로 도입하려 한다.이 변경으로 기대할 수 있는 효과로 가장 적절한 것은?
- 운항ID에 PK가 걸리므로 같은 (항공사코드, 편명, 출발일자) 운항이 중복 입력되는 것도 자동으로 막을 수 있다.
- 하위 테이블에 상속되는 식별자 컬럼이 3개에서 1개로 줄어 조인 조건과 SQL이 단순해진다.
- 운항ID가 생기면 항공사코드·편명·출발일자는 더 이상 필요 없으므로 운항 테이블에서 삭제한다.
- 운항ID는 업무 의미를 담은 값이므로 탑승권과 안내 화면에 출력해 승객이 운항을 식별하는 데 사용한다.
11.
PASSENGER테이블의 기본키는 PAX_ID이고,BOOKING테이블의 PAX_ID는 PASSENGER.PAX_ID를 참조하는 외래키다. 기본키와 외래키에 대한 설명으로 적절하지 않은 것은?- NOT NULL 제약이 없다면 BOOKING.PAX_ID에는 NULL이 입력될 수 있다.
- BOOKING 테이블에는 PAX_ID 외에도 FLIGHT 테이블을 참조하는 외래키를 추가로 정의할 수 있다.
- BOOKING.PAX_ID 값은 PASSENGER에 존재하는 PAX_ID 값 중 하나이거나 NULL이어야 한다.
- 외래키 값은 테이블 안에서 중복될 수 없으므로, 한 승객은 BOOKING 테이블에 한 번만 나타날 수 있다.
12. 다음 [FLIGHT] 테이블에 (가), (나) SQL을 실행했을 때 결과 행 수로 옳은 것은? (Oracle, DEP와 ARR은 VARCHAR2 타입)
[FLIGHT]
FLT_NO DEP ARR KE01 GMP NULL KE02 NULL GMP OZ03 GMP CJU OZ04 GMP CJU LJ05 ICN NULL LJ06 ICN NRT -- (가) SELECT DISTINCT DEP, ARR FROM FLIGHT; -- (나) SELECT DISTINCT DEP || ARR AS ROUTE FROM FLIGHT;- (가) 5, (나) 4
- (가) 5, (나) 3
- (가) 6, (나) 4
- (가) 4, (나) 4
13. FLIGHT 테이블에는 FLT_NO, FARE 컬럼이 있다. 다음 중 Oracle에서 오류 없이 실행되는 SQL은?
SELECT FARE * 2 AS RT, RT + 1000 AS RT_FEE FROM FLIGHT;SELECT FLT_NO, FARE FROM FLIGHT F WHERE FLIGHT.FARE > 100000;SELECT FLT_NO AS FNO, FARE * 2 "Round Trip" FROM FLIGHT ORDER BY "Round Trip";SELECT FLT_NO, FARE * 2 AS RT FROM FLIGHT WHERE RT > 300000;
14. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, C1, C2, C3, C4 순서로 표기)
SELECT SUBSTR('KE0123-ICN-NRT', INSTR('KE0123-ICN-NRT', '-') + 1, 3) AS C1, INSTR('KE0123-ICN-NRT', '-', 1, 2) AS C2, LTRIM('0012A', '0') AS C3, SUBSTR('KE0123', -4, 2) AS C4 FROM DUAL;ICN, 11, 12A, 12ICN, 11, 12A, 01-IC, 11, 12A, 01ICN, 10, 012A, 01
15. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, C1, C2, C3, C4 순서로 표기)
SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2025-03-31 18:30', 'YYYY-MM-DD HH24:MI'), -1), 'MM-DD') AS C1, TO_CHAR(TO_DATE('2025-03-31 18:30', 'YYYY-MM-DD HH24:MI') + 6/24, 'MM-DD HH24') AS C2, TRUNC(MONTHS_BETWEEN(TO_DATE('2025-06-15', 'YYYY-MM-DD'), TO_DATE('2025-03-31', 'YYYY-MM-DD'))) AS C3, EXTRACT(DAY FROM LAST_DAY(TO_DATE('2024-02-10', 'YYYY-MM-DD'))) AS C4 FROM DUAL;03-01, 04-01 00, 2, 2902-28, 03-31 24, 3, 2902-28, 04-01 00, 3, 2802-28, 04-01 00, 2, 29
16. 다음 [PAX] 테이블에 SQL을 실행했을 때 X, Y, Z, W의 값으로 옳은 것은? (Oracle)
[PAX]
PAX_ID MOBILE HOME MILE P1 010-1 NULL 0 P2 NULL 02-1 500 P3 NULL NULL NULL P4 010-2 031-1 1200 SELECT COUNT(NULLIF(MILE, 0)) AS X, SUM(NVL2(MOBILE, 1, 0)) AS Y, COUNT(COALESCE(MOBILE, HOME)) AS Z, SUM(DECODE(MILE, NULL, 1, 0)) AS W FROM PAX;X=2, Y=2, Z=3, W=1X=2, Y=2, Z=3, W=0X=3, Y=2, Z=3, W=1X=2, Y=2, Z=2, W=1
17. 다음 [FLIGHT] 테이블에 SQL을 실행했을 때 결과 값은?
[FLIGHT]
FLT_NO DEP ARR FARE KE01 GMP CJU 80000 OZ02 ICN NRT 250000 LJ03 GMP PUS 150000 KE04 ICN CJU 120000 7C05 PUS CJU 60000 ZE06 ICN KIX NULL SELECT COUNT(*) FROM FLIGHT WHERE DEP = 'GMP' OR DEP = 'ICN' AND FARE NOT BETWEEN 100000 AND 200000;- 1
- 2
- 3
- 4
18. 다음 [SEAT] 테이블에 (가), (나) SQL을 실행했을 때 결과로 옳은 것은?
[SEAT]
SEAT_NO 1A 12A 1B 10 1 21A -- (가) SELECT COUNT(*) FROM SEAT WHERE SEAT_NO LIKE '1_'; -- (나) SELECT COUNT(*) FROM SEAT WHERE SEAT_NO LIKE '1%A';- (가) 4, (나) 2
- (가) 3, (나) 2
- (가) 3, (나) 1
- (가) 4, (나) 3
19. 다음 [BOOKING] 테이블에 SQL을 실행한 결과로 옳은 것은? (FLT_NO, CNT, PAID, AVG_AMT 순서로 표기)
[BOOKING]
BK_NO FLT_NO CLASS AMT 1 KE01 Y 100 2 KE01 Y NULL 3 KE01 C 300 4 OZ02 Y 200 5 OZ02 Y 300 6 OZ02 C NULL 7 LJ03 Y 150 SELECT FLT_NO, COUNT(*) AS CNT, COUNT(AMT) AS PAID, AVG(AMT) AS AVG_AMT FROM BOOKING GROUP BY FLT_NO HAVING COUNT(*) > COUNT(AMT) ORDER BY FLT_NO;KE01, 3, 3, 133.33/OZ02, 3, 3, 166.67KE01, 3, 2, 200/OZ02, 3, 2, 250/LJ03, 1, 1, 150KE01, 2, 2, 200/OZ02, 2, 2, 250KE01, 3, 2, 200/OZ02, 3, 2, 250
20. 다음 [BOOKING] 테이블에 대해 실행했을 때, 결과가 나머지 셋과 다른 SQL은?
[BOOKING]
BK_NO FLT_NO CLASS AMT 1 KE01 Y 100 2 KE01 Y NULL 3 KE01 C 300 4 OZ02 Y 200 5 OZ02 Y 300 6 OZ02 C NULL 7 LJ03 Y 150 SELECT FLT_NO, SUM(AMT) FROM BOOKING WHERE AMT IS NOT NULL GROUP BY FLT_NO HAVING COUNT(*) >= 3;SELECT FLT_NO, SUM(AMT) FROM BOOKING GROUP BY FLT_NO HAVING COUNT(*) >= 3;SELECT FLT_NO, SUM(AMT) FROM BOOKING GROUP BY FLT_NO HAVING COUNT(BK_NO) >= 3;SELECT FLT_NO, SUM(AMT) FROM BOOKING GROUP BY FLT_NO HAVING COUNT(*) > COUNT(AMT);
21. 다음 [PAX] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle)
[PAX]
NAME GRADE MILE 가 S 300 나 NULL 500 다 G 100 라 S NULL 마 G 400 SELECT NAME, GRADE, MILE FROM PAX ORDER BY 2 DESC, 3;- 가, 라, 다, 마, 나
- 나, 가, 라, 다, 마
- 나, 라, 가, 다, 마
- 다, 마, 가, 라, 나
22. BOOKING 테이블(BK_NO, FLT_NO, CLASS, AMT)에 대해 Oracle에서 실행할 때 오류가 발생하는 SQL은?
SELECT FLT_NO FROM BOOKING GROUP BY FLT_NO ORDER BY COUNT(*) DESC;SELECT FLT_NO, AMT FROM BOOKING ORDER BY CLASS, 2 DESC;SELECT FLT_NO FROM (SELECT FLT_NO, AMT FROM BOOKING) ORDER BY CLASS;SELECT FLT_NO AS F, AMT FROM BOOKING ORDER BY F, AMT DESC;
23. 다음 [FLIGHT] 테이블에서 환승 가능한 항공편 조합(앞 편의 도착지 = 뒤 편의 출발지)을 찾되, 출발지로 되돌아오는 왕복 조합은 제외하려고 한다. SQL을 실행했을 때 결과 값은?
[FLIGHT]
FLT_NO DEP ARR KE01 ICN NRT KE02 NRT ICN KE03 NRT LAX OZ04 ICN HND OZ05 HND LAX JL06 LAX NRT SELECT COUNT(*) FROM FLIGHT A, FLIGHT B WHERE A.ARR = B.DEP AND A.DEP <> B.ARR;- 3
- 4
- 9
- 5
24. [SCHED]의 PK는 (FLT_NO, DEP_DATE)이고, [BOOKING]은 (FLT_NO, DEP_DATE)로 SCHED를 참조한다. 예약별 기종을 조회하려고 다음 SQL을 작성했을 때 결과 건수는?
[SCHED]
FLT_NO DEP_DATE AIRCRAFT KE01 0301 B737 KE01 0302 A330 OZ02 0301 A321 [BOOKING]
FLT_NO DEP_DATE PAX KE01 0301 P1 KE01 0301 P2 KE01 0302 P3 OZ02 0301 P4 SELECT B.PAX, S.AIRCRAFT FROM SCHED S, BOOKING B WHERE S.FLT_NO = B.FLT_NO;- 7
- 4
- 6
- 12
25. 다음 [FLIGHT], [BOOKING] 테이블에 SQL을 실행했을 때 결과 건수와 BK_NO가 NULL인 행의 수로 옳은 것은?
[FLIGHT]
FLT_NO STATUS KE01 OPEN OZ02 CLOSED LJ03 OPEN [BOOKING]
BK_NO FLT_NO 1 KE01 2 KE01 3 OZ02 SELECT F.FLT_NO, B.BK_NO FROM FLIGHT F LEFT OUTER JOIN BOOKING B ON F.FLT_NO = B.FLT_NO AND F.STATUS = 'OPEN';- 3행 / 0행
- 4행 / 1행
- 4행 / 2행
- 3행 / 1행
26. 다음 [PAX], [TIER] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 값으로 옳은 것은?
[PAX]
PAX_ID MILE P1 500 P2 1000 P3 3000 P4 5000 P5 NULL [TIER]
TIER_NM MIN_MILE MAX_MILE SILVER 0 1000 GOLD 1000 5000 VIP 5000 99999 -- (가) SELECT COUNT(*) FROM PAX P INNER JOIN TIER T ON P.MILE BETWEEN T.MIN_MILE AND T.MAX_MILE; -- (나) SELECT COUNT(*) FROM PAX P LEFT OUTER JOIN TIER T ON P.MILE BETWEEN T.MIN_MILE AND T.MAX_MILE;- (가) 4, (나) 5
- (가) 6, (나) 7
- (가) 6, (나) 6
- (가) 5, (나) 6
27. 다음 [FLIGHT] 테이블에 (가), (나) SQL을 실행했을 때 결과 건수로 옳은 것은?
[FLIGHT]
FLT_NO DEP FARE KE01 ICN 300 KE02 ICN 500 OZ03 ICN 200 LJ04 GMP 300 LJ05 GMP 400 7C06 PUS 200 -- (가) SELECT FLT_NO FROM FLIGHT WHERE (DEP, FARE) IN (SELECT DEP, MIN(FARE) FROM FLIGHT GROUP BY DEP); -- (나) SELECT FLT_NO FROM FLIGHT WHERE FARE IN (SELECT MIN(FARE) FROM FLIGHT GROUP BY DEP);- (가) 3건, (나) 4건
- (가) 3건, (나) 3건
- (가) 4건, (나) 4건
- (가) 3건, (나) 6건
28. 다음 [FLIGHT] 테이블에 (가)~(다) SQL을 실행했을 때 결과 값으로 옳은 것은? (DEP가 'CJU'인 행은 없다.)
[FLIGHT]
FLT_NO DEP FARE KE01 GMP 100 OZ02 ICN 200 LJ03 GMP 300 KE04 ICN 400 7C05 PUS 500 -- (가) SELECT COUNT(*) FROM FLIGHT WHERE FARE > ALL (SELECT FARE FROM FLIGHT WHERE DEP = 'GMP'); -- (나) SELECT COUNT(*) FROM FLIGHT WHERE FARE < ANY (SELECT FARE FROM FLIGHT WHERE DEP = 'GMP'); -- (다) SELECT COUNT(*) FROM FLIGHT WHERE FARE > ALL (SELECT FARE FROM FLIGHT WHERE DEP = 'CJU');- (가) 2, (나) 2, (다) 0
- (가) 2, (나) 1, (다) 5
- (가) 3, (나) 2, (다) 0
- (가) 2, (나) 2, (다) 5
29. 다음 두 테이블에 SQL을 실행했을 때 결과 건수는?
[DOM_FLT]
FLT_NO FARE KE01 100 OZ02 NULL KE01 100 [INTL_FLT]
FLT_NO FARE KE01 300 OZ02 500 SELECT FLT_NO, FARE FROM DOM_FLT UNION SELECT FLT_NO, NULL FROM INTL_FLT;- 2
- 3
- 4
- 5
30. 집합 연산자에 대한 설명으로 가장 적절하지 않은 것은?
- 결과 집합의 컬럼명은 첫 번째 SELECT 문의 컬럼명(또는 별칭)을 따른다.
- 정렬이 필요하면 ORDER BY는 전체 집합 연산의 마지막에 한 번만 쓸 수 있다.
- INTERSECT는 두 결과에 공통으로 존재하는 행을 중복까지 포함하여 모두 반환한다.
- SQL Server에서는 Oracle의 MINUS와 같은 차집합 연산에 EXCEPT를 사용한다.
31. 다음 SQL의 결과 건수는?
[BK_SUM]
DEP ARR CLASS AMT ICN NRT Y 10 ICN NRT C 20 ICN LAX Y 30 GMP CJU Y 40 GMP CJU Y 50 SELECT DEP, ARR, CLASS, SUM(AMT) FROM BK_SUM GROUP BY DEP, ROLLUP(ARR, CLASS);- 9건
- 10건
- 8건
- 12건
32. 다음 SQL의 결과에서 DEP와 CLASS가 모두 NULL로 표시되는 행의 수와, 그중 G 값이 0인 행의 S 값으로 옳은 것은?
[BK]
DEP CLASS AMT ICN Y 10 ICN C 20 GMP Y 30 GMP NULL 40 SELECT DEP, CLASS, SUM(AMT) AS S, GROUPING(CLASS) AS G FROM BK GROUP BY CUBE(DEP, CLASS);- 1행, 100
- 2행, 100
- 2행, 70
- 2행, 40
33. 다음 SQL을 실행했을 때 DEP가 'ICN'인 행들의 LV1, LV2 값을 FARE 오름차순으로 나열한 것으로 옳은 것은?
[FLIGHT]
FLT_NO DEP FARE KE01 ICN 300 KE02 ICN 400 KE03 ICN 400 KE04 ICN 600 LJ05 GMP 100 LJ06 GMP 200 SELECT FLT_NO, FARE, LAST_VALUE(FARE) OVER (PARTITION BY DEP ORDER BY FARE) AS LV1, LAST_VALUE(FARE) OVER (PARTITION BY DEP ORDER BY FARE ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LV2 FROM FLIGHT;- LV1:
600, 600, 600, 600/ LV2:600, 600, 600, 600 - LV1:
300, 400, 400, 600/ LV2:600, 600, 600, 600 - LV1:
300, 400, 400, 600/ LV2:300, 400, 400, 600 - LV1:
600, 600, 600, 600/ LV2:300, 400, 400, 600
- LV1:
34. 다음 SQL을 실행했을 때 MA 값을 출력 순서(FLT_NO, DAY 순)대로 나열한 것으로 옳은 것은? (LOAD_PCT는 탑승률이다.)
[LOAD_LOG]
FLT_NO DAY LOAD_PCT KE01 1 80 KE01 2 NULL KE01 3 60 KE01 4 100 OZ02 1 50 OZ02 2 70 SELECT FLT_NO, DAY, AVG(LOAD_PCT) OVER (PARTITION BY FLT_NO ORDER BY DAY ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS MA FROM LOAD_LOG ORDER BY FLT_NO, DAY;40, 46.67, 53.33, 80, 60, 6080, 70, 80, 70, 73.33, 6080, 70, 80, 80, 60, 6080, 80, 60, 80, 50, 60
35. 윈도우 함수에 대한 설명으로 가장 적절한 것은?
- 윈도우 함수는 결과 행 수를 줄이지 않으며, SUM 같은 집계 함수를 OVER 절과 함께 쓰면 각 행에 집계 값이 함께 표시된다.
SUM(AMT) OVER (PARTITION BY DEP)처럼 ORDER BY 없이 쓰면 파티션 안에서 행 순서대로 누적합이 계산된다.- ROWS는 ORDER BY 값의 논리적 범위를, RANGE는 물리적인 행 수를 기준으로 윈도우를 정한다.
- RANK 함수에
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW같은 윈도우 절을 지정하면 순위 계산 범위를 바꿀 수 있다.
36. 다음 SQL의 실행 결과로 옳은 것은? (SQL Server 기준, 출력 순서대로 표기)
[FLIGHT]
FLT_NO FARE KE01 300 OZ02 550 LJ03 120 7C04 480 TW05 260 ZE06 610 SELECT TOP (40) PERCENT FLT_NO FROM FLIGHT ORDER BY FARE DESC;- ZE06, OZ02
- ZE06, OZ02, 7C04, KE01
- LJ03, TW05, KE01
- ZE06, OZ02, 7C04
37. 출발지별로 운임이 높은 항공편 2개씩을 조회하려고 한다. 다음 SQL의 순위 함수 자리에 (가) ROW_NUMBER, (나) RANK, (다) DENSE_RANK를 각각 넣어 실행했을 때 결과 건수로 옳은 것은?
[FLIGHT]
FLT_NO DEP FARE A ICN 500 B ICN 400 C ICN 400 D ICN 300 E GMP 200 F GMP 200 G GMP 100 SELECT * FROM (SELECT FLT_NO, DEP, FARE, 순위함수() OVER (PARTITION BY DEP ORDER BY FARE DESC) AS RN FROM FLIGHT) WHERE RN <= 2;- (가) 4, (나) 4, (다) 6
- (가) 4, (나) 5, (다) 6
- (가) 4, (나) 5, (다) 5
- (가) 4, (나) 6, (다) 7
38. [PAX] 테이블의 REF_ID는 해당 승객을 추천한 승객의 ID이다. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준)
[PAX]
ID NAME REF_ID GRADE 1 A NULL VIP 2 B 1 GOLD 3 C 1 VIP 4 D 2 GOLD 5 E 3 GOLD 6 F 5 GOLD SELECT COUNT(*) FROM PAX START WITH GRADE = 'VIP' CONNECT BY PRIOR ID = REF_ID;- 9
- 6
- 3
- 8
39. 다음 SQL의 실행 결과에 대한 설명으로 옳은 것은? (Oracle 기준)
[PAX]
ID NAME REF_ID 1 A NULL 2 B 1 3 C 1 4 D 2 5 E 3 6 F 5 SELECT NAME, LEVEL, CONNECT_BY_ISLEAF AS ISLEAF, CONNECT_BY_ROOT NAME AS RT, SYS_CONNECT_BY_PATH(NAME, '/') AS PATH FROM PAX START WITH NAME = 'F' CONNECT BY ID = PRIOR REF_ID;- A 행의 LEVEL은 1이다.
- CONNECT_BY_ISLEAF 값이 1인 행은 F이다.
- 결과는 4행이며, 모든 행의 RT 값은 F이다.
- 마지막으로 출력되는 행의 PATH 값은 '/A/C/E/F'이다.
40. 다음 SQL의 결과에 대한 설명으로 옳은 것은? (Oracle 기준)
[BOOKING_M]
BK_NO MON CLASS AMT 1 01 Y 100 2 01 Y 200 3 01 C 500 4 02 Y 300 SELECT * FROM (SELECT MON, CLASS, AMT FROM BOOKING_M) PIVOT (SUM(AMT) AS S, COUNT(*) AS C FOR CLASS IN ('Y' AS Y, 'C' AS C)) ORDER BY MON;- 결과 컬럼은 MON, Y_S, Y_C, C_S, C_C이고, MON이 '02'인 행의 값은 300, 1, 0, 0이다.
- 결과 컬럼은 MON, S_Y, C_Y, S_C, C_C이고, MON이 '02'인 행의 값은 300, 1, NULL, 0이다.
- 결과 컬럼은 MON, Y_S, Y_C, C_S, C_C이고, MON이 '02'인 행의 값은 300, 1, NULL, NULL이다.
- 결과 컬럼은 MON, Y_S, Y_C, C_S, C_C이고, MON이 '02'인 행의 값은 300, 1, NULL, 0이다.
41. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, C1, C2 순서로 표기)
SELECT REGEXP_REPLACE('KE0123', '([A-Z]{2})0*([0-9]+)', '\1-\2') AS C1, REGEXP_SUBSTR('ICN>NRT>LAX', '[^>]+', 1, 3) AS C2 FROM DUAL;KE-0123, LAXKE-123, LAXKE-123, NRTKE0123, LAX
42. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, C1, C2, C3 순서로 표기)
SELECT REGEXP_COUNT('Seat 12a, seat 12A, SEAT 3B', 'seat', 1, 'ic') AS C1, REGEXP_COUNT('Seat 12a, seat 12A, SEAT 3B', '[0-9]+[a-z]', 1, 'i') AS C2, REGEXP_INSTR('Seat 12a, seat 12A, SEAT 3B', '\d+', 1, 3) AS C3 FROM DUAL;1, 3, 263, 3, 261, 2, 261, 3, 27
43. 다음 두 테이블에 대해 아래 UPDATE 문을 실행(Oracle)한 후
SELECT SUM(fare), COUNT(fare) FROM flight;의 결과로 옳은 것은?FLIGHT
FLT_NO FARE KE01 100 OZ02 200 LJ03 300 7C04 400 FARE_CHG
FLT_NO NEW_FARE KE01 150 LJ03 350 ZE09 999 UPDATE flight f SET fare = (SELECT c.new_fare FROM fare_chg c WHERE c.flt_no = f.flt_no);- 1100, 4
- 500, 4
- 500, 2
- 1100, 2
44. 다음 두 테이블에 대해 아래 MERGE 문을 실행(Oracle)한 후
SELECT COUNT(*), SUM(avail) FROM seat_inv;의 결과로 옳은 것은?SEAT_INV
FLT_NO CLASS AVAIL KE01 Y 10 KE01 C 2 OZ02 Y 5 SEAT_CHG
FLT_NO CLASS QTY KE01 Y -3 KE01 C -5 OZ02 C 4 LJ03 Y 0 MERGE INTO seat_inv t USING seat_chg s ON (t.flt_no = s.flt_no AND t.class = s.class) WHEN MATCHED THEN UPDATE SET t.avail = t.avail + s.qty WHERE t.avail + s.qty >= 0 WHEN NOT MATCHED THEN INSERT (flt_no, class, avail) VALUES (s.flt_no, s.class, s.qty) WHERE s.qty > 0;- 5, 18
- 4, 13
- 3, 14
- 4, 18
45. SEAT_CNT 테이블에는 AVAIL 값이 10인 한 행이 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행한 후
SELECT avail FROM seat_cnt;의 결과는? (오류가 발생한 문장은 무시하고 다음 문장이 실행된다고 가정한다.)UPDATE seat_cnt SET avail = avail - 1; SAVEPOINT sp; UPDATE seat_cnt SET avail = avail - 2; SAVEPOINT sp; UPDATE seat_cnt SET avail = avail - 3; SAVEPOINT sp2; UPDATE seat_cnt SET avail = avail - 4; ROLLBACK TO sp; ROLLBACK TO sp2; UPDATE seat_cnt SET avail = avail - 1; COMMIT;- 8
- 6
- 3
- 9
46. 트랜잭션 TX1이 좌석 12A의 운임을 조회하여 300,000원을 확인했다. 그 사이 TX2가 같은 좌석의 운임을 350,000원으로 UPDATE하고 COMMIT했고, TX1이 같은 조회를 다시 실행하자 350,000원이 조회되었다.
이 현상의 이름과, 이 현상을 방지할 수 있는 가장 낮은 격리 수준(ANSI 표준 기준)을 바르게 짝지은 것은?
- Non-Repeatable Read – REPEATABLE READ
- Phantom Read – SERIALIZABLE
- Dirty Read – READ COMMITTED
- Non-Repeatable Read – READ COMMITTED
47. 다음과 같이 테이블을 만들고 ㄱ~ㅁ의 INSERT 문을 순서대로 실행했다. Oracle과 SQL Server에서 각각 성공하는 INSERT 문의 개수로 옳은 것은? (SQL Server에서는 VARCHAR2 대신 VARCHAR, NUMBER 대신 INT로 같은 구조를 만들었다고 가정하며, 오류가 난 문장은 무시하고 진행한다.)
CREATE TABLE pax_t ( pax_id NUMBER PRIMARY KEY, passport VARCHAR2(9) UNIQUE, mile NUMBER CHECK (mile >= 0) ); INSERT INTO pax_t VALUES (1, 'M1', 0); -- ㄱ INSERT INTO pax_t VALUES (2, NULL, NULL); -- ㄴ INSERT INTO pax_t VALUES (3, NULL, 100); -- ㄷ INSERT INTO pax_t VALUES (4, 'M1', 50); -- ㄹ INSERT INTO pax_t VALUES (5, 'M2', -10); -- ㅁ- Oracle 2개 / SQL Server 2개
- Oracle 3개 / SQL Server 3개
- Oracle 4개 / SQL Server 3개
- Oracle 3개 / SQL Server 2개
48. VIEW, INDEX, SEQUENCE에 대한 설명으로 가장 적절한 것은?
- 뷰는 생성 시점의 조회 결과를 별도로 저장하므로, 원본 테이블을 삭제해도 뷰는 계속 조회할 수 있다.
- 인덱스를 많이 만들수록 조회뿐 아니라 INSERT·UPDATE·DELETE 성능도 함께 좋아진다.
- Oracle에서는 ALTER VIEW로 뷰의 SELECT 정의를 바꿀 수 없으므로, CREATE OR REPLACE VIEW로 다시 생성한다.
- SQL Server는 순차 번호 생성에 IDENTITY 속성을 사용할 수 없으므로 반드시 SEQUENCE 객체를 만들어야 한다.
49. DBA가 아래 문장을 순서대로 실행했다. 실행 후 KIM과 LEE가 가진 권한으로 옳은 것은? (Oracle, 두 사용자는 이 문장들 외에 다른 권한이 없다.)
CREATE ROLE r_read; GRANT SELECT ON air.flight TO r_read; CREATE ROLE r_agent; GRANT r_read TO r_agent; GRANT INSERT ON air.booking TO r_agent; GRANT r_agent TO kim; GRANT r_read TO lee; REVOKE SELECT ON air.flight FROM r_read;- KIM: FLIGHT SELECT, BOOKING INSERT / LEE: 없음
- KIM: BOOKING INSERT / LEE: 없음
- KIM: FLIGHT SELECT, BOOKING INSERT / LEE: FLIGHT SELECT
- KIM: BOOKING INSERT / LEE: FLIGHT SELECT
50. Oracle의 DCL에 대한 설명으로 가장 적절한 것은?
- WITH GRANT OPTION은 오브젝트 권한을, WITH ADMIN OPTION은 시스템 권한이나 롤을 다른 사용자에게 다시 부여할 수 있게 한다.
- WITH ADMIN OPTION으로 받은 시스템 권한을 회수하면, 그 사용자가 다른 사용자에게 부여한 같은 권한도 연쇄적으로 회수된다.
- CONNECT, RESOURCE 같은 롤은 Oracle이 제공하지 않으므로 DBA가 직접 CREATE ROLE로 만들어야 사용할 수 있다.
- GRANT나 REVOKE를 실행해도 진행 중인 트랜잭션의 DML은 커밋되지 않고 그대로 유지된다.
AI가 SQLD 출제 범위를 바탕으로 새로 만든 예상 문제이며, 실제 기출문제가 아닙니다.