문제 90. 다음 중 계층형 질의문에 대한 설명으로 가장 부적절한 것은?
- SQL Server에서의 계층형 질의문은 CTE(Common Table Exprression)를
재귀 호출함으로써 계층 구조를 전개한다 - SQL Server엣서의 계층형 질의문은 앵커 멤버를 실행하여 기본 결과 집합을
만들고 이후 재귀 멤버를 지속적으로 실행한다 - 오라클의 계층형 질의문에서 WHERE 절은 모든 전개를 진행한 이후
필터 조건으로서 조건을 만족하는 데이터만을 추출하는데 활용된다 - 오라클의 계층형 질의문에서 PRIOR 자식 = 부모 형태로 사용하면
🍑 3번은 부적절한 설명을 하고 있다
오라클 계층형 질의 실행 순서는
1. START WITH
2. CONNECT BY
3. WHERE
근데 여기서 중요한 점은 WHERE 절은 계층 전개 후 필터링하지만,
조건에 따라 계층 구조가 끊길 수도 있다
즉, 단순히 모든 전개를 다 한 후 필터만 한다라고 이해하면 틀린 설명
WHERE 조건 때문에 일부 자식 노드가 제거되면서 계층이 왜곡될 수 있기 때문이다
정답 3번
문제91. 아래 [부서]와 [매출] 테이블에 대해서 SQL 문장을 실행하여 아래 [결과]와 같이 데이터가 추출되었다
다음 중 동일한 결과를 추출하는 SQL 문은?


이 문제는 계층형 질의 방향 + START WITH 기준 + PRIOR 방향을 묻는 문제이다
결과 테이블을 보면
💠일본지사(210)가 LVL1
💠그 위에 아시아지부(100)가 있음
💠아래에 121, 122가 있음
즉, 120을 기준으로 위 + 아래를 모두 조회한 구조
이게 의미하는 것
우리는 START WITH 부서코드 = '120'
위로 올라가고 (부모방향)
아래로 내려가야 함 (자식방향)
즉, 두 번의 CONNECT BY가 필요함 (UNION 사용)
🍑 CONNECT BY
부모-자식 관계를 따라가면서 트리 구조를 펼쳐주는 역할
즉, 이 행의 자식(또는 부모)은 누구인가?를 계속 반복해서 찾는 명령어
쉽게 말하면 일반 SELECT는 그냥 행을 조회하는 거고, CONNECT BY는
나무 구조를 따라가면서 쭉 펼쳐주는 기
1️⃣ START WITH → 시작 노드 지정
2️⃣ CONNECT BY → 부모-자식 관계 따라 내려감
3️⃣ 계속 반복
PRIOR가 핵심 : CONNECT BY에서 제일 중요한 건 PRIOR야.
PRIOR = "이전 행(부모)"
| 방향 | 공식 |
| 아래로 | CONNECT BY 상위코드 = PRIOR 코드 |
| 위로 | CONNECT BY PRIOR 상위코드 = 코드 |
그래서 정답은 1번
문제 92. 다음 중 SELF JOIN을 수행해야 할 경우로 가장 적절한 것은?
- 한 테이블 내에서 두 칼럼이 연관 관계가 있다
- 두 테이블에 연관된 칼럼은 없으나 JOIN을 해야 한다
- 두 테이블에 공통 칼럼이 존재하고 두 테이블이 연관 관계가 있다
- 한 테이블 내에서 연관된 칼럼은 없으나 JOIN을 해야 한다
🍑 SELF JOIN
같은 테이블을 자기 자신과 조인하는 것
따로 명령어가 있는 것이 아님
정답 1번
문제 93. 아래와 같이 일자별매출 테이블이 존재할 때 아래 결과처럼 일자별 누적매출액을 SQL로 구하려고 한다
WINDOW FUNCTION을 사용하지 않고 일자별 누적매출액을 구하는 SQL로 옳은 것은?

이 문제는 누적합(누적매출)을 윈도우 함수 없이 구하는 문제이다
누적합이란?
1일 → 1일 합
2일 → 1~2일 합
3일 → 1~3일 합
...
즉, 현재 날짜까지의 모든 이전 날짜를 더해야 한다
윈도우 함수 못 쓸 때 방법
1. 자기 자신과 조인(SELF JOIN)
2. 상관 서브쿼리
이 문제는 SELF JOIN으로 풀 수 있는지 묻는 것이다
정답은 3번
문제 94. 다음 중 아래의 SQL 수행 결과로 가장 적절한 것은?

정답 3
문제 95. 아래는 서브쿼리에 대한 설명이다
다음 중 올바른 것끼리 묶인 것은?
가) 서브쿼리는 단일 행 또는 복수행 비교 연산자와 함께 사용할 수 있다
나) 서브쿼리는 SELECT절 FROM 절 HAVING절 ORDER BY절 등에서 사용이 가능하다
다) 서브쿼리의 결과가 복수행 결과를 반환하는 경우에는 =, <=, => 등의 연산자와 함께 사용이 가능하다
라) 연관 서브쿼리는 서브쿼리가 메인쿼리 컬럼을 포함하고 있는 형태이다
마) 다중 컬럼 서브쿼리는 서브쿼리의 결과로 여러 개의 컬럼이 반환되어 메인쿼리의 조건과 동시에
비교되는 것을 의미하며 Oracle 및 SQL Server 등의 DBMS에서 사용할 수 있다
문제 풀이
🔹 서브쿼리는 단일 행 또는 복수행 비교 연산자와 함께 사용할 수 있다 ✅
단일행 서브쿼리 ➡ =, <, <, <=, <=
복수행 서브쿼리 ➡ IN, ANY, ALL, EXISTS
둘 다 사용 가능
🔹 서브쿼리는 SELECT 절 FROM 절 HAVING 절 ORDER BY절 등에서 사용이 가능하다 ✅
SELECT, FROM, WHERE, HAVING ➡ 가능
ORDER BY ➡ 사용은 가능하지만 제한적
🔹 서브쿼리의 결과가 복수행 결과를 반환하는 경우에는 =, <=, => 등의 연산자와 함께 사용이 가능하다 ❌
복수행 결과인데 = 같은 단일행 연산자 사용시 에러 발생
ex) WHERE 급여 = (SELECT 급여 FROM 직원)
서브쿼리 결과가 여러 행이면 ORA-01427 에러 발생
복수행일 때는 IN, ANY, ALL을 사용해야 한다
🔹 연관 서브쿼리는 서브쿼리가 메인쿼리를 포함하고 있는 형태이다 ✅
SELECT *
FROM 직원 A
WHERE 급여 > (
SELECT ANG(근여)
FROM 직원 B
WHERE A.부서번호 = B.부서번호
);
서브쿼리 안에 A.부서번호(메인쿼리 컬럼) 사용 ➡ 이게 연관 서브쿼리
🔹 다중 컬럼 서브쿼리는 서브쿼리의 결과로 여러 개의 컬럼이 반환되어 메인쿼리의 조건과 동시에
비교되는 것을 의미하며 Oracle 및 SQL Server 등의 DBMS에서 사용할 수 있다 ❌
WHERE (부서번호, 직급) IN (
SELECT 부서번호, 직급
FROM 직원
);
여러 컬럼을 동시에 비교
Oracle → 지원
SQL Server ➡ 직접적인 튜플 비교 미지원
SQL Server에서는 이렇게 못 씀
정답은 가, 나, 라
문제 96. 아래 테이블은 어느 회사의 사원들과 이들이 부양하는 가족에 대한 것으로 밑줄친 컬럼은 기본키(Primary Key)를 표시한 것이다. 다음중 현재 부양하는 가족들이 없는 사원들의 이름을 구하라는 질의에 대한 아래 SQL 문장의 (ㄱ) (ㄴ)에 들어갈 내용으로 가장 적절한 것은?


🍑 EXISTS
서브쿼리의 결과가 존재하면 TRUE
결과가 1건이라도 있으면 TRUE
결과가 없으면 FALSE
값이 뭔지는 중요하지 않음! 존재 여부만 체크
현재 부양하는 가족들이 없는 사원들의 이름을 구하라를 구현하는 방법은 가족 테이블에 부양사번이 없는 사원 이름을
사원 테이블에서 추출하면 되고, SQL 문장으로
▪ NOT EXISTS
▪ NOT IN
▪ LEFT OUTER JOIN
문제 97. 다음중 아래의 ERD를 참조하여 아래 SQL과 동일한 결과를 출력하는 SQL로 가장 부적절한 것은?

보기의 SQL문에서는 "동의여부가 N인 항목이 1건 이상 있는 회원 조회"를 하고 있다
① EXISTS 사용
WHERE EXISTS (
SELECT 1
FROM 동의항목 B
WHERE A.회원번호 = B.회원번호
AND B.동의여부 = 'N'
)
동의여부 N이 존재하면 출력 ✅ 원래 쿼리와 동일
② IN 사용
WHERE A.회원번호 IN (
SELECT B.회원번호
FROM 동의항목 B
WHERE B.동의여부 = 'N'
)
동의여부 N인 회원번호 집합 ✅ 원래 쿼리와 동일
③ COUNT 서브쿼리 (⚠ 핵심)
WHERE 0 < (
SELECT COUNT(*)
FROM 동의항목 B
WHERE B.동의여부 = 'N'
)
문제점 : 이 서브쿼리에는 A.회원번호 = B.회원번호 조건이 없음!
즉, 전체 테이블에서 N이 1건이라도 있으면 모든 회원이 다 조회됨
원래 의도는 회원별로 N이 있는지 봐야 하는데 이건 전체 테이블 기준임
④ GROUP BY 사용
FROM 회원 A, 동의항목 B
WHERE A.회원번호 = B.회원번호
AND B.동의여부 = 'N'
GROUP BY A.회원번호, A.회원명
조인 후 N만 필터
GROUP BY로 중복 제거
✅ 동일 결과
정답 3번
문제 98. 아래의 데이터 모델을 기준으로 SQL을 작성하였다
다음중 아래의 SQL에 대해 가장 바르게 설명한 것은?


정답 3번
문제 99. 다음 중 서브쿼리에 대한 설명으로 가장 적절한 것은?
- 단일 행 서브쿼리는 서브쿼리의 실행 결과가 항상 한 건 이하인 서브쿼리로서 IN, ALL 등의 비교 연산자를 사용하여야 한다
- 다중행 서브쿼리 비교 연산자는 단일 행 서브쿼리의 비교 연산자로도 사용할 수 있다
- 연관 서브쿼리는 주로 메인쿼리에 값을 제공하기 위한 목적으로 사용한다
- 서브 쿼리는 항상 메인쿼리에서 얽혀진 데이터에 대해 서브쿼리에서 해당 조건이 만족하는지를 확인하는 방식으로 수행된다
문제 풀이
① 단일 행 서브쿼리는 실행 결과가 항상 한 건 이하이며 IN, ALL 등의 비교 연산자를 사용하여야 한다 ❌
단일행 서브쿼리는 =, <, >, <=, >= 같은 단일행 비교 연산자 사용
IN, ALL은 다중행 비교 연산자
② 다중행 서브쿼리 비교 연산자는 단일 행 서브쿼리의 비교 연산자로도 사용할 수 있다 ✅
Ex) WHERE 급여 IN (SELECT 급여 FROM 직원 WHERE 직원 번호 = 100)
이런식으로 서브쿼리가 1건만 반환해도 IN은 사용 가능함
다중행 연산자(IN, ANY, ALL)는 결과가 한 건이어도 문제 없음
③연관 서브쿼리는 주로 메인쿼리에 값을 제공하기 위한 목적으로 사용한다 ❌
연관 서브쿼리는 메인 쿼리의 각 행에 대해 조건을 검사하기 위해 사용
④ 서브쿼리는 항상 메인쿼리에서 얽혀진 데이터에 대해 조건이 만족하는지를 확인하는 방식으로 수행된다 ❌
비연관 서브쿼리는 한 번만 실행됨 항상 메인쿼리와 얽혀서 실행되는건 아님 "항상"이라는 표현이 오답
문제 100. 다음중 아래 SQL에 대한 설명으로 가장 부적절한 것은?

먼저 SQL 구조 분석
SELECT B.사원번호, B.사원명, A.부서번호, A.부서명
(SELECT COUNT(*)
FROM 부양가족 Y
WHERE Y.사원번호 = B.사원번호) AS 부양가족수
SELECT 절 안에 서브쿼리 있음 ➡ 스칼라 서브쿼리 (단일행 연관 서브쿼리)
FROM 부서 A
(SELECT *
FROM 사원
WHERE 입사년도 = '2014') B
FROM절 서브쿼리 Inline View
AND EXISTS (
SELECT 1
FROM 사원 X
WHERE X.부서번호 = A.부서번호
);
WHERE절 EXISTS ➡ 다중행 연관 서브쿼리
이제 문제의 보기를 보면
① 다중 행 연관 서브쿼리, 단일 행 연관 서브쿼리, Inline View가 사용되었다. ✅
② SELECT절에 사용된 서브쿼리는 스칼라 서브쿼리이며 JOIN으로 동일 결과 가능 ✅
③ WHERE절 서브쿼리에 사원 테이블 검색 조건으로 입사년도 조건을 FROM절 서브쿼리와 동일하게 추가해야 원하는 결과를 추출할 수 있다. ❌
WHERE절 EXISTS는 단순히 그 부서에 사원이 존재하는지만 확인
입사년도 조건은 이미 FROM절의 B에서 처리됨
WHERE절 EXISTS에 입사년도 조건을 추가할 필요 없음
④FROM절의 서브쿼리는 동적 뷰(Dynamic View)라고도 하며, 테이블 명이 올 수 있는 곳에 사용 가능 ✅
정답 3번
'🍏 개발일기' 카테고리의 다른 글
| 스마트스토어센터 Oracle에서 MySQL로의 무중단 전환기를 읽으며... (0) | 2026.02.17 |
|---|---|
| AWS 계정 삭제하는 방법 (0) | 2026.02.15 |
| DB 파티셔닝(Partitioning)이란? (0) | 2026.02.12 |
| private SqlSession sqlSession; 에 대해 분석해보았습니다 (0) | 2026.02.12 |
| 코드 분석 : 글 1번 클릭했을 때 전체 흐름 (0) | 2026.02.10 |