SQLD 모의고사 12회
50문항 · 제한 시간 90분. 다 풀면 과목별 점수와 합격 여부, 문제마다 해설을 보여 줘요.
1. 병원 정보시스템 구축을 위해 다음과 같은 분석 활동을 수행하였다. 분석 활동과 데이터 모델링 관점을 짝지은 것으로 가장 적절한 것은?
환자,진료,처방엔터티와 그 사이의 관계를 정적으로 분석하였다. - 프로세스 관점- 외래 접수부터 진료, 수납까지의 업무 시나리오를 동적으로 분석하였다. - 데이터 관점
- '처방 등록' 업무가
처방,약품재고엔터티를 어떻게 생성·조회·수정하는지 CRUD 매트릭스로 분석하였다. - 데이터와 프로세스의 상관 관점 - 업무가 실제로 무엇을 하는지(How)에 초점을 두고 분석하였다. - 데이터 관점
2. 병원 업무 모델의 엔터티 이름을 정하는 과정에서 나온 의견이다. 엔터티 명명 규칙에 비추어 가장 적절한 것은?
- 환자와 의사 사이에서 발생하는 엔터티를
환자의사처럼 부모 이름을 이어 붙이지 않고, 생성되는 업무 의미가 드러나도록진료라고 명명한다. - 이름이 길면 관리가 불편하므로
환자는PT,처방은RX처럼 약어로 명명하는 것을 원칙으로 한다. - 엔터티는 여러 인스턴스의 집합이므로
처방들,검사결과목록처럼 복수형 이름을 붙이는 것이 바람직하다. 외래진료와입원진료는 성격이 비슷하므로 두 엔터티 모두진료라는 같은 이름을 사용해도 된다.
- 환자와 의사 사이에서 발생하는 엔터티를
3. 병원 시스템의
처방엔터티에 다음 속성이 정의되어 있다.- 처방번호: 처방 1건을 식별하는 주식별자
- 환자번호:
환자엔터티와의 관계로부터 상속받은 속성 - 처방일자: 의사가 처방을 낸 날짜
- 총약품수: 해당 처방에 속한
처방상세의 건수를 계산한 값
속성의 분류에 대한 설명으로 가장 적절하지 않은 것은?
- 처방번호는 구성 방식에 따른 분류에서 PK(기본키) 속성이다.
- 환자번호는 다른 엔터티와의 관계를 통해 받은 FK(외래키) 속성이다.
- 처방일자는 구성 방식상 PK도 FK도 아닌 일반 속성이며, 특성상 업무에서 바로 정의되는 기본 속성이다.
- 총약품수는 다른 엔터티의 값을 계산하여 얻으므로 구성 방식에 따른 분류에서 FK 속성에 해당한다.
4. 병원의 입원 업무 규칙은 다음과 같다.
- 입원환자는 입원 기간 동안 반드시 하나의 병상을 배정받는다.
- 하나의 병상에는 동시에 최대 한 명의 입원환자만 배정된다.
- 환자가 배정되지 않은 빈 병상도 존재할 수 있다.
입원환자와병상사이의 관계에 대한 설명으로 가장 적절한 것은? (특정 시점의 배정 상태만 고려한다.)- 두 엔터티의 관계차수(Cardinality)는 1:M이다.
- 입원환자 쪽에서 보면 병상과의 관계는 필수(Mandatory)이고, 병상 쪽에서 보면 입원환자와의 관계는 선택(Optional)이다.
- 빈 병상이 존재할 수 있으므로 입원환자 쪽에서 보는 병상과의 관계가 선택(Optional)이다.
- 관계선택사양(Optionality)은 관계에 참여하는 인스턴스의 수(1개 또는 여러 개)를 나타낸다.
5.
진료과엔터티의 주식별자를 정하려 한다. 진료과에는 진료과코드(예: IM, GS), 진료과명(예: 내과, 일반외과), 개설일자, 위치 속성이 있다. 진료과명은 병원 정책에 따라 '일반외과' → '외과'처럼 바뀐 적이 있다. 주식별자 도출에 대한 설명으로 가장 적절한 것은?- 사람이 알아보기 쉬운 진료과명을 주식별자로 지정하는 것이 바람직하다.
- 주식별자는 유일하기만 하면 되므로 값이 자주 바뀌어도 문제가 없다.
- 업무에서 자주 사용되고 변하지 않는 진료과코드를 주식별자로 지정하고, 진료과명은 일반 속성으로 둔다.
- 유일성을 확실히 하기 위해 (진료과코드, 진료과명, 개설일자, 위치)를 모두 묶어 주식별자로 지정한다.
6. 다음
입원테이블의 PK는 입원번호이며, 업무 규칙상 병동명과 병동층은 병동코드에 의해 결정된다.[입원]
입원번호 환자번호 병동코드 병동명 병동층 A01 P10 W1 내과병동 5 A02 P11 W1 내과병동 5 A03 P12 W2 외과병동 6 이 테이블에 대한 설명으로 가장 적절한 것은?
- 새로 개설한 병동은 입원 환자가 생기기 전까지 병동 정보를 저장할 수 없는데, 이는 삽입 이상이며 병동 정보를 별도 테이블로 분리하는 제3정규화로 해소할 수 있다.
- PK가 단일 속성이므로 부분 함수 종속이 없고, 따라서 이미 제3정규형을 만족한다.
- W1 병동의 층을 바꿀 때 일부 행만 수정되어 데이터가 서로 달라지는 문제는 삭제 이상에 해당한다.
- 병동코드 → 병동명 종속은 부분 함수 종속이므로 제2정규화의 대상이다.
7.
환자–진료–처방은 각각 1:M 관계이며 데이터는 다음과 같다. SQL의 실행 결과로 옳은 것은? (이름은 가나다순으로 정렬된다.)[PATIENT]
PID PNAME P1 김 P2 이 P3 박 [VISIT]
VID PID V1 P1 V2 P1 V3 P2 V4 P3 [RX]
RID VID R1 V1 R2 V1 R3 V2 R4 V3 SELECT P.PNAME, COUNT(*) AS CNT FROM PATIENT P JOIN VISIT V ON P.PID = V.PID JOIN RX R ON V.VID = R.VID GROUP BY P.PNAME ORDER BY P.PNAME;- (김, 2), (박, 1), (이, 1)
- (김, 3), (박, 0), (이, 1)
- (김, 2), (이, 1)
- (김, 3), (이, 1)
8. 병원 처방 업무의 일부가 IE 표기법으로 아래와 같이 모델링되어 있다. (
|는 필수,o는 선택,{는 여러 건을 의미한다.) 업무 규칙상 처방 1건은 반드시 1건 이상의 처방상세(약품·용량)를 가져야 한다. 이 모델에 따른 트랜잭션 설계로 가장 적절한 것은?환자 ||--o{ 처방 : 받는다 처방 ||--|{ 처방상세 : 포함한다- 환자를 등록할 때는 첫 처방도 반드시 같은 트랜잭션에서 함께 등록해야 한다.
- 처방과 그 처방상세를 하나의 트랜잭션으로 묶어, 처방상세 입력이 실패하면 처방 입력도 함께 취소되도록 한다.
- 처방을 먼저 입력하고 COMMIT한 뒤, 처방상세는 별도의 트랜잭션으로 나중에 입력해도 모델과 일치한다.
- 처방상세가 필수이므로 처방 없이 처방상세만 먼저 등록해 두는 것도 허용된다.
9. Oracle에서 아래 문장을 실행했다. 마지막 SELECT의 결과로 옳은 것은? (결과는 C1 / C2 / C3 순서,
' '는 공백 한 칸이다.)CREATE TABLE PT_MEMO (ID NUMBER, MEMO VARCHAR2(20)); INSERT INTO PT_MEMO VALUES (1, '알레르기'); INSERT INTO PT_MEMO VALUES (2, ''); INSERT INTO PT_MEMO VALUES (3, NULL); INSERT INTO PT_MEMO VALUES (4, ' '); SELECT COUNT(MEMO) AS C1, SUM(CASE WHEN MEMO IS NULL THEN 1 ELSE 0 END) AS C2, COUNT(NVL(MEMO, '-')) AS C3 FROM PT_MEMO;- 2 / 2 / 4
- 3 / 1 / 4
- 2 / 2 / 2
- 3 / 1 / 3
10.
처방상세엔터티는 본질식별자 (처방번호, 약품코드)를 가진다. 업무 규칙상 한 처방에 같은 약품은 한 줄만 허용되며,처방상세를 부모로 하는 하위 엔터티는 없다. 식별자 설계에 대한 설명으로 가장 적절한 것은?- 시퀀스로 만든
처방상세ID를 PK로 쓰면, (처방번호, 약품코드)에 별도 제약을 두지 않아도 같은 약품이 중복 입력되는 일이 자동으로 막힌다. - 본질식별자는 어떤 경우에도 반드시 PK로 사용해야 하며, 인조식별자의 사용은 금지된다.
- 본질식별자가 단순하고 하위 엔터티로 상속될 일도 없으므로, 인조식별자를 추가하기보다 (처방번호, 약품코드)를 그대로 PK로 사용하는 것이 원칙에 맞다.
- 인조식별자를 PK로 도입하면 (처방번호, 약품코드)로 조회하기 위한 인덱스가 필요 없어지므로 인덱스 수가 줄어든다.
- 시퀀스로 만든
11. Oracle에서 아래와 같이 테이블을 만들고 INSERT 문을 순서대로 실행했다. 오류가 발생한 문장은 무시하고 진행했을 때, 최종적으로 VISIT 테이블에 저장된 행 수는? (DOCTOR 테이블에는 DOC_ID가 'D1', 'D2'인 두 행만 있다.)
CREATE TABLE VISIT ( VID NUMBER PRIMARY KEY, PID VARCHAR2(5) NOT NULL, DOC_ID VARCHAR2(5) REFERENCES DOCTOR(DOC_ID) ); INSERT INTO VISIT VALUES (1, 'P1', 'D1'); INSERT INTO VISIT VALUES (2, 'P1', NULL); INSERT INTO VISIT VALUES (3, 'P2', 'D9'); INSERT INTO VISIT VALUES (1, 'P3', 'D2'); INSERT INTO VISIT VALUES (4, NULL, 'D2'); INSERT INTO VISIT VALUES (5, 'P2', 'D1');- 2건
- 3건
- 4건
- 5건
12. 다음 [BILL] 테이블에 SQL을 실행했을 때 PAY 값을 BILL_NO 순서대로 나열한 것으로 옳은 것은?
[BILL]
BILL_NO TOTAL INS_AMT DISC 1 50000 30000 0 2 40000 NULL 5000 3 30000 20000 NULL SELECT BILL_NO, TOTAL - INS_AMT - DISC AS PAY FROM BILL ORDER BY BILL_NO;- 20000, 35000, 10000
- 20000, 40000, 30000
- 20000, 0, 0
- 20000, NULL, NULL
13. VISIT 테이블에는 DEPT_CD(진료과), FEE(진료비) 컬럼이 있다. 다음 중 Oracle에서 오류 없이 실행되는 SQL은?
SELECT DEPT_CD AS D, SUM(FEE) AS TOT FROM VISIT GROUP BY DEPT_CD ORDER BY TOT DESC;SELECT DEPT_CD AS D, SUM(FEE) AS TOT FROM VISIT GROUP BY D;SELECT DEPT_CD, SUM(FEE) AS TOT FROM VISIT GROUP BY DEPT_CD HAVING TOT > 100000;SELECT FEE * 1.1 AS VAT_FEE FROM VISIT WHERE VAT_FEE > 10000;
14. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 결과는 A / B 순서)
SELECT SUBSTR('010-1234-5678', 1, INSTR('010-1234-5678', '-', -1)) || '****' AS A, LENGTH(REPLACE('010-1234-5678', '-')) AS B FROM DUAL;010-1234****/ 11010-1234-****/ 13010-1234-****/ 11010-****-5678/ 11
15. 다음 SQL의 실행 결과로 옳은 것은? (Oracle, 날짜는 YYYY-MM-DD 형식으로 표시되며 결과는 A / B / C 순서)
SELECT DATE '2025-03-03' - DATE '2025-02-27' AS A, ADD_MONTHS(DATE '2025-02-28', 1) AS B, TRUNC(DATE '2025-05-17', 'MM') AS C FROM DUAL;- 4 / 2025-03-28 / 2025-05-01
- 4 / 2025-03-31 / 2025-05-01
- 5 / 2025-03-31 / 2025-05-17
- 5 / 2025-03-28 / 2025-05-01
16. 다음 [RX] 테이블에 SQL을 실행했을 때 R 값을 RX_NO 순서대로 나열한 것으로 옳은 것은? (Oracle)
[RX]
RX_NO ROUTE DAYS 1 PO 3 2 IV NULL 3 NULL 10 4 IM 7 SELECT RX_NO, DECODE(ROUTE, 'PO', '경구', 'IV', '주사', NULL, '미정', '기타') || '/' || CASE WHEN DAYS >= 7 THEN 'L' WHEN DAYS < 7 THEN 'S' ELSE 'N' END AS R FROM RX ORDER BY RX_NO;- 경구/S, 주사/N, 기타/L, 기타/L
- 경구/S, 주사/S, 미정/L, 기타/L
- 경구/S, 주사/N, 미정/L, 기타/S
- 경구/S, 주사/N, 미정/L, 기타/L
17. 다음 [PATIENT] 테이블에 대해 (가)~(다) SQL을 실행했을 때 결과로 옳은 것은? (결과는 (가) / (나) / (다) 순서)
[PATIENT]
PID AGE P1 15 P2 20 P3 35 P4 40 P5 NULL P6 62 -- (가) SELECT COUNT(*) FROM PATIENT WHERE AGE BETWEEN 40 AND 20; -- (나) SELECT COUNT(*) FROM PATIENT WHERE AGE NOT BETWEEN 20 AND 40; -- (다) SELECT COUNT(*) FROM PATIENT WHERE AGE >= 20 AND AGE <= 40;- 0 / 2 / 3
- 3 / 2 / 3
- 0 / 3 / 3
- 3 / 3 / 3
18. 다음 [DIAG] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과로 옳은 것은? (대소문자를 구분하며, 결과는 (가) / (나) 순서)
[DIAG]
DX_CD J00 J06.9 J1 K29.7 J_20 -- (가) SELECT COUNT(*) FROM DIAG WHERE DX_CD LIKE 'J__%'; -- (나) SELECT COUNT(*) FROM DIAG WHERE DX_CD LIKE 'J\_%' ESCAPE '\';- 2 / 1
- 4 / 1
- 3 / 1
- 3 / 3
19. 다음 [VISIT] 테이블에 SQL을 실행한 결과로 옳은 것은? (결과는 (DOC, PC, AF) 순서)
[VISIT]
VID DOC PID FEE 1 D1 P1 100 2 D1 P1 200 3 D1 P2 NULL 4 D2 P3 300 5 D2 P3 300 6 D3 P4 500 7 D3 P5 100 8 D3 P6 NULL SELECT DOC, COUNT(DISTINCT PID) AS PC, AVG(FEE) AS AF FROM VISIT GROUP BY DOC HAVING COUNT(*) > COUNT(FEE) ORDER BY DOC;- (D1, 2, 100), (D3, 3, 200)
- (D1, 2, 150), (D3, 3, 300)
- (D1, 3, 150), (D3, 3, 300)
- (D1, 2, 150), (D2, 1, 300), (D3, 3, 300)
20. 다음 [RX] 테이블에 SQL을 실행한 결과에 대한 설명으로 옳은 것은?
[RX]
RX_NO DRUG_TYPE 1 A 2 NULL 3 B 4 NULL 5 A SELECT DRUG_TYPE, COUNT(*) AS C1, COUNT(DRUG_TYPE) AS C2 FROM RX GROUP BY DRUG_TYPE;- 결과는 2행이며, DRUG_TYPE이 NULL인 행은 그룹에 포함되지 않는다.
- 결과는 3행이며, DRUG_TYPE이 NULL인 그룹의 C1, C2는 각각 2, 2이다.
- 결과는 4행이며, NULL은 서로 같지 않으므로 NULL 행이 각각 별도의 그룹을 이룬다.
- 결과는 3행이며, DRUG_TYPE이 NULL인 그룹의 C1, C2는 각각 2, 0이다.
21. VISIT 테이블에는 VID, DEPT_CD, VISIT_DT 컬럼이 있다. 다음 중 Oracle에서 실행 시 오류가 발생하는 SQL은?
SELECT DISTINCT DEPT_CD FROM VISIT ORDER BY VISIT_DT;SELECT DEPT_CD FROM VISIT ORDER BY VISIT_DT;SELECT DEPT_CD, COUNT(*) FROM VISIT GROUP BY DEPT_CD ORDER BY COUNT(*) DESC;SELECT DEPT_CD FROM (SELECT DEPT_CD, VISIT_DT FROM VISIT) ORDER BY VISIT_DT;
22. 다음 [WAITING] 테이블에 SQL을 실행한 결과의 출력 순서로 옳은 것은? (Oracle, ARRIVE는 'HHMI' 형식의 문자열이다.)
[WAITING]
NAME PRIORITY ARRIVE 가 2 0910 나 NULL 0905 다 1 0920 라 2 0900 마 1 0915 SELECT NAME, PRIORITY, ARRIVE FROM WAITING ORDER BY 2, ARRIVE DESC;- 마, 다, 라, 가, 나
- 나, 다, 마, 가, 라
- 다, 마, 가, 라, 나
- 나, 마, 다, 라, 가
23. 다음 [PATIENT], [AGE_GRP] 테이블에 SQL을 실행한 결과로 옳은 것은?
[PATIENT]
PID AGE P1 5 P2 12 P3 19 P4 20 P5 70 [AGE_GRP]
GRP LO HI 소아 0 12 청소년 12 19 성인 20 64 SELECT G.GRP, COUNT(*) AS CNT FROM PATIENT P, AGE_GRP G WHERE P.AGE BETWEEN G.LO AND G.HI GROUP BY G.GRP;- 소아 1, 청소년 2, 성인 1
- 소아 2, 청소년 1, 성인 2
- 소아 2, 청소년 2, 성인 2
- 소아 2, 청소년 2, 성인 1
24. Oracle의
(+)기호를 이용한 외부 조인에 대한 설명으로 가장 적절하지 않은 것은?(+)는 조인 조건에서 데이터가 없어 NULL로 채워질 쪽 테이블의 컬럼에 붙인다.D.DOC_ID(+) = V.DOC_ID(+)처럼 양쪽 컬럼에 모두(+)를 붙이면 FULL OUTER JOIN이 된다.- 외부 조인 대상 테이블에 대한 일반 조건(예:
V.FEE > 0)에(+)를 붙이지 않으면 결과가 내부 조인과 같아질 수 있다. - FULL OUTER JOIN은
(+)로 직접 표현할 수 없으므로, 필요하면 ANSI의 FULL OUTER JOIN을 쓰거나 LEFT·RIGHT 외부 조인 결과를 UNION으로 합친다.
25. 다음 [PATIENT], [VISIT], [DOCTOR] 테이블에 SQL을 실행했을 때 결과 건수는?
[PATIENT]
PID PNAME P1 김 P2 이 P3 박 [VISIT]
VID PID DOC_ID V1 P1 D1 V2 P1 D9 V3 P2 D2 [DOCTOR]
DOC_ID DNAME D1 최 D2 정 SELECT P.PNAME, D.DNAME FROM PATIENT P LEFT OUTER JOIN VISIT V ON P.PID = V.PID INNER JOIN DOCTOR D ON V.DOC_ID = D.DOC_ID;- 2건
- 3건
- 4건
- 5건
26. 다음 [DOCTOR], [VISIT] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과로 옳은 것은? (두 테이블에서 이름이 같은 컬럼은 DOC_ID와 DEPT_CD이며, 결과는 (가) / (나) 순서)
[DOCTOR]
DOC_ID DNAME DEPT_CD D1 김 IM D2 이 GS D3 박 IM [VISIT]
VID DOC_ID DEPT_CD V1 D1 IM V2 D1 GS V3 D2 GS V4 D3 NULL V5 D4 IM -- (가) SELECT COUNT(*) FROM DOCTOR NATURAL JOIN VISIT; -- (나) SELECT COUNT(*) FROM DOCTOR JOIN VISIT USING (DOC_ID);- 2 / 2
- 4 / 4
- 2 / 4
- 3 / 4
27. 다음 [VISIT] 테이블에 SQL을 실행했을 때 결과 건수는? (VDATE는 DATE 타입이다.)
[VISIT]
VID PID VDATE 1 P1 2025-01-05 2 P1 2025-02-10 3 P1 2025-02-10 4 P2 2025-01-20 5 P3 2025-03-01 6 P3 2025-02-01 SELECT V.VID, V.PID FROM VISIT V WHERE V.VDATE = (SELECT MAX(X.VDATE) FROM VISIT X WHERE X.PID = V.PID);- 3건
- 4건
- 5건
- 단일 행 서브쿼리가 여러 행을 반환하여 오류가 발생한다.
28. DOCTOR 테이블에는 DOC_ID가 'D1', 'D2', 'D3', 'D4'인 4행이 있고, VISIT 테이블의 DOC_ID 값은 'D1', 'D1', 'D3', NULL의 4행이다. (가), (나) SQL의 결과로 옳은 것은? (결과는 (가) / (나) 순서)
-- (가) SELECT COUNT(*) FROM DOCTOR WHERE DOC_ID NOT IN (SELECT DOC_ID FROM VISIT); -- (나) SELECT COUNT(*) FROM DOCTOR D WHERE NOT EXISTS (SELECT 1 FROM VISIT V WHERE V.DOC_ID = D.DOC_ID);- 2 / 2
- 0 / 0
- 2 / 0
- 0 / 2
29. 다음 [OUT_DEPT], [IN_DEPT] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle, 결과는 (가) / (나) 순서)
[OUT_DEPT]
DEPT IM IM GS NULL [IN_DEPT]
DEPT GS NULL OS -- (가) SELECT DEPT FROM OUT_DEPT INTERSECT SELECT DEPT FROM IN_DEPT; -- (나) SELECT DEPT FROM OUT_DEPT MINUS SELECT DEPT FROM IN_DEPT;- 2 / 1
- 1 / 1
- 1 / 2
- 2 / 2
30. INPATIENT와 OUTPATIENT 테이블에는 모두 PID(숫자), PNAME(문자) 컬럼이 있다. 다음 중 Oracle에서 실행 시 오류가 발생하는 SQL은?
SELECT PID, PNAME FROM INPATIENT UNION SELECT PID, PNAME FROM OUTPATIENT ORDER BY PNAME;SELECT PID, PNAME FROM INPATIENT UNION SELECT PID, PNAME FROM OUTPATIENT ORDER BY 1 DESC;SELECT PID, PNAME FROM INPATIENT UNION SELECT PID AS ID, PNAME FROM OUTPATIENT ORDER BY ID;SELECT PID AS ID, PNAME FROM INPATIENT UNION SELECT PID, PNAME FROM OUTPATIENT ORDER BY ID;
31. 다음 [DEPT_STAT] 테이블에 SQL을 실행했을 때, 결과에서 DOC 값이 NULL로 출력되는 행의 수와 그중 G 값이 0인 행의 수로 옳은 것은? (결과는 NULL 행 수 / G = 0인 행 수 순서)
[DEPT_STAT]
DEPT DOC CNT IM D1 3 IM D2 2 GS D3 4 GS NULL 1 SELECT DEPT, DOC, SUM(CNT) AS S, GROUPING(DOC) AS G FROM DEPT_STAT GROUP BY ROLLUP(DEPT, DOC);- 3 / 0
- 4 / 0
- 3 / 1
- 4 / 1
32. 다음 [VISIT_G] 테이블에 SQL을 실행했을 때 결과 건수는?
[VISIT_G]
VID DEPT GENDER 1 IM M 2 IM F 3 GS M 4 OS F SELECT DEPT, GENDER, COUNT(*) AS CNT FROM VISIT_G GROUP BY CUBE(DEPT, GENDER) HAVING GROUPING(DEPT) = 0;- 4건
- 7건
- 9건
- 10건
33. 다음 [PAY_LOG] 테이블에 SQL을 실행했을 때 S 값을 출력 순서대로 나열한 것으로 옳은 것은?
[PAY_LOG]
PID SEQ FEE P1 1 100 P1 2 200 P1 3 300 P2 1 400 P2 2 500 SELECT PID, SEQ, SUM(FEE) OVER (PARTITION BY PID ORDER BY SEQ ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS S FROM PAY_LOG ORDER BY PID, SEQ;- 100, 300, 500, 400, 900
- 100, 300, 500, 700, 900
- 100, 300, 600, 400, 900
- 300, 500, 300, 900, 500
34. 응급실 환자의 위험도 점수가 [TRIAGE] 테이블에 저장되어 있다. 다음 SQL을 실행했을 때 RK 값을 NAME 순서(A~D)대로 나열한 것으로 옳은 것은? (Oracle)
[TRIAGE]
NAME RISK A 90 B NULL C 85 D 90 SELECT NAME, RANK() OVER (ORDER BY RISK DESC) AS RK FROM TRIAGE ORDER BY NAME;- 1, 4, 3, 1
- 1, NULL, 3, 1
- 2, 1, 4, 2
- 1, 4, 2, 1
35. 다음 [VISIT] 테이블에 SQL을 실행한 결과로 옳은 것은? (결과는 (PID, VID)를 출력 순서대로 표기, VDATE는 DATE 타입)
[VISIT]
VID PID VDATE V1 P1 2025-01-05 V2 P2 2025-01-07 V3 P1 2025-02-10 V4 P3 2025-02-11 V5 P2 2025-03-02 V6 P1 2025-03-15 SELECT PID, VID FROM (SELECT PID, VID, COUNT(*) OVER (PARTITION BY PID) AS CNT, ROW_NUMBER() OVER (PARTITION BY PID ORDER BY VDATE DESC) AS RN FROM VISIT) WHERE CNT >= 2 AND RN = 1 ORDER BY PID;- (P1, V1), (P2, V2)
- (P1, V6), (P2, V5), (P3, V4)
- (P1, V3), (P2, V5)
- (P1, V6), (P2, V5)
36. BILL 테이블(PNAME, FEE)에서 진료비(FEE)가 가장 높은 환자 3명을 조회하려 한다. FEE에는 NULL과 중복 값이 없다. 다음 중 의도한 결과를 얻지 못하는 SQL은? (Oracle 12c 이상 기준)
SELECT * FROM (SELECT PNAME, FEE FROM BILL ORDER BY FEE DESC) WHERE ROWNUM <= 3;SELECT PNAME, FEE FROM BILL WHERE ROWNUM <= 3 ORDER BY FEE DESC;SELECT PNAME, FEE FROM BILL ORDER BY FEE DESC FETCH FIRST 3 ROWS ONLY;SELECT PNAME, FEE FROM (SELECT PNAME, FEE, ROW_NUMBER() OVER (ORDER BY FEE DESC) AS RN FROM BILL) WHERE RN <= 3;
37. 다음 [BILL] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle, 출력 순서대로 표기)
[BILL]
PNAME FEE 김 300 이 NULL 박 500 최 400 SELECT PNAME FROM (SELECT PNAME FROM BILL ORDER BY FEE DESC) WHERE ROWNUM <= 2;- 이, 박
- 박, 최
- 박, 최, 김
- 김, 이
38. 다음 [DEPT_ORG] 테이블에 SQL을 실행했을 때, NAME이 '순환기내과'인 행의 LV 값과 전체 결과 건수로 옳은 것은? (Oracle 기준)
[DEPT_ORG]
ID PID NAME 1 NULL 병원 2 1 진료부 3 1 간호부 4 2 내과 5 2 외과 6 4 순환기내과 7 3 병동간호팀 SELECT NAME, LEVEL AS LV FROM DEPT_ORG START WITH ID = 2 CONNECT BY PRIOR ID = PID;- LV = 4, 4건
- LV = 4, 7건
- LV = 3, 4건
- LV = 3, 7건
39. 다음 [DEPT_ORG] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준)
[DEPT_ORG]
ID PID NAME 1 NULL 병원 2 1 진료부 3 1 간호부 4 2 내과 5 2 외과 6 4 순환기내과 7 3 병동간호팀 SELECT SYS_CONNECT_BY_PATH(NAME, '/') AS PATH FROM DEPT_ORG WHERE CONNECT_BY_ISLEAF = 1 START WITH NAME = '순환기내과' CONNECT BY PRIOR PID = ID;/병원/진료부/내과/순환기내과/순환기내과/병원/순환기내과/내과/진료부/병원
40. 다음 [VISIT_CNT] 테이블에 SQL을 실행한 결과로 옳은 것은? (Oracle 기준, (DOC, MON, TUE)를 출력 순서대로 표기)
[VISIT_CNT]
DOC DAY_CD CNT D1 MON 3 D1 TUE 2 D2 MON 4 D2 WED 5 D3 WED 1 SELECT * FROM VISIT_CNT PIVOT (SUM(CNT) FOR DAY_CD IN ('MON' AS MON, 'TUE' AS TUE)) ORDER BY DOC;- (D1, 3, 2), (D2, 4, NULL)
- (D1, 3, 2), (D2, 4, NULL), (D3, NULL, NULL)
- (D1, 3, 2), (D2, 4, 0), (D3, 0, 0)
- (D1, 3, 2), (D2, 9, NULL)
41. 다음 SQL의 실행 결과로 옳은 것은? (Oracle 기준)
SELECT REGEXP_SUBSTR('진단:J06.9,K29.7', '[A-Z][0-9]{2}(\.[0-9])?', 1, 2) AS DX FROM DUAL;K29.7K29J06.929.7
42. 다음 [PATIENT] 테이블에 대해 (가), (나) SQL을 실행했을 때 결과 건수로 옳은 것은? (Oracle 기준, 결과는 (가) / (나) 순서)
[PATIENT]
PID P0012 p0013 P013 P00145 PX012 -- (가) SELECT COUNT(*) FROM PATIENT WHERE REGEXP_LIKE(PID, '^P[0-9]{4}$'); -- (나) SELECT COUNT(*) FROM PATIENT WHERE REGEXP_LIKE(PID, '^P[0-9]{4}$', 'i');- 1 / 1
- 2 / 2
- 2 / 3
- 1 / 2
43. 약품 재고 테이블 DRUG_STOCK과 입출고 내역 테이블 DRUG_IN의 데이터가 다음과 같다. 아래 MERGE 문을 실행(Oracle)한 후
SELECT COUNT(*), SUM(QTY) FROM DRUG_STOCK;의 결과로 옳은 것은?[DRUG_STOCK]
DRUG_CD QTY A 10 B 5 C 8 [DRUG_IN]
DRUG_CD QTY A -10 B 3 D 0 E 7 MERGE INTO drug_stock t USING drug_in s ON (t.drug_cd = s.drug_cd) WHEN MATCHED THEN UPDATE SET t.qty = t.qty + s.qty DELETE WHERE t.qty = 0 WHEN NOT MATCHED THEN INSERT (drug_cd, qty) VALUES (s.drug_cd, s.qty) WHERE s.qty > 0;- 4, 23
- 5, 23
- 3, 23
- 3, 16
44. 병실 정보 테이블 ROOM의 데이터가 다음과 같다. 입력 실수로 BEDS(병상 수)와 USED(사용 병상 수)가 뒤바뀐 101호의 두 값을 서로 맞바꾸려고 아래 UPDATE 문을 실행했다. 실행 후 101호의 BEDS, USED 값으로 옳은 것은?
[ROOM]
ROOM_NO BEDS USED 101 4 2 102 2 2 UPDATE room SET beds = used, used = beds WHERE room_no = 101;- BEDS = 2, USED = 2
- BEDS = 2, USED = 4
- BEDS = 4, USED = 4
- BEDS = 4, USED = 2
45. VISIT 테이블(VID 컬럼)은 비어 있는 상태로 커밋되어 있다. Oracle에서 아래 문장을 순서대로 실행한 후
SELECT COUNT(*) FROM visit;의 결과는?INSERT INTO visit VALUES (1); SAVEPOINT a; INSERT INTO visit VALUES (2); COMMIT; INSERT INTO visit VALUES (3); SAVEPOINT b; DELETE FROM visit WHERE vid = 1; ROLLBACK TO b; INSERT INTO visit VALUES (4); ROLLBACK;- 2
- 3
- 4
- 1
46. SQL Server의 기본 설정(AUTO COMMIT)에서 아래 문장을 한 문장씩 실행했다. 오류가 발생한 문장이 있어도 다음 문장을 계속 실행했을 때, 최종적으로 T에 남아 있는 C 값은?
CREATE TABLE t (c INT PRIMARY KEY); INSERT INTO t VALUES (1); INSERT INTO t VALUES (1); INSERT INTO t VALUES (3); ROLLBACK;- 값이 없다 (빈 테이블)
- 1
- 1, 3
- 1, 1, 3
47. Oracle의 DDL에 대한 설명으로 가장 적절한 것은?
- 뷰의 정의를 바꾸려면
ALTER VIEW ... AS SELECT ...로 SELECT 문을 수정한다. - 인덱스는 많이 만들수록 조회뿐 아니라 INSERT·UPDATE·DELETE의 성능도 함께 좋아진다.
- 자식 테이블이 FK로 참조하고 있는 부모 테이블도
DROP TABLE 부모테이블;만으로 바로 삭제된다. ALTER TABLE ... MODIFY로 컬럼의 DEFAULT 값을 바꾸면 이후 입력되는 행부터 적용되며, 기존 행의 값은 바뀌지 않는다.
- 뷰의 정의를 바꾸려면
48. Oracle에서 아래와 같이 VITAL 테이블을 생성하고 INSERT 문 6개를 순서대로 실행했다. 오류가 발생한 문장은 무시하고 진행했을 때 VITAL 테이블에 저장된 행 수는?
CREATE TABLE vital ( pid VARCHAR2(5), seq NUMBER, temp NUMBER(3,1) CHECK (temp BETWEEN 30 AND 45), bed_no VARCHAR2(5) UNIQUE, CONSTRAINT vital_pk PRIMARY KEY (pid, seq) ); INSERT INTO vital VALUES ('P1', 1, 36.5, 'B1'); -- ① INSERT INTO vital VALUES ('P1', 2, NULL, NULL); -- ② INSERT INTO vital VALUES ('P2', 1, 46.0, 'B2'); -- ③ INSERT INTO vital VALUES ('P2', NULL, 37.0, 'B3'); -- ④ INSERT INTO vital VALUES ('P3', 1, 37.2, NULL); -- ⑤ INSERT INTO vital VALUES ('P1', 1, 36.8, 'B4'); -- ⑥- 2건
- 3건
- 4건
- 5건
49. DBA와 SCOTT가 아래 순서로 DCL을 실행한 뒤 KIM이 새로 접속했다. 이에 대한 설명으로 가장 적절한 것은? (Oracle, KIM은 CREATE SESSION 외에 다른 권한이 없었으며, R_NURSE는 KIM의 기본 롤로 활성화된다.)
-- DBA 실행 CREATE ROLE r_nurse; GRANT r_nurse TO kim; -- SCOTT 실행 GRANT SELECT ON scott.patient TO r_nurse; GRANT SELECT ON scott.patient TO kim; REVOKE SELECT ON scott.patient FROM kim;- KIM은 R_NURSE 롤을 통해 여전히 SCOTT.PATIENT를 조회할 수 있다.
- KIM에게서 SELECT 권한을 회수했으므로 KIM은 SCOTT.PATIENT를 조회할 수 없다.
- REVOKE를 실행하면 KIM에게 직접 준 권한과 롤을 통해 받은 권한이 함께 회수된다.
- 같은 권한이 롤에도 부여되어 있으므로 마지막 REVOKE 문은 오류가 발생한다.
50. KIM은 CREATE SESSION 권한과 SCOTT.PATIENT에 대한 SELECT 권한을 직접 부여받았다. KIM이 아래 문장으로 자신의 스키마에 뷰를 만들려 했지만 '권한이 불충분합니다' 오류가 발생했다. KIM이 뷰를 생성할 수 있도록 DBA가 실행해야 할 문장으로 가장 적절한 것은? (Oracle)
-- KIM 실행 CREATE VIEW v_patient AS SELECT pid, pname FROM scott.patient;GRANT CREATE VIEW ON scott.patient TO kim;GRANT SELECT ON scott.patient TO kim WITH GRANT OPTION;GRANT CREATE VIEW TO kim;GRANT CREATE SESSION TO kim WITH ADMIN OPTION;
AI가 SQLD 출제 범위를 바탕으로 새로 만든 예상 문제이며, 실제 기출문제가 아닙니다.