SQLD 모의고사 16회
50문항 · 제한 시간 90분. 다 풀면 과목별 점수와 합격 여부, 문제마다 해설을 보여 줘요.
1. 한 은행의 기존 시스템을 분석한 결과 다음과 같은 문제가 발견되었다.
- (가) 고객의 연락처가
고객,계좌,대출테이블에 각각 저장되어 있어, 연락처가 바뀔 때마다 세 곳을 모두 고쳐야 한다. - (나) 새로운 예금 상품이 출시될 때마다 상품별 처리 방식에 맞춰 테이블 구조를 변경해야 한다.
- (다)
대출테이블의 보증인 정보와고객테이블 사이의 연관 관계가 정의되어 있지 않아, 같은 사람의 정보가 두 테이블에서 서로 모순되게 저장되어 있다.
(가)~(다)에 해당하는 데이터 모델링 유의점을 순서대로 짝지은 것으로 가장 적절한 것은?
- (가) 비유연성, (나) 중복, (다) 비일관성
- (가) 중복, (나) 비일관성, (다) 비유연성
- (가) 중복, (나) 비유연성, (다) 비일관성
- (가) 비일관성, (나) 비유연성, (다) 중복
- (가) 고객의 연락처가
2. 은행 업무를 분석하면서 엔터티 이름을 정하고 있다. 다음 중 엔터티 명명 규칙에 비추어 가장 적절한 것은?
- 고객이 금융상품에 가입하면서 생기는 엔터티의 이름을 '고객상품' 대신 생성 의미가 드러나는 '상품가입계약'으로 정한다.
- 한 엔터티에 많은 거래가 쌓이므로 집합임이 드러나도록 '거래내역들'이라는 복수형 이름을 사용한다.
- 논리 모델에서도 이름을 짧게 하기 위해 '입출금거래이력'을 'IOTXHST'처럼 약어로 표기한다.
- 영업 부서는 '고객', 여신 부서는 '차주'라고 부르므로 같은 대상을 가리키더라도 두 엔터티를 각각 따로 둔다.
3. 은행의
계좌엔터티에 대해 엔터티, 인스턴스, 속성, 속성값의 관계를 설명한 것이다. 가장 적절하지 않은 것은?계좌엔터티는 업무에서 관리하는 두 개 이상의 계좌 인스턴스의 집합이어야 한다.계좌엔터티는 계좌번호, 개설일자, 잔액처럼 두 개 이상의 속성으로 설명된다.- 계좌번호가 '110-01'인 인스턴스의 '잔액' 속성은 특정 시점에 하나의 값만 가진다.
- 한 고객이 여러 연락처를 가지듯 하나의 인스턴스는 한 속성에 여러 속성값을 가질 수 있으며, 이 경우 그 속성을 그대로 하나의 컬럼으로 구현하는 것이 원칙이다.
4. 관계를 존재에 의한 관계와 행위에 의한 관계로 분류할 때, 다음 중 행위에 의한 관계로 가장 적절한 것은?
- 지점에 행원이 소속되어 있다.
- 고객이 계좌를 개설한다.
- 본부 아래에 여러 지점이 속해 있다.
- 상품분류에 여러 금융상품이 포함되어 있다.
5. 은행의
대출엔터티에서 주식별자로 '담보번호'를 검토하였다. 담보번호는 담보물마다 서로 다른 값이 부여되고 한 번 부여되면 바뀌지 않는다. 그러나 신용대출은 담보가 없어 담보번호 값이 존재하지 않는 대출이 있다는 이유로 주식별자로 부적합하다는 결론이 났다.이 결론의 근거가 되는 주식별자의 특징으로 가장 적절한 것은?
- 유일성
- 존재성
- 최소성
- 불변성
6. 다음
대출신청테이블의 PK는 대출번호이며, 업무 규칙상 고객명과 고객등급은 고객번호에 의해 결정된다.대출번호 고객번호 고객명 고객등급 신청금액 L01 C01 한지우 VIP 5000 L02 C01 한지우 VIP 3000 L03 C02 오세린 일반 1000 이 테이블에서 다음 상황이 발생하였다.
- (가) 아직 대출을 신청한 적 없는 신규 고객의 등급은 대출번호가 없어 저장할 수 없다.
- (나) C01 고객의 등급을 바꾸면서 L01 행만 수정하고 L02 행은 수정하지 않아 데이터가 불일치하게 되었다.
- (다) L03 대출을 삭제하자 C02 고객의 이름과 등급 정보도 함께 사라졌다.
이에 대한 설명으로 가장 적절한 것은?
- (가)는 갱신 이상, (나)는 삽입 이상, (다)는 삭제 이상이며, 제2정규화로 해소된다.
- (가)는 삽입 이상, (나)는 갱신 이상, (다)는 삭제 이상이며, 부분 함수 종속을 제거하는 제2정규화로 해소된다.
- (가)는 삽입 이상, (나)는 갱신 이상, (다)는 삭제 이상이며, 이행 함수 종속을 제거하는 제3정규화로 해소된다.
- (가)~(다)는 모두 반복 속성 때문에 발생하므로 제1정규화로 해소된다.
7.
이체엔터티는계좌엔터티와 출금계좌, 입금계좌라는 두 개의 관계를 가지며, 두 관계 모두 계좌번호를 FK로 상속한다.[ACCOUNT]
ACCT_NO OWNER A1 김민준 A2 김민준 A3 이서연 A4 박지호 [TRANSFER]
TR_ID FROM_ACCT TO_ACCT AMT T1 A1 A3 100 T2 A1 A2 50 T3 A3 A4 70 T4 A2 A1 30 T5 A3 A1 20 다음 SQL의 실행 결과로 옳은 것은?
SELECT T.TR_ID FROM TRANSFER T JOIN ACCOUNT F ON T.FROM_ACCT = F.ACCT_NO JOIN ACCOUNT R ON T.TO_ACCT = R.ACCT_NO WHERE F.OWNER = R.OWNER ORDER BY T.TR_ID;- T2, T4
- T2
- T1, T2, T4, T5
- 결과 없음
8. 업무상
대출1건이 실행되면 반드시 1건 이상의상환스케줄이 함께 생성되어야 한다(대출 ||--|{ 상환스케줄). 개발자가 Oracle에서 아래와 같이 처리하였고, 세 번째 INSERT는 PK 중복으로 오류가 발생하였다. 애플리케이션은 오류를 무시하고 마지막 COMMIT을 실행하였다.이 처리 결과에 대한 설명으로 가장 적절한 것은? (
LOAN_SCHED의 PK는 (LOAN_NO, SEQ)이다.)INSERT INTO LOAN (LOAN_NO, CUST_NO, AMT) VALUES ('L10', 'C01', 3000); INSERT INTO LOAN_SCHED (LOAN_NO, SEQ, PAY_AMT) VALUES ('L10', 1, 1000); INSERT INTO LOAN_SCHED (LOAN_NO, SEQ, PAY_AMT) VALUES ('L10', 1, 1000); -- 오류 발생 COMMIT;- 오류가 발생한 문장 때문에 트랜잭션 전체가 자동으로 롤백되어 아무 데이터도 저장되지 않는다.
- 대출 1건과 상환스케줄 2건이 모두 저장된다.
- 대출 1건만 저장되고 상환스케줄은 하나도 저장되지 않는다.
- 대출 1건과 1회차 상환스케줄만 저장되어, 함께 처리되어야 할 작업의 일부만 반영되므로 원자성이 깨진다.
9. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, 결과는 C1 / C2 / C3 / C4 순서)
SELECT NVL(NULL + 10, 0) AS C1, LENGTH('') AS C2, 'A' || NULL AS C3, CASE WHEN NULL = NULL THEN 'Y' ELSE 'N' END AS C4 FROM DUAL;- 10 / 0 / A / Y
- 0 / 0 / NULL / N
- 0 / NULL / A / N
- 0 / NULL / NULL / Y
10. 은행의
거래내역엔터티 주식별자로 다음 세 가지 안을 검토하고 있다. 계좌번호는계좌엔터티로부터 상속받은 값이며, 업무 규칙상 한 계좌에서 같은 거래일시(초 단위까지)에 두 건 이상의 거래가 발생하지 않는다.- (가) 계좌번호 + 거래일시
- (나) 계좌번호 + 거래순번 (거래순번은 계좌 안에서 1부터 차례로 부여)
- (다) 거래ID (시퀀스로 생성한 단일 번호)
이 중 본질식별자에 해당하는 것만 고른 것은?
- (가)
- (가), (나)
- (나), (다)
- (가), (나), (다)
11. ACCOUNT 테이블의 ACCT_NO는 기본키이고, ACCOUNT.CUST_NO는 CUSTOMER.CUST_NO를 참조하는 외래키이다. ACCOUNT.CUST_NO에는 NOT NULL 제약이 없다. 이에 대한 설명으로 가장 적절하지 않은 것은?
- 한 고객번호가 ACCOUNT.CUST_NO에 여러 번 나타날 수 있다.
- ACCOUNT.CUST_NO에는 NULL을 저장할 수 있다.
- CUSTOMER에 존재하지 않는 고객번호를 ACCOUNT.CUST_NO에 입력하면 참조 무결성 위반으로 오류가 발생한다.
- ACCT_NO는 기본키이므로 중복 값은 허용되지 않지만, NULL은 한 행에 한하여 저장할 수 있다.
12. ACCOUNT 테이블에 ACCT_NO, BRANCH, BAL 컬럼이 있다. 다음 중 Oracle에서 오류 없이 실행되는 SQL은?
SELECT *, BAL FROM ACCOUNT;SELECT A.*, A.BAL * 0.01 AS "예상 이자" FROM ACCOUNT A;SELECT ACCT_NO, BAL 현재 잔액 FROM ACCOUNT;SELECT DISTINCT ACCT_NO, DISTINCT BRANCH FROM ACCOUNT;
13. 다음 [ACCOUNT] 테이블에 SQL을 실행했을 때 결과 값은?
[ACCOUNT]
ACCT BAL FEE A1 1000 100 A2 500 NULL A3 NULL 50 A4 800 0 SELECT COUNT(*) FROM (SELECT DISTINCT BAL - FEE * 2 AS NET FROM ACCOUNT);- 1
- 2
- 3
- 4
14. 계좌번호를 화면에 표시할 때 가운데 부분을 마스킹하려 한다. 다음 SQL의 실행 결과로 옳은 것은? (Oracle)
SELECT SUBSTR('110-234-567890', 1, 4) || LPAD('*', LENGTH('110-234-567890') - 8, '*') || SUBSTR('110-234-567890', -4) AS MASKED FROM DUAL;110-*****7890110******7890110-******7890110-******67890
15. 원금 1,234,567원, 연이율 4.5%인 대출의 월 이자를 계산하는 SQL이다. 실행 결과로 옳은 것은? (Oracle, 결과는 C1 / C2 / C3 / C4 순서)
SELECT ROUND(1234567 * 0.045 / 12, -1) AS C1, TRUNC(1234567 * 0.045 / 12, -1) AS C2, CEIL(1234567 * 0.045 / 12) AS C3, MOD(1234567, 1000) AS C4 FROM DUAL;- 4630 / 4630 / 4629 / 567
- 4620 / 4620 / 4630 / 1234
- 4629.63 / 4620 / 4630 / 567
- 4630 / 4620 / 4630 / 567
16. 다음 [TXN] 테이블에 SQL을 실행했을 때 결과로 옳은 것은? (Oracle, TYPE은 D: 입금, W: 출금, F: 수수료)
[TXN]
TID TYPE AMT T1 D 1000 T2 W 300 T3 F 10 T4 W NULL T5 D 500 SELECT SUM(DECODE(TYPE, 'D', AMT, 'W', -AMT)) AS NET, COUNT(DECODE(TYPE, 'W', 1)) AS W_CNT FROM TXN;- NET = 1200, W_CNT = 2
- NET = 1190, W_CNT = 2
- NET = 1200, W_CNT = 1
- NET = 1190, W_CNT = 1
17. 다음 [ACCOUNT] 테이블에 SQL을 실행했을 때 결과 값은?
[ACCOUNT]
ACCT STATUS BAL A1 ACTIVE 50 A2 ACTIVE 500 A3 CLOSED 0 A4 NULL 300 A5 DORMANT NULL A6 DORMANT 1000 SELECT COUNT(*) FROM ACCOUNT WHERE STATUS <> 'CLOSED' AND BAL NOT BETWEEN 0 AND 100;- 0
- 1
- 2
- 3
18. 다음 [ACCOUNT] 테이블에 SQL을 실행했을 때 결과 건수는?
[ACCOUNT]
ACCT_NO 110-123-456789 110-12-3456789 110-1234-56789 110-987- 1101-23-456789 110-0-0-12345 SELECT COUNT(*) FROM ACCOUNT WHERE ACCT_NO LIKE '110-___-%';- 0건
- 1건
- 2건
- 3건
19. 다음 [TXN] 테이블에 SQL을 실행한 결과로 옳은 것은? (ACCT(CNT, TOT) 형식으로 표기)
[TXN]
ACCT TYPE AMT A1 D 100 A1 W 50 A1 D 200 A2 D 400 A2 W 300 A3 D 150 A3 D 150 A3 D NULL A4 W 500 SELECT ACCT, COUNT(*) AS CNT, SUM(AMT) AS TOT FROM TXN WHERE TYPE = 'D' GROUP BY ACCT HAVING COUNT(AMT) >= 2 ORDER BY ACCT;- A1(3, 350)
- A1(2, 300), A2(1, 400), A3(3, 300)
- A1(2, 300), A3(2, 300)
- A1(2, 300), A3(3, 300)
20. ACCOUNT 테이블(ACCT_NO, CUST_NO, BRANCH, BAL)에 대해 Oracle에서 오류 없이 실행되는 SQL은?
SELECT BRANCH, SUM(BAL) AS TOT FROM ACCOUNT GROUP BY BRANCH HAVING TOT > 1000;SELECT BRANCH, SUM(BAL) FROM ACCOUNT GROUP BY BRANCH HAVING MAX(BAL) > 500 ORDER BY COUNT(*) DESC;SELECT BRANCH, CUST_NO, SUM(BAL) FROM ACCOUNT GROUP BY BRANCH;SELECT BRANCH, SUM(BAL) FROM ACCOUNT WHERE SUM(BAL) > 1000 GROUP BY BRANCH;
21. 다음 [ACCOUNT] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle)
[ACCOUNT]
ACCT BRANCH BAL A1 강남 300 A2 NULL 100 A3 강남 NULL A4 종로 200 A5 강남 100 SELECT ACCT FROM ACCOUNT ORDER BY BRANCH DESC, BAL;- A2, A4, A5, A1, A3
- A4, A5, A1, A3, A2
- A2, A4, A3, A5, A1
- A4, A3, A5, A1, A2
22. ORDER BY 절에 대한 설명으로 가장 적절하지 않은 것은?
- ORDER BY는 논리적으로 SELECT 절 이후에 처리되므로 SELECT 절에서 정의한 컬럼 별칭을 사용할 수 있다.
- GROUP BY나 DISTINCT를 사용하지 않은 일반 SELECT문에서는 SELECT 목록에 없는 컬럼으로도 정렬할 수 있다.
- Oracle은 NULL을 가장 큰 값으로, SQL Server는 가장 작은 값으로 취급하여 정렬한다.
ORDER BY 3처럼 위치 번호를 쓸 때 SELECT 목록의 컬럼 수보다 큰 번호를 지정하면 마지막 컬럼을 기준으로 정렬된다.
23. 다음 세 테이블에 SQL을 실행한 결과로 옳은 것은? (NAME(CNT, TOT) 형식으로 표기)
[CUSTOMER]
CUST NAME C1 김 C2 이 C3 박 [ACCOUNT]
ACCT CUST A1 C1 A2 C1 A3 C2 A4 C3 [TXN]
ACCT AMT A1 100 A1 200 A2 50 A3 300 A5 70 SELECT C.NAME, COUNT(*) AS CNT, SUM(T.AMT) AS TOT FROM CUSTOMER C, ACCOUNT A, TXN T WHERE C.CUST = A.CUST AND A.ACCT = T.ACCT GROUP BY C.NAME;- 김(2, 350), 이(1, 300)
- 김(3, 350), 이(1, 300), 박(0, NULL)
- 김(3, 350), 이(1, 300)
- 김(3, 350), 이(1, 300), 박(1, 70)
24. Oracle의
(+)외부 조인 표기법에 대한 설명으로 가장 적절하지 않은 것은?(+)는 조인 조건에서 값이 없어 NULL로 채워질 쪽, 즉 데이터가 부족한 테이블의 컬럼에 붙인다.WHERE A.ID(+) = B.ID(+)처럼 양쪽 컬럼에 모두(+)를 붙이면 FULL OUTER JOIN을 구현할 수 있다.- 외부 조인되는 테이블에 대한 일반 조건(예:
L.STATUS = 'ACTIVE')에(+)를 빠뜨리면 결과가 내부 조인과 같아질 수 있다. WHERE C.CUST_NO = L.CUST_NO(+)는 ANSI 표준의CUSTOMER C LEFT OUTER JOIN LOAN L ON C.CUST_NO = L.CUST_NO와 같은 결과를 낸다.
25. 다음 세 테이블에 SQL을 실행했을 때 결과 건수는?
[CUSTOMER]
CUST NAME C1 김 C2 이 C3 박 C4 최 [ACCOUNT]
ACCT CUST BR A1 C1 B1 A2 C1 B9 A3 C2 B2 [BRANCH]
BR BNAME B1 강남 B2 종로 SELECT C.NAME, A.ACCT, B.BNAME FROM CUSTOMER C LEFT OUTER JOIN ACCOUNT A ON C.CUST = A.CUST INNER JOIN BRANCH B ON A.BR = B.BR;- 2건
- 3건
- 4건
- 5건
26. 계좌가 하나도 없는 고객을 조회하려고 아래 SQL을 작성하였다. ACCOUNT.CUST에는 NOT NULL 제약이 있다.
[CUSTOMER]
CUST NAME C1 김 C2 이 C3 박 C4 최 [ACCOUNT]
ACCT CUST A1 C1 A2 C1 A3 C3 다음 중 위 SQL과 실행 결과가 다른 것은?
SELECT C.NAME FROM CUSTOMER C LEFT OUTER JOIN ACCOUNT A ON C.CUST = A.CUST WHERE A.CUST IS NULL;SELECT C.NAME FROM CUSTOMER C WHERE NOT EXISTS (SELECT 1 FROM ACCOUNT A WHERE A.CUST = C.CUST);SELECT C.NAME FROM CUSTOMER C WHERE C.CUST NOT IN (SELECT A.CUST FROM ACCOUNT A);SELECT NAME FROM CUSTOMER WHERE CUST IN (SELECT CUST FROM CUSTOMER MINUS SELECT CUST FROM ACCOUNT);SELECT C.NAME FROM CUSTOMER C LEFT OUTER JOIN ACCOUNT A ON C.CUST = A.CUST AND A.CUST IS NULL;
27. 다음 두 테이블에 SQL을 실행한 결과로 옳은 것은? (출력 순서대로 표기)
[CUSTOMER]
CUST NAME C1 김 C2 이 C3 박 C4 최 [ACCOUNT]
ACCT CUST BAL A1 C1 1500 A2 C1 2000 A3 C2 500 A4 C2 3000 A5 C3 1000 SELECT C.NAME FROM CUSTOMER C WHERE NOT EXISTS (SELECT 1 FROM ACCOUNT A WHERE A.CUST = C.CUST AND A.BAL < 1000) ORDER BY C.NAME;- 김, 박
- 김
- 김, 박, 최
- 김, 이, 박
28. 다음 [ACCOUNT] 테이블에 SQL을 실행한 결과로 옳은 것은? (출력 순서대로 표기)
[ACCOUNT]
ACCT BRANCH BAL A1 강남 500 A2 강남 800 A3 종로 300 A4 종로 300 A5 NULL 900 SELECT ACCT FROM ACCOUNT A WHERE BAL = (SELECT MAX(BAL) FROM ACCOUNT B WHERE B.BRANCH = A.BRANCH) ORDER BY ACCT;- A2, A3
- A2, A3, A4
- A2, A3, A4, A5
- A5
29. 다음 두 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle 기준)
[DEPOSIT]
CUST C1 C1 C2 C3 NULL [LOAN]
CUST C2 C2 C4 NULL -- (가) SELECT CUST FROM DEPOSIT MINUS SELECT CUST FROM LOAN; -- (나) SELECT CUST FROM DEPOSIT INTERSECT SELECT CUST FROM LOAN;- (가) 2건, (나) 2건
- (가) 2건, (나) 1건
- (가) 3건, (나) 1건
- (가) 3건, (나) 2건
30. DEPOSIT(CUST, BAL), LOAN(CUST, AMT) 테이블이 있다. BAL과 AMT는 모두 숫자형이다. 다음 중 Oracle에서 오류가 발생하는 SQL은?
SELECT CUST, BAL FROM DEPOSIT UNION SELECT CUST, AMT FROM LOAN ORDER BY BAL;SELECT CUST, BAL AS AMT FROM DEPOSIT UNION ALL SELECT CUST, AMT FROM LOAN ORDER BY 2;SELECT CUST, NULL FROM DEPOSIT UNION SELECT CUST, AMT FROM LOAN;SELECT CUST, BAL FROM DEPOSIT UNION SELECT CUST, AMT FROM LOAN ORDER BY AMT;
31. 다음 SQL의 결과 행 수와, 결과에서 PROD 컬럼이 NULL로 표시되는 행 수로 옳은 것은?
[SALES]
BRANCH PROD AMT 강남 예금 100 강남 적금 200 강남 NULL 50 종로 예금 300 SELECT BRANCH, PROD, SUM(AMT) FROM SALES GROUP BY ROLLUP(BRANCH, PROD);- 6행, 3행
- 7행, 3행
- 7행, 4행
- 8행, 4행
32. 그룹 함수에 대한 설명으로 가장 적절한 것은?
ROLLUP(BRANCH, PROD)와ROLLUP(PROD, BRANCH)는 인수 순서와 관계없이 같은 집계 수준을 만든다.CUBE(BRANCH, PROD)는 (BRANCH, PROD), (BRANCH), () 세 가지 집계 수준을 만든다.GROUPING SETS(BRANCH, PROD)는 BRANCH별 집계와 PROD별 집계만 만들며, 전체 합계가 필요하면()를 함께 지정해야 한다.GROUPING(PROD)는 PROD 값이 원래 데이터에서 NULL인 행에 대해서도 1을 반환한다.
33. 다음 [REPAY] 테이블은 대출별 상환 예정액이다. SQL의 실행 결과에서 REMAIN 값을 출력 순서대로 나열한 것으로 옳은 것은?
[REPAY]
LOAN SEQ AMT L1 1 100 L1 2 200 L1 3 300 L2 1 50 L2 2 50 SELECT LOAN, SEQ, SUM(AMT) OVER (PARTITION BY LOAN ORDER BY SEQ ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS REMAIN FROM REPAY ORDER BY LOAN, SEQ;- 600, 500, 300, 100, 50
- 100, 300, 600, 50, 100
- 600, 600, 600, 100, 100
- 300, 500, 600, 50, 100
34. 다음 SQL의 실행 결과에서 RK 값을 ACCT 순서(A1~A5)대로 나열한 것으로 옳은 것은? (Oracle 기준)
[ACCOUNT]
ACCT BRANCH BAL A1 강남 500 A2 강남 NULL A3 강남 700 A4 종로 300 A5 종로 300 SELECT ACCT, RANK() OVER (PARTITION BY BRANCH ORDER BY BAL DESC) AS RK FROM ACCOUNT ORDER BY ACCT;- 2, 3, 1, 1, 1
- 2, NULL, 1, 1, 2
- 2, 3, 1, 1, 2
- 3, 1, 2, 1, 1
35. TXN(ACCT, TXN_DT, AMT) 테이블에서 계좌별로 거래일시 순서에 따라 직전 거래의 금액을 함께 조회하려 한다. 단, 계좌의 첫 거래는 직전 금액을 0으로 표시해야 한다. 빈칸에 들어갈 내용으로 가장 적절한 것은?
SELECT ACCT, TXN_DT, AMT, (빈칸) AS PREV_AMT FROM TXN;LEAD(AMT, 1, 0) OVER (PARTITION BY ACCT ORDER BY TXN_DT)LAG(AMT, 1, 0) OVER (PARTITION BY ACCT ORDER BY TXN_DT)LAG(AMT, 1, 0) OVER (ORDER BY ACCT)LAG(AMT, 0, 1) OVER (PARTITION BY ACCT ORDER BY TXN_DT)
36. 다음 SQL의 결과 건수는? (Oracle 12c 이상 기준)
[ACCOUNT]
ACCT BAL A 900 B 800 C 800 D 800 E 700 SELECT ACCT, BAL FROM ACCOUNT ORDER BY BAL DESC FETCH FIRST 2 ROWS WITH TIES;- 2건
- 3건
- 4건
- 5건
37. ACCOUNT(ACCT, BAL) 테이블에서 잔액이 가장 많은 계좌 3개를 조회하려 한다. Oracle에서 항상 의도한 결과를 얻는 SQL은? (잔액에 동점은 없다고 가정한다.)
SELECT * FROM (SELECT ACCT, BAL FROM ACCOUNT ORDER BY BAL DESC) WHERE ROWNUM <= 3;SELECT ACCT, BAL FROM ACCOUNT WHERE ROWNUM <= 3 ORDER BY BAL DESC;SELECT * FROM (SELECT ACCT, BAL, ROWNUM AS RN FROM ACCOUNT ORDER BY BAL DESC) WHERE RN <= 3;SELECT * FROM (SELECT ACCT, BAL FROM ACCOUNT ORDER BY BAL DESC) WHERE ROWNUM >= 2 AND ROWNUM <= 4;
38. 다음 SQL의 결과에 포함되는 행으로 옳은 것은? (Oracle 기준, NAME | UP_NM | LV 순서로 표기)
[ORG]
ID NAME PID 1 본점 NULL 2 서울본부 1 3 부산본부 1 4 강남지점 2 5 종로지점 2 6 해운대지점 3 SELECT NAME, PRIOR NAME AS UP_NM, LEVEL AS LV FROM ORG WHERE LEVEL = 3 START WITH PID IS NULL CONNECT BY PRIOR ID = PID;강남지점 | 본점 | 3서울본부 | 본점 | 2부산본부 | NULL | 2해운대지점 | 부산본부 | 3
39. 다음 [ORG] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준)
[ORG]
ID NAME PID 1 본점 NULL 2 서울본부 1 3 부산본부 1 4 강남지점 2 5 종로지점 2 6 해운대지점 3 SELECT SYS_CONNECT_BY_PATH(NAME, '/') AS PATH FROM ORG WHERE CONNECT_BY_ISLEAF = 1 START WITH NAME = '강남지점' CONNECT BY PRIOR PID = ID;/본점/서울본부/강남지점/강남지점/서울본부/본점/강남지점/서울본부/본점
40. 다음 SQL의 결과에서 ACCT가 'A1'인 행으로 옳은 것은? (Oracle 기준)
[TXN]
ACCT TYPE AMT A1 D 100 A1 D 200 A1 W 50 A2 W 70 SELECT * FROM (SELECT ACCT, TYPE, AMT FROM TXN) PIVOT (SUM(AMT) AS S, MAX(AMT) AS M FOR TYPE IN ('D' AS DEP, 'W' AS WD)) ORDER BY ACCT;- (ACCT, DEP, WD) = (A1, 300, 50)
- (ACCT, S_DEP, M_DEP, S_WD, M_WD) = (A1, 300, 200, 50, 50)
- (ACCT, DEP_S, DEP_M, WD_S, WD_M) = (A1, 300, 200, 50, 50)
- (ACCT, DEP_S, DEP_M, WD_S, WD_M) = (A1, 300, 300, 50, 50)
41. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준, C1 / C2 순서로 표기)
SELECT REGEXP_SUBSTR('KB110-12345-6789', '[0-9]{4,}') AS C1, REGEXP_SUBSTR('KB110-12345-6789', '[0-9]{4,}', 1, 2) AS C2 FROM DUAL;- 12345 / 6789
- 110 / 12345
- 1234 / 6789
- 12345 / NULL
42. 다음 SQL의 결과 건수는? (Oracle 기준)
[ACCOUNT]
ACCT_NO 110-23-456789 110-234-567890 1102-34-567890 110-2345-67890 110-234-56789 333-12-123456 SELECT ACCT_NO FROM ACCOUNT WHERE REGEXP_LIKE(ACCT_NO, '^[0-9]{3}-[0-9]{2,3}-[0-9]{6}$');- 0건
- 1건
- 2건
- 3건
43. ACCOUNT 테이블에 (ACCT, BAL, FEE)가 ('A1', 1000, 0), ('A2', 50, 0) 두 행 있다. 아래 UPDATE 문을 실행한 후
SELECT BAL, FEE FROM ACCOUNT WHERE ACCT = 'A1';의 결과로 옳은 것은?UPDATE ACCOUNT SET BAL = BAL - 100, FEE = BAL * 0.01 WHERE BAL >= 100;- BAL = 900, FEE = 9
- BAL = 900, FEE = 10
- BAL = 1000, FEE = 10
- BAL = 900, FEE = 0
44. 다음 테이블에 대해 아래 두 문장을 순서대로 실행한 후
SELECT COUNT(*) FROM ACCOUNT;의 결과는? (DORMANT 테이블은 처음에 비어 있다.)[ACCOUNT]
ACCT A1 A2 A3 A4 A5 [TXN]
ACCT YR A1 2024 A2 2022 A2 2023 A3 2025 A5 NULL INSERT INTO DORMANT (ACCT) SELECT A.ACCT FROM ACCOUNT A WHERE NOT EXISTS (SELECT 1 FROM TXN T WHERE T.ACCT = A.ACCT AND T.YR >= 2024); DELETE FROM ACCOUNT WHERE ACCT IN (SELECT ACCT FROM DORMANT);- 0
- 1
- 2
- 3
45. 다음 상황에 대한 설명으로 가장 적절한 것은?
트랜잭션 TX1이 계좌 A1의 잔액을 조회하여 1,000원을 얻었다. 그 사이 TX2가 A1의 잔액을 500원으로 UPDATE하고 COMMIT하였다. TX1이 같은 트랜잭션 안에서 A1의 잔액을 다시 조회하자 500원이 조회되었다.
- Non-Repeatable Read 현상이며, 이를 방지하려면 최소한 REPEATABLE READ 격리 수준이 필요하다.
- Dirty Read 현상이며, READ COMMITTED 격리 수준이면 방지된다.
- Phantom Read 현상이며, SERIALIZABLE 격리 수준에서만 방지된다.
- Non-Repeatable Read 현상이며, READ COMMITTED 격리 수준이면 방지된다.
46. ACCOUNT 테이블에 A1의 잔액 1000, A2의 잔액 500이 커밋되어 있고 A3 계좌는 없다. Oracle에서 아래 문장을 순서대로 실행했을 때, 마지막 COMMIT 이후 A1, A2의 잔액으로 옳은 것은? (오류가 발생한 문장은 무시하고 다음 문장이 실행된다고 가정한다.)
UPDATE ACCOUNT SET BAL = BAL - 300 WHERE ACCT = 'A1'; SAVEPOINT S1; UPDATE ACCOUNT SET BAL = BAL + 300 WHERE ACCT = 'A2'; SAVEPOINT S2; UPDATE ACCOUNT SET BAL = BAL - 100 WHERE ACCT = 'A1'; ROLLBACK TO S1; UPDATE ACCOUNT SET BAL = BAL + 300 WHERE ACCT = 'A3'; ROLLBACK TO S2; COMMIT;- A1 = 600, A2 = 800
- A1 = 700, A2 = 800
- A1 = 1000, A2 = 500
- A1 = 700, A2 = 500
47. Oracle에서 아래와 같이 LOAN 테이블을 생성한 뒤 INSERT 문 5개를 순서대로 실행했다. 오류가 발생한 문장은 무시하고 진행했을 때, 마지막에
SELECT COUNT(*) FROM LOAN;의 결과는?CREATE TABLE LOAN ( LOAN_NO NUMBER PRIMARY KEY, CUST_NO VARCHAR2(5) NOT NULL, AMT NUMBER(10) CHECK (AMT > 0), RATE NUMBER(4, 2) CHECK (RATE BETWEEN 0 AND 20), ACCT_NO VARCHAR2(10) UNIQUE ); INSERT INTO LOAN VALUES (1, 'C1', 1000, 3.5, 'A1'); INSERT INTO LOAN VALUES (2, 'C2', 500, NULL, NULL); INSERT INTO LOAN VALUES (3, 'C3', 700, 4.0, NULL); INSERT INTO LOAN VALUES (4, '', 300, 2.0, 'A4'); INSERT INTO LOAN VALUES (5, 'C5', 0, 1.0, 'A5'); COMMIT;- 2
- 3
- 4
- 5
48. Oracle에서 아래 문장을 순서대로 실행했다. TXN_LOG 테이블은 비어 있으며 AMT 컬럼에
CHECK (AMT > 0)제약이 있다. 오류가 발생한 문장은 무시하고 진행했을 때 마지막 SELECT의 결과는?CREATE SEQUENCE TXN_SEQ START WITH 100 INCREMENT BY 10; INSERT INTO TXN_LOG (TXN_ID, AMT) VALUES (TXN_SEQ.NEXTVAL, 500); INSERT INTO TXN_LOG (TXN_ID, AMT) VALUES (TXN_SEQ.NEXTVAL, -1); ROLLBACK; INSERT INTO TXN_LOG (TXN_ID, AMT) VALUES (TXN_SEQ.NEXTVAL, 300); COMMIT; SELECT TXN_ID FROM TXN_LOG;- 100
- 110
- 120
- 130
49. BANK.ACCOUNT 테이블의 소유자 BANK가 아래 순서로 DCL을 실행했다. 모든 문장이 실행된 후 KIM이 BANK.ACCOUNT에 대해 할 수 있는 작업으로 옳은 것은? (Oracle, KIM은 이 문장들 외에 다른 권한이 없으며 TELLER 롤은 기본 롤로 활성화되어 있다.)
GRANT SELECT ON BANK.ACCOUNT TO KIM; CREATE ROLE TELLER; GRANT SELECT, UPDATE ON BANK.ACCOUNT TO TELLER; GRANT TELLER TO KIM; REVOKE SELECT ON BANK.ACCOUNT FROM KIM; REVOKE UPDATE ON BANK.ACCOUNT FROM TELLER;- SELECT는 가능하고 UPDATE는 불가능하다.
- SELECT와 UPDATE 모두 가능하다.
- SELECT와 UPDATE 모두 불가능하다.
- SELECT는 불가능하고 UPDATE는 가능하다.
50. Oracle의 권한 부여와 회수에 대한 설명으로 가장 적절한 것은?
- WITH ADMIN OPTION으로 시스템 권한을 받은 사용자가 이를 다른 사용자에게 부여한 뒤 자신의 권한을 회수당하면, 다른 사용자에게 부여한 권한도 연쇄적으로 회수된다.
- 오브젝트 권한을 다른 사용자에게 다시 부여할 수 있게 하려면 WITH ADMIN OPTION을 지정한다.
- 롤(ROLE)에는 시스템 권한만 담을 수 있고 오브젝트 권한은 담을 수 없다.
- WITH GRANT OPTION으로 오브젝트 권한을 받은 사용자가 이를 다른 사용자에게 부여한 뒤 자신의 권한을 회수당하면, 다른 사용자에게 부여한 권한도 함께 회수된다.
AI가 SQLD 출제 범위를 바탕으로 새로 만든 예상 문제이며, 실제 기출문제가 아닙니다.