🐢 꼬부기 LV.1 | 개념•기초/💧물대포(핵심개념)

SQL 자격검정 실전문제 과목 2 문제풀이 51~65

서화 2026. 2. 16. 23:24

정답 2번

이문제는 GROUP BY 뒤에 오는것을 보면 되는데 1,3,4 번은 모두 COL1별 합계값고 전체 합계 값을 구하는 SQL문이지만 2번은 COL별 합계 값만을 구하는 SQL문으로 결과의 건수가 달라진다 여기서 CUBE와 ROLLUP은 함수의 인자가 2개 이상일때 결과가 다를수 있지만 1개일때는 동일하다

  • UNION ALL: 집계 쿼리를 여러 개 만들어 붙이는 수동 방식
  • GROUPING SETS: 집계 레벨을 내가 목록으로 지정 (() 넣으면 총계)
  • ROLLUP: 계층형 소계→총계를 자동 생성
  • CUBE: 모든 조합의 소계/총계를 자동 생성

정답 4번

집합연산자를 사용하면 ORDER BY절은 최종결과를 정렬하며 가장 마지막 줄에 한번만 사용할수 있다

집합(SET) 연산자 종류

  • UNION : 합집합(중복 제거)
  • UNION ALL : 합집합(중복 유지)
  • INTERSECT : 교집합
  • EXCEPT / MINUS : 차집합(앞 - 뒤),A에는 있고 B에는 없는 행만 남김

JOIN과 차이점

  • JOIN: 옆으로 합침(열 늘어남)
  • SET 연산자: 아래로 합침(행 늘어남)

 

정답 2번

수행한 SQL은 이용된 적이 있었던 서비스를 추출하는 SQL이다.

  1. 이용된 적이 있었던 서비스를 추출하는 것은 같으나 서비스와 서비스이용은 1대 다의 관계이므로 서비스이용건수만큼 추출되므로 전체 결과가 다르다. GROUP BY를 수행하면 동일한 결과를 출력할 수 있다
  2. 전체 서비스에서 이용된 적이 있었던 서비스를 MINUS(차집합)하였으므로 이용된 적이 없었던 서비스가 서브쿼리에서 추출된다. 그러므로 NOT EXISTS 구문을 적용하면 이용된 적이 있었던 서비스가 출력 된다
  3. 서비스를 기준으로 OUTER JOIN을 수행하였으므로, 이용된 적이 없었던 서비스만 출력된다. B. 서비스ID IS NOT NULL로 변경해야 동일한 결과가 출력된다
  4. 서비스와 서비스이용 테이블의 순서를 변경하고 IN 절을 NOT IN으로 변경하면 동일한 결과를 출력할 수 있다

정답 1번

집합연산자는 SQL에서 위에 정의된 연산자가 먼저 수행된다 그러므로 UNION이 나중에 수행된다

쿼리는 괄호가 없어서 보통 왼쪽부터 순서대로 계산된다고 보면 된다

즉, 아래처럼 처리된다

  1. (TBL1 UNION ALL TBL2)
  2. 그 결과에 다시 UNION TBL1

결과적으로 중복데이터가 모두 제거되어 1번과 같은 결과가 나온다 만일 UNION과 UNION ALL의 순서를 바꾼다면 2와 같은 결과가 나온다

정답 2번

이 문제는 “등급 + 직무” 기준으로 집계하는데, GROUP BY를 어떻게 주느냐에 따라 소계/총계 행이 추가된다

결과에 JOB = NULL 행이 등급별로 반복되므로 직무를 접어서 등급 소계를 만든 ROLLUP 결과로, 전체 총계까지 포함하는 형태로 보아 정답은 ROLLUP(grade, job)이다 (총계 행을 빼고 등급 소계만 원하면 grade, ROLLUP(job)을 쓴다)

정답 4번

1,2,3번은 결과값으로 동일한 값이 추출되지만 4번의 경우 부서급여합의 결과가 다른 보기 와 다르게 집계되기 때문에 결과값이 다르게 출력된다
4번만 SUM() OVER (PARTITION BY … ORDER BY …) 때문에 부서급여합이 ‘부서 전체 합’이 아니라 ‘누적합’으로 계산되어 급여비중이 1.00 같은 값이 나와서 결과와 다르다

정답 3번

이문제는 회원기본정보 ↔ 회원상세정보는 1:1이고, 둘 다 “반드시 존재”한다. 즉, 회원ID 집합이 두 테이블에서 완전히 똑같다.

1:1 양쪽 필수면 두 테이블의 회원ID는 항상 동일한 집합이라서

  • EXCEPT사용시 그런 회원은 존재할수 없어서 항상 0건,
  • UNION은 중복제거후 합치기 때문에 N건, UNION ALL은 중복제거를 안하기때문에 2N건,
  • INTERSECT와 UNION 결과는 동일하다

따라서 정답이 3번이 되는것이다

정답 4번

오라클 계층형 질의는 START WITH로 시작점을 정하고 CONNECT BY로 부모-자식 연결을 따라가며 트리(조직도/카테고리/댓글)를 조회하는 SQL이다

문제를 쉽게 이해해보자면 

 

  • START WITH 절 → “트리 탐색을 어디서 시작할지(루트가 누구인지) 정하는 것” 
  • ORDER SIBLINGS BY 절 → “같은 부모 밑에 있는 형제 노드들끼리 정렬하는 것” (부모가 같으면 형제임)
  • 순방향 전개 → “부모 → 자식 방향으로 내려가며 찾는 것” (반대는 자식 → 부모로 올라감)
  • 루트 노드의 LEVEL 값은 0이다 → 오라클은 1부터 시작하므로 틀린 설명이다

따라서 정답은 4번이 되는것이다

오라클 계층형 질의 기본 문법

 
SELECT 컬럼들, LEVEL
FROM 테이블
START WITH 루트조건
CONNECT BY PRIOR 부모컬럼 = 자식컬럼;

각 문장 의미

  • START WITH: “어디서 시작할래?” (루트 노드 지정)
  • CONNECT BY: “부모-자식 연결 규칙이 뭐야?”
  • PRIOR: “부모 쪽 행”을 가리키는 키워드
  • LEVEL: 트리 깊이(루트=1, 자식=2, 손자=3…)

 

정답 1번

START WITH 매니저사원번호 IS NULL 를 보면 상사가 없는 사람이 루트이다 따라서 상사가 없는 001과 005를 포함해야한다

CONNECT BY PRIOR 사원번호 = 매니저사원번호
AND 입사일자 BETWEEN '2013-01-01' AND '2013-12-31'

PRIOR 사원번호 = 매니저사원번호 → “부모(상사)의 사원번호 = 자식(부하)의 매니저사원번호”로 연결

AND 입사일자 BETWEEN ... → ‘연결될 자식(부하) 행’이 2013년에 입사한 경우만 연결하겠다는 뜻이다

📌 중요한 이유: 날짜조건이 WHERE 절이 아니라 CONNECT BY 절 안에 있다.
→ 그래서 루트(001, 005)는 날짜조건과 상관없이 포함되고,
자식으로 내려갈 때만 2013 입사자인지 체크한다.

따라서 결과가 001과 001의 자식이면서 2013년 입사인 003,004와 상사가 없는 005가 출력되므로 정답이 1번이 된다

정답 4번

오라클 계층형 질의문에서 PRIOR 키워드는 SELECT, WHERE 절에서도 사용할 수 있다

정답 3번

주어진 SQL 및 1, 2, 4번의 SQL문의 경우, 각 테이블의 NO칼럼 값이 같은 행만 조인에 성공하여 1건의 결과가 나오지만, 3번 SQL의 경우 M*N 건의 결과가 나오게 되므로 2건이 된다.

✔️NATURAL JOIN은 두 테이블에서 이름이 같은 컬럼을 자동으로 찾아 그 컬럼들로 = 조인을 수행하는 방식이며, 편하지만 컬럼명이 겹치면 의도치 않은 조인이 될 수 있어 주의가 필요하다.