BLUE TRACK CERTIFICATION SYSTEM·시험 직전 핵심 요약 노트

SQLD 시험 직전 헷갈리는 핵심 포인트 30선

1·2과목 단골 함정 포인트 30선과 대표 실전 확인 문제, 빈칸 채우기 워크시트를 A4로 인쇄하여 학습할 수 있습니다.

POINT 011과목 · 데이터모델의이해

3단계 스키마와 데이터 독립성 (논리적 vs 물리적)

최빈출 ★★★
쉬운 비유 & 직관적 이해

집을 리모델링할 때 '방 구조도(개념 스키마)'를 바꿨는지, '보일러 배관·바닥재(내부 스키마)'만 바꿨는지 구분하는 것과 같습니다.

시험장 단골 오답 함정

지문에 '테이블 파티션 변경', '인덱스(Index) 추가'가 나왔을 때 테이블이라는 단어만 보고 논리적 독립성으로 착각합니다.

🔄 3단계 스키마 아키텍처 및 데이터 독립성 연결 구조
외부 스키마 (External)
개별 사용자 관점 (View / 화면)
다수 존재
개념 스키마 (Conceptual)
조직 전체 통합 관점 (설계도)
논리적 독립성 ↔ 외부
내부 스키마 (Internal)
물리적 저장장치 관점 (인덱스/파티션)
물리적 독립성 ↔ 개념
시험장 1초 판별 공식 (핵심 정리)
  • 1
    논리적 독립성: 개념 스키마(테이블 분리/통합, 컬럼 추가, 관계 변경)가 바뀌어도 외부 스키마(사용자 View, 응용프로그램)는 영향을 받지 않음.
  • 2
    물리적 독립성: 내부 스키마(인덱스 생성, 파티션 변경, 디스크/파일 저장구조 변경)가 바뀌어도 개념·외부 스키마는 영향을 받지 않음.
  • 3
    3단계 스키마 중 조직 전체의 통합된 데이터 구조를 정의한 설계도는 단 하나뿐인 개념 스키마이다.
📋 논리적 독립성 vs 물리적 독립성 시험장 1초 판별표
구분무엇을 변경했는가? (문제 지문 키워드)영향을 받지 않는 곳정답 판정
논리적 독립성테이블 분리/통합, 컬럼(속성) 추가·변경, 정규화사용자 View(외부 스키마), 응용프로그램논리적 데이터 독립성
물리적 독립성인덱스(Index) 생성/삭제, 파티션 키 변경, 저장공간 변경개념 스키마(테이블 구조) 및 외부 스키마물리적 데이터 독립성
대표 실전 확인 문제 (Q.01)

Q. 쇼핑몰 DB에서 조회 성능을 높이기 위해 ORDERS(주문) 테이블에 주문일자 인덱스를 신설하고 월별 범위 파티셔닝을 적용하였다. 이때 기존 주문내역 조회 화면(View)과 응용프로그램의 SQL은 전혀 수정하지 않고 그대로 사용할 수 있었다. 이와 관련된 데이터 독립성과 변경된 스키마의 연결로 가장 올바른 것은?

  1. 1논리적 데이터 독립성 — 개념 스키마 변경
  2. 2논리적 데이터 독립성 — 내부 스키마 변경
  3. 3물리적 데이터 독립성 — 개념 스키마 변경
  4. 4물리적 데이터 독립성 — 내부 스키마 변경
POINT 021과목 · 엔터티

엔터티(Entity)의 성립 조건과 발생 시점별 분류

최빈출 ★★★
쉬운 비유 & 직관적 이해

출석부 표(엔터티)를 만들 때 학생(인스턴스)이 최소 2명 이상, 기록할 항목(속성: 학번, 이름)도 최소 2개 이상이어야 명단이 성립합니다.

시험장 단골 오답 함정

'엔터티는 1개 이상의 인스턴스와 1개 이상의 속성을 가진다'는 선지를 무심코 맞는 설명(O)으로 고릅니다.

🔄 발생 시점(Time)에 따른 엔터티 흐름도
① 기본 엔터티 (Fundamental)
사원 · 부서 · 고객 · 상품
독립 생성
② 중심 엔터티 (Main)
주문 · 계약 · 청구 · 계좌
업무 중심
③ 행위 엔터티 (Active)
주문상세 · 결제이력 · 로그
지속 누적
시험장 1초 판별 공식 (핵심 정리)
  • 1
    엔터티는 반드시 2개 이상의 인스턴스(행)와 2개 이상의 속성(열)을 가져야 한다 (단, 연관 엔터티는 식별자만 가질 수 있음).
  • 2
    기본 엔터티(키 엔터티): 원래 업무에 독립적으로 존재하는 엔터티 (예: 사원, 부서, 고객, 상품).
  • 3
    중심 엔터티: 기본 엔터티로부터 발생하여 업무의 중심 역할을 하는 엔터티 (예: 주문, 계약, 청구, 계좌).
  • 4
    행위 엔터티: 2개 이상 엔터티 간 행위로 자주 발생하며 데이터양이 가장 많은 엔터티 (예: 주문목록, 결제이력, 접속로그).
📋 엔터티 필수 성립 조건 O / X 비교
검증 항목시험 합격 기준 (O)수험생 단골 오답 함정 (X)
인스턴스 개수반드시 2개 이상의 인스턴스가 존재해야 함1개 이상의 인스턴스가 있으면 된다 (X)
속성 개수반드시 2개 이상의 속성을 가져야 함속성이 1개만 있어도 일반 엔터티가 된다 (X)
관계 유무최소 1개 이상의 다른 엔터티와 관계가 있어야 함 (통계/코드 엔터티 예외)관계 유무는 엔터티와 무관하다 (X)
대표 실전 확인 문제 (Q.02)

Q. 다음 중 데이터 모델링에서 엔터티(Entity)의 성립 조건과 발생 시점에 따른 분류 설명으로 옳지 않은 것은?

  1. 1엔터티는 업무에서 관리해야 하는 집합이므로 반드시 2개 이상의 인스턴스와 2개 이상의 속성을 가져야 한다 (단, 연관 엔터티 예외).
  2. 2사원, 부서, 고객, 상품처럼 원래 업무에 독립적으로 존재하는 엔터티를 기본 엔터티(Key Entity)라 한다.
  3. 3주문내역, 결제이력, 접속로그처럼 2개 이상의 엔터티로부터 행위를 통해 자주 발생하는 엔터티를 중심 엔터티(Main Entity)라 한다.
  4. 4기본 엔터티로부터 발생하고 업무에서 중심적인 역할을 수행하는 주문, 계약, 청구 등은 중심 엔터티에 해당한다.
POINT 031과목 · 속성

속성(Attribute)의 분류 (기본 / 설계 / 파생) & 도메인

빈출 ★★☆
쉬운 비유 & 직관적 이해

장바구니에서 '원래 상품가격'은 기본 속성, 관리하려고 붙인 '상품코드(P001)'는 설계 속성, 수량×단가로 계산한 '예상총액'은 파생 속성입니다.

시험장 단골 오답 함정

주문 시점의 단가·할인율로 확정되어 이후 정책이 바뀌어도 변하면 안 되는 '확정결제금액'까지 단순 파생 속성으로 혼동합니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    각 속성이 가질 수 있는 값의 범위(데이터 타입, 크기, 제약조건)를 도메인(Domain)이라 한다.
  • 2
    기본 속성(Basic): 업무 분석을 통해 바로 추출된 본래 속성 (예: 이름, 입사일, 원금).
  • 3
    설계 속성(Designed): 데이터 모델링/관리를 위해 새로 부여한 코드나 번호 (예: 상품코드, 지점코드, 주문번호).
  • 4
    파생 속성(Derived): 다른 속성으로부터 계산·가공되는 속성 (예: 총합계, 평균평점, 현재재고). 데이터 정합성을 위해 가급적 적게 정의해야 한다.
📋 특성에 따른 속성 3분류 비교표
분류핵심 정의대표 키워드 / 예시설계 시 주의점
기본 속성업무로부터 직접 추출된 원래 속성사원명, 입사일, 원금, 가격가장 많은 비중을 차지함
설계 속성관리를 위해 인위적으로 부여한 속성~코드(부서코드), ~번호(학번, 일련번호)식별자 및 코드화 목적
파생 속성다른 속성을 계산하여 얻어지는 속성총주문액, 평균급여, 이자계산액정합성 유지를 위해 최소화 권장
대표 실전 확인 문제 (Q.03)

Q. 온라인 서점의 [도서주문] 엔터티를 설계하면서 ① 도서원가, ② 관리를 위해 부여한 도서분류코드, ③ 실시간 주문수량과 단가를 곱해 화면에 보여주는 예상결제총액 속성을 도출하였다. ①, ②, ③ 속성의 특성에 따른 분류가 순서대로 바르게 짝지어진 것은?

  1. 1① 기본 속성 - ② 설계 속성 - ③ 파생 속성
  2. 2① 기본 속성 - ② 파생 속성 - ③ 설계 속성
  3. 3① 설계 속성 - ② 기본 속성 - ③ 파생 속성
  4. 4① 설계 속성 - ② 파생 속성 - ③ 기본 속성
POINT 041과목 · 관계

관계 표기법 (IE vs Barker) 완벽 해독법

최빈출 ★★★
쉬운 비유 & 직관적 이해

IE 표기법과 Barker 표기법은 똑같은 실선/점선을 전혀 다른 뜻으로 사용하므로, 통역 규칙을 정확히 알아야 합니다.

시험장 단골 오답 함정

IE 표기법에서는 실선/점선이 '식별/비식별'인데, Barker 표기법에서도 실선/점선을 식별/비식별로 읽어서 틀립니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    IE 표기법: 관계선의 실선은 식별자 관계, 점선은 비식별자 관계를 뜻하며, 끝 기호 |는 필수(1), O는 선택(0), 까마귀발(<)은 다수(N)를 뜻한다.
  • 2
    Barker 표기법: 관계선 자체를 반으로 나누어 실선은 필수 참여, 점선은 선택 참여를 뜻하며, 주식별자 상속 여부는 수직선인 UID 바(|)로 표시한다.
  • 3
    Barker 엔터티 내부 기호: #은 주식별자(PK), *는 필수 속성(NOT NULL), o는 선택 속성(NULL 허용)이다.
📋 IE 표기법 vs Barker 표기법 1:1 대조표
비교 항목IE (Information Engineering) 표기법Barker (바커) 표기법시험장 핵심 주의사항
실선 vs 점선 의미실선 = 식별자 관계 / 점선 = 비식별자 관계실선 = 필수 참여(1) / 점선 = 선택 참여(0)실선·점선의 의미가 두 표기법에서 완전히 다름!
필수 / 선택 표기선 끝에 '|' (필수) vs 'O' (선택)선 자체의 실선(필수) vs 점선(선택)상대방 엔터티 앞에 그려진 기호를 읽어야 함
주식별자(PK) 표기엔터티 상단 박스에 분리 표기속성명 앞에 '#' 표기 + 관계선에 UID 바(|)Barker 기호: #(PK), *(필수), o(선택)
대표 실전 확인 문제 (Q.04)

Q. '한 명의 고객은 주문을 한 번도 하지 않거나 여러 번 주문할 수 있고, 하나의 주문은 반드시 단 한 명의 고객에 의해서만 발생한다'는 업무 규칙을 ERD로 표현할 때, IE 표기법과 Barker 표기법의 설명으로 옳은 것은?

  1. 1IE 표기법에서는 선택 참여(0)를 표현하기 위해 고객과 주문 사이의 관계선을 점선으로 그린다.
  2. 2IE 표기법에서는 주문 엔터티 쪽 끝에는 'O'와 까마귀발(<)을, 고객 엔터티 쪽 끝에는 '|' 기호를 표기한다.
  3. 3Barker 표기법에서는 필수/선택 참여 여부를 선 끝의 'O' 기호 유무로 구분한다.
  4. 4Barker 표기법에서 선택 속성은 속성명 앞에 '*' 기호를 붙여 표기한다.
POINT 051과목 · 식별자

후보키 최소성 함정 & 주식별자 4대 특징

최빈출 ★★★
쉬운 비유 & 직관적 이해

혼자서도 문을 열 수 있는 열쇠(A)에 불필요한 열쇠고리(B)를 달아놓은 (A, B)는 다이어트(최소성)를 못 했으므로 후보키가 아니라 슈퍼키입니다.

시험장 단골 오답 함정

A만으로도 모든 튜플이 유일하게 식별되는데, (A, B)도 유일하게 식별되니 둘 다 후보키(Candidate Key)라고 착각합니다.

🔄 키(Key)의 최소성 검증 및 분류 단계
슈퍼키 (Super Key)
유일성 O / 최소성 X — 예: (사번, 이름)
군더더기 포함
후보키 (Candidate Key)
유일성 O + 최소성 O — 예: 사번, 주민번호
다이어트 완료
주식별자 (Primary Key)
후보키 중 대표 선정 1개 — 예: 사번 (NOT NULL)
4대 특징 충족
시험장 1초 판별 공식 (핵심 정리)
  • 1
    슈퍼키(Super Key): 유일성은 만족하지만 최소성은 만족하지 못하는 키 (예: 사번 혼자 PK인데 (사번, 이름)으로 묶은 키).
  • 2
    후보키(Candidate Key): 유일성과 최소성을 모두 만족하는 키. 이 중 대표로 선정된 것이 기본키(PK), 나머지가 대체키(보조식별자)이다.
  • 3
    주식별자 4대 특징: 유일성, 최소성, 불변성, 존재성(절대 NOT NULL).
📋 테이블 R(A, B, C)에서 후보키 판별 예시 (A값: 10, 20, 30 / B값: 가, 가, 나)
키 조합유일성 (중복 없음)최소성 (군더더기 없음)최종 판정
A 단독O (10, 20, 30 모두 다름)O (단일 컬럼)후보키 (Candidate Key) ⭕
(A, B) 복합O (조합 시 모두 다름)X (B를 빼도 A 혼자 식별 가능!)슈퍼키 (후보키 아님!) ❌
(B, C) 복합X (중복 발생 가능 시)X식별자 불가 ❌
대표 실전 확인 문제 (Q.05)

Q. 릴레이션 R(학번, 주민번호, 이름, 학과)에서 '학번'과 '주민번호'는 각각 모든 학생 인스턴스를 유일하게 식별할 수 있으며 NULL 값을 허용하지 않는다. 다음 중 후보키(Candidate Key)와 슈퍼키(Super Key)에 대한 설명으로 옳은 것은?

  1. 1(학번, 이름) 조합은 모든 행을 유일하게 식별하므로 후보키(Candidate Key)이다.
  2. 2(학번, 주민번호) 조합은 유일성과 최소성을 모두 만족하므로 후보키이다.
  3. 3후보키는 '학번'과 '주민번호' 각각 2개뿐이며, (학번, 이름)은 최소성을 만족하지 못하는 슈퍼키이다.
  4. 4학번을 기본키(PK)로 선정하면 주민번호는 슈퍼키에서 제외된다.
POINT 061과목 · 식별자

식별자 관계(실선) vs 비식별자 관계(점선)

빈출 ★★☆
쉬운 비유 & 직관적 이해

부모의 유산(PK)을 물려받아 내 금고(자식 PK 칸)에 넣으면 식별자 관계, 내 일반 서랍(자식 일반 FK 칸)에 넣으면 비식별자 관계입니다.

시험장 단골 오답 함정

식별자 관계(실선)가 무조건 좋은 설계라고 생각하여, 하위 엔터티로 갈수록 PK 개수가 늘어나 SQL 조인이 복잡해진다는 설명을 틀렸다고 고릅니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    식별자 관계(실선): 부모의 주식별자(PK)가 자식의 주식별자(PK) 일부로 상속됨. 부모 없이 자식 생성 불가.
  • 2
    비식별자 관계(점선): 부모의 주식별자(PK)가 자식의 일반 속성(FK)으로만 상속됨. 약한 종속 관계이거나 자식에게 독자적 인조키를 둘 때 사용.
  • 3
    식별자 관계만 계속 이어지면 하위 엔터티의 PK 속성 개수가 누적 증가하여 SQL 조인 조건이 길어지고 개발 복잡도가 증가한다.
📋 식별자 관계 vs 비식별자 관계 핵심 비교
비교 항목식별자 관계 (Identifying)비식별자 관계 (Non-Identifying)
IE ERD 선 모양실선 (Solid Line)점선 (Dashed Line)
자식 엔터티 내 위치자식의 주식별자(PK) 영역에 포함 (PK + FK)자식의 일반 속성 영역에 포함 (일반 FK)
NULL 허용 여부절대 불가 (PK의 일부이므로 NOT NULL)조건에 따라 NULL 허용 가능 (부서 미배정 신입사원 등)
단점 및 튜닝 포인트하위로 갈수록 PK 컬럼 수가 늘어나 조인 SQL이 복잡해짐인조식별자 활용 시 조인 조건을 단순화할 수 있음
대표 실전 확인 문제 (Q.06)

Q. 부모 엔터티와 자식 엔터티 간의 식별자 관계(Identifying)와 비식별자 관계(Non-Identifying)에 대한 설명으로 가장 부적절한 것은?

  1. 1식별자 관계는 부모의 주식별자(PK)가 자식의 주식별자(PK)의 일부로 상속되는 관계로, IE 표기법에서 실선으로 표시한다.
  2. 2비식별자 관계는 부모의 주식별자가 자식의 일반 외래키(FK) 속성으로만 상속되는 관계로, 부모 없이도 자식 인스턴스가 생성될 수 있는 경우에 적합하다.
  3. 3모든 관계를 식별자 관계(실선)로만 연결하면 하위 엔터티로 내려갈수록 주식별자 속성 개수가 줄어들어 SQL 조인 문장이 단순해진다.
  4. 4자식 엔터티가 독자적인 생명주기를 가지거나 PK 속성 증가로 인한 SQL 복잡도를 방지하기 위해 인조식별자를 두고 비식별자 관계로 전환할 수 있다.
POINT 071과목 · 정규화

제1·2·3 정규화 (부분 함수 종속 vs 이행적 함수 종속)

최빈출 ★★★
쉬운 비유 & 직관적 이해

복합 대표(PK1+PK2) 중 한 명한테만 충성하면 제2정규화로 쪼개고, 대표(PK)도 아닌 일반 직원끼리 살림을 차렸으면 제3정규화로 쪼갭니다.

시험장 단골 오답 함정

제2정규화(부분 함수 종속 제거)와 제3정규화(이행적 함수 종속 제거)의 정의를 서로 반대로 골라서 틀립니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    제1정규화(1NF): 모든 속성이 원자값(Atomic Value)만 갖도록 반복 그룹이나 다중값 속성을 분리한다.
  • 2
    제2정규화(2NF): 복합 주식별자(PK가 2개 이상)일 때, PK의 일부에만 종속되는 부분 함수 종속을 제거한다. (단일 PK 테이블은 1NF면 자동으로 2NF 충족!)
  • 3
    제3정규화(3NF): 주식별자가 아닌 일반 속성 간에 종속이 발생하는 이행적 함수 종속(X → Y → Z)을 제거한다.
  • 4
    정규화는 입력/수정/삭제 이상(Anomaly)을 방지하고 데이터 무결성을 높이지만, 테이블 분할로 인해 JOIN 연산이 증가하여 조회 성능이 저하될 수 있다.
원본 데이터 vs SQL 실행 결과 비교 (2NF(부분종속 분리) & 3NF(이행종속 분리) 결과)
[Before] 정규화 전: 수강 및 학과 혼합 테이블
학번(PK)과목코드(PK)과목명 (과목코드에만 종속!)학과코드 (학번에 종속)학과명 (학과코드에 종속!)
S01C100데이터베이스D01컴퓨터공학과
S01C200운영체제D01컴퓨터공학과
[After] 정규화 완료 후: 역할별로 깔끔하게 분리된 3개 엔터티
분리된 엔터티구성 속성적용된 정규화 단계 및 이유
① 과목 엔터티과목코드(PK), 과목명제2정규화(2NF): 복합키(학번+과목코드) 중 과목코드에만 종속된 부분 함수 종속 분리
② 학과 엔터티학과코드(PK), 학과명제3정규화(3NF): 일반 속성 간 종속(학번 → 학과코드 → 학과명)인 이행적 함수 종속 분리
③ 수강 엔터티학번(PK,FK), 과목코드(PK,FK)순수 관계/성적 데이터만 유지
📋 정규화 단계별 핵심 키워드 요약
정규화 단계제거 대상 (핵심 키워드)함수 종속 형태단골 출제 포인트
제1정규화 (1NF)다중값 / 반복 그룹 제거 (원자성 확보)한 칸에 2개 이상의 값 존재전화번호1, 전화번호2 컬럼 등도 1NF 위반
제2정규화 (2NF)부분 함수 종속 제거 (완전 함수 종속 확보)(A, B) → C 인데 A → C 성립PK가 단일 컬럼이면 2NF 대상이 절대 될 수 없음
제3정규화 (3NF)이행적 함수 종속 제거PK(A) → 일반(B) → 일반(C)일반 속성끼리 종속 관계가 있을 때 분리
BCNF결정자이면서 후보키가 아닌 것 제거후보키가 아닌 일반 속성이 PK 일부를 결정강한 제3정규형
대표 실전 확인 문제 (Q.07)

Q. 복합 주식별자 (주문번호, 상품코드)를 가진 [주문상세] 엔터티에 '상품명', '상품단가', '주문수량' 속성이 포함되어 있다. 이때 '상품명'과 '상품단가'가 주식별자 전체가 아닌 '상품코드'에만 종속되어 데이터 중복과 갱신 이상이 발생하고 있다면, 이를 해결하기 위해 수행해야 할 정규화 단계는?

주문상세 ( #주문번호, #상품코드, 상품명, 상품단가, 주문수량 )
함수 종속성: (주문번호, 상품코드) -> 주문수량  /  상품코드 -> 상품명, 상품단가
  1. 1제1정규화 (1NF) — 원자값 확보
  2. 2제2정규화 (2NF) — 부분 함수 종속 제거
  3. 3제3정규화 (3NF) — 이행적 함수 종속 제거
  4. 4보이스-코드 정규화 (BCNF) — 결정자 후보키 확보
POINT 081과목 · null

NULL의 3치 논리 (Three-Valued Logic) 진리표

킬러문항 ★★★
쉬운 비유 & 직관적 이해

NULL은 0도 아니고 공백도 아닌 '아직 모르는 미지수 박스(?)'입니다. 미지수에 100을 더해도 미지수(NULL)이고, 미지수가 10과 같은지 물어보면 모름(UNKNOWN)입니다.

시험장 단골 오답 함정

NULL = NULL의 결과를 TRUE라고 생각하거나, UNKNOWN AND FALSE의 결과를 무조건 UNKNOWN이라고 착각합니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    NULL과의 사칙연산(NULL + 10, NULL * 0) 결과는 무조건 NULL이다.
  • 2
    NULL과의 비교연산(NULL = NULL, NULL <> 10) 결과는 무조건 UNKNOWN이다 (WHERE 절은 오직 TRUE만 통과시키므로 UNKNOWN은 제외됨).
  • 3
    3치 논리 핵심: TRUE OR UNKNOWN = TRUE, FALSE AND UNKNOWN = FALSE, NOT(UNKNOWN) = UNKNOWN.
📋 시험장 필살기: 3치 논리(Three-Valued Logic) 연산 진리표
조건 A조건 BA AND B (둘 다 참이어야 참)A OR B (하나라도 참이면 참)NOT A (반대)
TRUEUNKNOWNUNKNOWNTRUE ★ (A가 이미 TRUE이므로 확정!)FALSE
FALSEUNKNOWNFALSE ★ (A가 이미 FALSE이므로 확정!)UNKNOWNTRUE
UNKNOWNUNKNOWNUNKNOWNUNKNOWNUNKNOWN ★ (뒤집어도 여전히 모름!)
SQL 실전 검증 코드Oracle / ANSI SQL
-- 사원 A의 커미션(COMM)이 NULL, 급여(SAL)가 3000일 때:
SELECT ENAME FROM EMP
WHERE COMM = 500        -- NULL = 500 -> UNKNOWN
   OR SAL >= 2000;      -- 3000 >= 2000 -> TRUE
-- 최종 평가: UNKNOWN OR TRUE  ==>  TRUE! (사원 A는 정상 출력됨)
💡 실행 해설: OR 연산은 한쪽만 TRUE여도 전체가 TRUE가 되므로 앞의 NULL 비교(UNKNOWN)를 이기고 출력됩니다.
대표 실전 확인 문제 (Q.08)

Q. 아래 EMP 테이블의 한 행에서 SAL = 2000, COMM = NULL 일 때, 다음 세 개의 논리 조건식 (가), (나), (다)의 평가 결과(TRUE / FALSE / UNKNOWN)가 순서대로 바르게 짝지어진 것은?

(가) COMM = NULL OR SAL = 2000
(나) COMM > 0 AND SAL = 1000
(다) NOT (COMM <> 500)
  1. 1(가) TRUE / (나) FALSE / (다) UNKNOWN
  2. 2(가) UNKNOWN / (나) UNKNOWN / (다) TRUE
  3. 3(가) TRUE / (나) UNKNOWN / (다) FALSE
  4. 4(가) FALSE / (나) FALSE / (다) UNKNOWN
POINT 092과목 · select문

SQL 논리적 실행 순서와 별칭(Alias) 사용 규칙

최빈출 ★★★
쉬운 비유 & 직관적 이해

SELECT 절에서 지어준 별명(Alias)은 5교시에 태어난 이름입니다. 따라서 2교시(WHERE)나 3교시(GROUP BY)에서는 아직 태어나지 않은 이름을 부를 수 없습니다!

시험장 단골 오답 함정

SELECT SAL * 12 AS 연봉이라고 적어놓고 WHERE 연봉 >= 5000이라고 쓴 보기를 맞는 SQL로 고릅니다.

🔄 SQL 구문 작성 순서 vs 옵티마이저 실제 실행 순서
① FROM
대상 테이블 로드
1순위
② WHERE
개별 행 필터링 (별칭X, 집계X)
2순위
③ GROUP BY
그룹화 수행 (별칭X)
3순위
④ HAVING
그룹 조건 필터링 (별칭X, 집계O)
4순위
⑤ SELECT
출력 컬럼 계산 · ★별칭 탄생!
5순위
⑥ ORDER BY
최종 정렬 (★별칭 사용 가능!)
6순위
시험장 1초 판별 공식 (핵심 정리)
  • 1
    SQL 논리적 실행 순서: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.
  • 2
    SELECT 절에서 정의한 컬럼 별칭(Alias)은 SELECT보다 먼저 실행되는 WHERE, GROUP BY, HAVING 절에서는 절대 사용할 수 없다.
  • 3
    오직 SELECT 이후에 실행되는 ORDER BY 절에서만 컬럼 별칭(Alias)과 컬럼 위치 순번(ORDER BY 1, 2)을 사용할 수 있다.
📋 SQL 절(Clause)별 별칭 및 집계함수 허용 여부
SQL 절실행 순서SELECT 절 별칭(Alias) 사용집계 함수(SUM, AVG 등) 사용
WHERE 절2번째❌ 불가 (ORA-00904 부적합한 식별자 에러)❌ 절대 불가 (그룹화 이전 단계)
GROUP BY 절3번째❌ 불가❌ 불가
HAVING 절4번째❌ 불가⭕ 가능 (HAVING SUM(SAL) >= 5000)
ORDER BY 절6번째 (최후)⭕ 유일하게 가능!⭕ 가능 (GROUP BY 사용 시)
SQL 실전 검증 코드Oracle / ANSI SQL
SELECT DEPTNO AS 부서, AVG(SAL) AS 평균급여
FROM EMP
WHERE SAL >= 1000            -- [O] 개별 행 필터링
GROUP BY DEPTNO              -- [X] GROUP BY 부서 (별칭 사용 시 에러!)
HAVING AVG(SAL) >= 2000      -- [X] HAVING 평균급여 >= 2000 (별칭 사용 시 에러!)
ORDER BY 평균급여 DESC;       -- [O] ORDER BY에서만 별칭 사용 가능!
💡 실행 해설: WHERE, GROUP BY, HAVING에 SELECT 별칭이 쓰인 보기는 1초 만에 문법 오류로 소거하세요.
대표 실전 확인 문제 (Q.09)

Q. 다음 SQL 문장 중 문법적 오류(Error) 없이 정상적으로 실행되는 것은?

  1. 1SELECT DEPTNO AS 부서번호, SUM(SAL) AS 급여합 FROM EMP WHERE 급여합 >= 5000 GROUP BY DEPTNO;
  2. 2SELECT DEPTNO AS 부서번호, AVG(SAL) AS 평균급여 FROM EMP GROUP BY 부서번호 HAVING AVG(SAL) >= 2000;
  3. 3SELECT DEPTNO AS 부서번호, SUM(SAL) AS 급여합 FROM EMP GROUP BY DEPTNO HAVING 급여합 >= 5000;
  4. 4SELECT DEPTNO AS 부서번호, AVG(SAL) AS 평균급여 FROM EMP WHERE SAL >= 1000 GROUP BY DEPTNO HAVING SUM(SAL) >= 3000 ORDER BY 평균급여 DESC;
POINT 102과목 · where절

연산자 우선순위 (NOT > AND > OR)와 LIKE 와일드카드

빈출 ★★☆
쉬운 비유 & 직관적 이해

사칙연산에서 덧셈(+)보다 곱셈(×)을 먼저 계산하듯, 논리 연산에서는 OR보다 AND를 무조건 먼저 묶어서 계산합니다.

시험장 단골 오답 함정

괄호가 없는 WHERE A OR B AND C 구문을 왼쪽부터 순서대로 (A OR B) AND C로 계산하여 행 개수를 틀립니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    논리 연산자 우선순위: 괄호 ( ) → NOT → AND → OR 순서로 실행된다.
  • 2
    LIKE 연산자의 %는 0글자 이상의 모든 문자를 의미하고, _(언더바)는 반드시 정확히 1글자를 차지한다.
  • 3
    실제 데이터에 포함된 '%'나 '_' 기호 자체를 검색하려면 ESCAPE 옵션을 지정해야 한다 (예: LIKE '%\_%' ESCAPE '\').
원본 데이터 vs SQL 실행 결과 비교 (WHERE DEPTNO = 10 OR DEPTNO = 20 AND SAL >= 3000 실행)
[Before] 원본 EMP 테이블 (4건)
EMPNOENAMEDEPTNOSAL
1SMITH101000
2ALLEN201500
3KING205000
4CLARK304000
[After] 실행 결과: DEPTNO = 10 OR (DEPTNO = 20 AND SAL >= 3000) → 2건
EMPNOENAMEDEPTNOSAL통과 사유
1SMITH101000DEPTNO = 10 조건이 TRUE이므로 급여(1000)와 무관하게 무조건 통과!
3KING205000(DEPTNO = 20 AND SAL >= 3000) 조건이 TRUE이므로 통과!
📋 LIKE 와일드카드 패턴 매칭 예시
조건식정확한 의미'ALLEN' 매칭'ALE' 매칭'LAE' 매칭
LIKE '_L%E%'2번째 글자가 'L'이고, 그 뒤에 'E'가 최소 1번 나오는 문자열⭕ 매칭 (A-L-L-E-N)⭕ 매칭 (A-L-E)❌ 불일치 (1번째가 L)
LIKE '%\_%' ESCAPE '\'와일드카드가 아닌 실제 언더바('_') 문자가 들어간 문자열❌ 불일치❌ 불일치❌ 불일치
대표 실전 확인 문제 (Q.10)

Q. 다음과 같은 4건의 데이터가 저장된 EMP 테이블에서 아래 SQL을 실행했을 때 출력되는 결과(CNT)는?

[EMP 데이터]
1) SMITH (DEPTNO: 10, SAL: 1000)   2) ALLEN (DEPTNO: 20, SAL: 1500)
3) WARD  (DEPTNO: 20, SAL: 3500)   4) KING  (DEPTNO: 30, SAL: 5000)

[실행 SQL]
SELECT COUNT(*) AS CNT FROM EMP
WHERE DEPTNO = 10 OR DEPTNO = 20 AND SAL >= 3000;
  1. 11
  2. 22
  3. 33
  4. 44
POINT 112과목 · 함수

Oracle 공백문자('') vs SQL Server 공백문자('')

빈출 ★★☆
쉬운 비유 & 직관적 이해

따옴표 사이를 비워둔 ''(빈 문자열)를 넣었을 때, Oracle은 '아무것도 없네? NULL이다!'라고 바꾸고, SQL Server는 '길이가 0인 빈 글자네!'라고 구분합니다.

시험장 단골 오답 함정

Oracle 환경에서 INSERT INTO T VALUES ('')를 수행한 뒤 WHERE COL = ''로 조회하면 데이터가 나올 것이라고 착각합니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    Oracle에서는 빈 문자열('')을 NULL로 취급한다! 따라서 조회할 때 반드시 WHERE COL IS NULL을 사용해야 한다.
  • 2
    SQL Server(MSSQL)에서는 빈 문자열('')과 NULL을 명확히 구분하므로, 빈 문자열은 WHERE COL = ''로 조회한다.
  • 3
    단, Oracle의 문자열 결합 연산자('A' || NULL)는 NULL을 빈 문자열처럼 무시하여 'A'를 그대로 반환한다.
📋 Oracle vs SQL Server 빈 문자열('') 처리 완벽 비교
비교 항목Oracle (오라클)SQL Server (MSSQL)
'' (빈 문자열) 저장 시즉시 NULL로 변환되어 저장됨!길이 0인 빈 문자열('') 그대로 저장됨
조회할 때 올바른 조건절WHERE COL IS NULL (WHERE COL = ''는 0건!)WHERE COL = ''
LENGTH('') / LEN('') 결과NULL0
NULL과 문자열 결합 시'SQL' || NULL ==> 'SQL' (살아남음!)'SQL' + NULL ==> NULL (전체가 NULL 됨!)
대표 실전 확인 문제 (Q.11)

Q. Oracle DBMS 환경에서 아래 SQL 문장들을 순서대로 실행했을 때, 마지막 SELECT 문에서 조회되는 행의 개수는?

CREATE TABLE T_STR ( ID NUMBER, VAL VARCHAR2(10) );
INSERT INTO T_STR VALUES (1, '');
INSERT INTO T_STR VALUES (2, NULL);
INSERT INTO T_STR VALUES (3, 'SQL');

SELECT COUNT(*) FROM T_STR WHERE VAL = '';
  1. 10
  2. 21
  3. 32
  4. 43
POINT 122과목 · 함수

NULL 관련 내장함수 4총사 (NVL, NVL2, NULLIF, COALESCE)

최빈출 ★★★
쉬운 비유 & 직관적 이해

NVL은 '없으면 대체', NVL2는 '있으면 앞·없으면 뒤', NULLIF는 '둘이 같으면 폭파(NULL)', COALESCE는 '맨 처음 나오는 살아있는 값'입니다.

시험장 단골 오답 함정

NVL2(A, B, C)의 B와 C 순서를 반대로 외우거나, NULLIF(100, 100)의 결과를 100이라고 착각합니다 (실제 제보 #1164).

시험장 1초 판별 공식 (핵심 정리)
  • 1
    NVL(A, B) (MSSQL: ISNULL(A, B)): A가 NULL이면 B, 아니면 A를 반환한다.
  • 2
    NVL2(A, B, C): A가 NOT NULL이면 B(2번째), NULL이면 C(3번째)를 반환한다.
  • 3
    NULLIF(A, B): A와 B가 같으면 NULL, 다르면 첫 번째 인자인 A를 반환한다.
  • 4
    COALESCE(A, B, C, ...): 인자들을 앞에서부터 순서대로 검사하여 최초로 등장하는 NOT NULL 값을 반환한다.
📋 4대 NULL 내장함수 동작 비교표
함수 표현식핵심 공식A = 100 일 때 결과A = NULL 일 때 결과
NVL(A, 0) / ISNULL(A, 0)NULL이면 0, 아니면 A1000
NVL2(A, '성과금O', '성과금X')NOT NULL이면 2번째, NULL이면 3번째'성과금O''성과금X'
NULLIF(A, 100)둘이 같으면 NULL, 다르면 앞의 값(A)NULL ★ (100=100 같으므로!)NULL
COALESCE(A, NULL, -1)첫 번째로 만나는 NOT NULL 값100-1
SQL 실전 검증 코드Oracle / ANSI SQL
-- [기출 변형 #1164] COL1 = 100, COL2 = 100, COL3 = 200 일 때:
SELECT COALESCE(NULLIF(COL1, COL2), NULLIF(COL3, 100), -1) AS ANS
FROM DUAL;
-- 1) NULLIF(100, 100) -> 두 값이 같으므로 NULL 반환
-- 2) NULLIF(200, 100) -> 두 값이 다르므로 앞의 값 200 반환
-- 3) COALESCE(NULL, 200, -1) -> 첫 번째 NOT NULL 값인 200 반환!
💡 실행 해설: 중첩 함수 문제는 가장 안쪽 괄호인 NULLIF부터 차례대로 값을 치환하며 풀면 절대 틀리지 않습니다.
대표 실전 확인 문제 (Q.12)

Q. 테이블 T1의 한 행에 COL1 = 50, COL2 = 50, COL3 = NULL, COL4 = 100 이 저장되어 있을 때, 아래 SQL의 실행 결과는?

SELECT NVL2(NULLIF(COL1, COL2), 10, COALESCE(COL3, COL4, 0)) AS RESULT
FROM T1;
  1. 10
  2. 210
  3. 350
  4. 4100
POINT 132과목 · group by & having

집계 함수와 NULL (가로 연산 vs 세로 집계 비교)

최빈출 ★★★
쉬운 비유 & 직관적 이해

가로 방향(같은 행 안의 국어+영어) 더하기는 한 과목만 NULL이어도 합계가 NULL이 되지만, 세로 방향(집계함수 SUM, AVG)은 NULL을 투명인간 취급하고 계산합니다!

시험장 단골 오답 함정

AVG(COL)을 구할 때 전체 행 수로 나눈다고 착각하거나, SUM(A + B)와 SUM(A) + SUM(B)의 결과가 같다고 생각합니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    COUNT(*)만 유일하게 NULL 행을 포함하여 전체 행 수를 세며, COUNT(COL), SUM, AVG, MAX, MIN은 모두 NULL을 제외하고 계산한다.
  • 2
    따라서 AVG(COL)의 분모는 전체 행 수가 아니라 NULL을 제외한 행 수(COUNT(COL))이다! 전체 행 수로 나누려면 AVG(NVL(COL, 0))을 써야 한다.
  • 3
    가로 사칙연산이 먼저 수행되는 SUM(A + B)는 A나 B 중 하나만 NULL이어도 그 행 전체가 NULL이 되어 합산에서 빠지므로 SUM(A) + SUM(B)와 결과가 다르다!
원본 데이터 vs SQL 실행 결과 비교 (가로 사칙연산 후 집계 vs 세로 집계 실행 결과)
[Before] 원본 SCORES 테이블 (총 4행)
학번국어 (KOR)영어 (ENG)가로 연산 (KOR + ENG)
1102010 + 20 = 30
220NULL20 + NULL = NULL ⚠️ (20이 날아감!)
3304030 + 40 = 70
4NULLNULLNULL + NULL = NULL
[After] 집계 쿼리 실행 결과 비교 (수험생 오답률 1위 포인트!)
집계 표현식실제 계산 과정최종 결과핵심 해설
COUNT(*) / COUNT(KOR)전체 4행 / NULL 제외한 3행4 / 3COUNT(*)만 NULL을 포함해 카운트함
AVG(KOR)(10 + 20 + 30) / 320 ★NULL인 4번 행을 아예 빼고 분모를 3으로 나눔!
AVG(NVL(KOR, 0))(10 + 20 + 30 + 0) / 415 ★NULL을 0으로 바꿨으므로 분모가 4가 됨!
SUM(KOR) + SUM(ENG)60 + 60120각 컬럼별로 세로 합산 후 더함 (2번 행 국어 20 포함)
SUM(KOR + ENG)30 + NULL + 70 + NULL100 ★2번 행(20 + NULL = NULL)이 통째로 빠져 100이 됨!
📋 조회된 행이 0건(공집합)일 때 집계 함수 반환값
구분COUNT(*) / COUNT(COL)SUM(COL) / AVG(COL) / MAX(COL) / MIN(COL)
WHERE 조건 만족 행이 0건일 때0 반환NULL 반환 ★ (0이 아님에 절대 주의!)
대표 실전 확인 문제 (Q.13)

Q. 아래 4개 행이 저장된 EXAM 테이블에서 다음 SQL을 실행했을 때 (가), (나), (다)의 출력 결과로 올바른 것은?

[EXAM 테이블 데이터 (4행)]
1행: A=10, B=10  |  2행: A=20, B=NULL  |  3행: A=30, B=10  |  4행: A=NULL, B=NULL

SELECT AVG(A) AS (가), AVG(NVL(A, 0)) AS (나), SUM(A + B) AS (다) FROM EXAM;
  1. 1(가) 15 / (나) 15 / (다) 80
  2. 2(가) 20 / (나) 15 / (다) 60
  3. 3(가) 20 / (나) 15 / (다) 80
  4. 4(가) 20 / (나) 20 / (다) 60
POINT 142과목 · group by & having

GROUP BY와 HAVING의 실행 원리 및 문법 제약

빈출 ★★☆
쉬운 비유 & 직관적 이해

WHERE는 클럽 입구에서 개인 조건으로 미리 거르는 '입구 컷'이고, HAVING은 방(그룹)별로 모인 사람들의 합계/평균으로 거르는 '팀별 컷'입니다.

시험장 단골 오답 함정

GROUP BY 절에 적지 않은 일반 컬럼(예: 사원명 ENAME)을 SELECT 절에 그대로 적어도 실행된다고 착각합니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    WHERE 절은 그룹화 이전에 개별 행을 필터링하며, 집계 함수를 절대 사용할 수 없다.
  • 2
    HAVING 절은 GROUP BY 이후 생성된 그룹을 대상으로 집계 함수 조건(예: HAVING SUM(AMT) >= 150)을 필터링한다.
  • 3
    GROUP BY 절 사용 시 SELECT 절과 ORDER BY 절에는 GROUP BY에 명시된 기준 컬럼 또는 집계 함수만 올 수 있다 (일반 개별 컬럼 기술 시 에러!).
  • 4
    집계 함수 없이 SELECT DEPTNO FROM EMP GROUP BY DEPTNO; 처럼 단독 사용해도 문법적으로 정상 실행된다 (DISTINCT와 동일 효과).
원본 데이터 vs SQL 실행 결과 비교 (WHERE 조건 필터링 vs HAVING 그룹 필터링 비교)
[Before] 원본 SALES 테이블 (4건)
REGION (지역)PRODUCT (상품)AMT (매출액)
서울노트북100
서울마우스30
부산노트북120
부산키보드50
[After] 쿼리 조건 위치에 따른 최종 결과 비교
실행 쿼리1단계 (WHERE)2단계 (GROUP BY 합계)최종 출력 결과
WHERE AMT >= 100 GROUP BY REGION마우스(30), 키보드(50) 탈락서울(100), 부산(120)서울: 100 / 부산: 120
GROUP BY REGION HAVING SUM(AMT) >= 1504건 모두 통과서울(130), 부산(170)부산: 170 (서울 130은 HAVING에서 탈락!)
📋 WHERE 절 vs HAVING 절 핵심 비교
비교 항목WHERE 절HAVING 절
실행 시점GROUP BY 실행 이전 (2순위)GROUP BY 실행 이후 (4순위)
필터링 대상원본 테이블의 개별 행(Row)그룹화된 요약 행(Group, 소계, 총계 포함)
집계 함수 사용❌ 절대 불가 (WHERE AVG(SAL) > 2000 에러!)⭕ 가능 (HAVING AVG(SAL) > 2000)
대표 실전 확인 문제 (Q.14)

Q. 다음 중 GROUP BY 절과 HAVING 절의 사용에 대한 설명으로 옳은 것은?

  1. 1WHERE 절과 HAVING 절 모두 집계 함수(SUM, AVG 등)를 사용하여 조건을 지정할 수 있다.
  2. 2SELECT DEPTNO FROM EMP GROUP BY DEPTNO; 처럼 SELECT 절에 집계 함수가 없으면 문법 에러가 발생한다.
  3. 3GROUP BY DEPTNO를 사용한 쿼리의 SELECT 절에는 DEPTNO와 집계 함수 외에 개별 사원명(ENAME)을 함께 기술할 수 없다.
  4. 4HAVING 절은 FROM 절 직후, GROUP BY 절 이전에 실행되어 원본 행을 먼저 제거한다.
POINT 152과목 · order by

ORDER BY 절의 NULL 정렬 위치 (Oracle vs SQL Server)

최빈출 ★★★
쉬운 비유 & 직관적 이해

Oracle에서 NULL은 '무한대(∞) 왕고참'이라 큰 순(DESC)으로 줄 세우면 1등으로 맨 앞에 서고, SQL Server에서 NULL은 '마이너스 무한대(-∞) 막내'라 작은 순(ASC)일 때 맨 앞에 섭니다.

시험장 단골 오답 함정

ORDER BY COL DESC(내림차순)를 실행했을 때 Oracle에서도 숫자가 먼저 나오고 NULL이 맨 뒤에 나올 것이라고 착각합니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    Oracle은 정렬 시 NULL을 가장 큰 값(무한대 ∞)으로 취급한다! 따라서 ASC(오름차순)일 때 맨 마지막(NULLS LAST), DESC(내림차순)일 때 맨 처음(NULLS FIRST)에 출력된다.
  • 2
    SQL Server(MSSQL)는 정렬 시 NULL을 가장 작은 값(-∞)으로 취급한다! 따라서 ASC일 때 맨 처음, DESC일 때 맨 마지막에 출력된다.
  • 3
    Oracle에서 기본 NULL 정렬 위치를 바꾸려면 NULLS FIRST 또는 NULLS LAST 옵션을 명시한다.
📋 데이터 [10, 30, NULL, 20] 정렬 시 DBMS별 출력 순서
정렬 구문Oracle (NULL = 최대값 ∞)SQL Server (NULL = 최소값 -∞)
ORDER BY COL ASC (오름차순, 기본값)10 → 20 → 30 → NULL (맨 끝!)NULL (맨 앞!) → 10 → 20 → 30
ORDER BY COL DESC (내림차순)NULL (맨 앞!) → 30 → 20 → 1030 → 20 → 10 → NULL (맨 끝!)
ORDER BY COL DESC NULLS LAST30 → 20 → 10 → NULL (강제로 맨 끝 이동)지원 안 함 (CASE 문 활용)
대표 실전 확인 문제 (Q.15)

Q. BONUS 컬럼에 [100, NULL, 300, 200] 4건의 데이터가 들어있는 테이블에서 `SELECT BONUS FROM EMP ORDER BY BONUS DESC;` 쿼리를 Oracle과 SQL Server(MSSQL)에서 각각 실행했을 때 첫 번째 행에 출력되는 값은?

  1. 1Oracle: 300 / SQL Server: 300
  2. 2Oracle: NULL / SQL Server: 300
  3. 3Oracle: 300 / SQL Server: NULL
  4. 4Oracle: NULL / SQL Server: NULL
POINT 162과목 · 표준 조인

NATURAL JOIN과 USING 절의 치명적 문법 함정

최빈출 ★★★
쉬운 비유 & 직관적 이해

일반 ON 절 조인에서는 두 테이블의 공통 컬럼이 각자 명의(E.DEPTNO, D.DEPTNO)로 유지되지만, NATURAL JOIN과 USING 절에서는 '공동 명의(DEPTNO)'로 합쳐져서 개인 이름표(E. 또는 D.)를 붙이면 즉시 에러가 납니다!

시험장 단골 오답 함정

FROM EMP E JOIN DEPT D USING (DEPTNO) 쿼리의 SELECT 절이나 WHERE 절에 E.DEPTNO라고 테이블 별칭(Alias)을 붙인 보기를 정답으로 고릅니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    NATURAL JOIN과 USING 절에 사용된 조인 기준 컬럼에는 SELECT, WHERE, ORDER BY 어디에서도 절대 테이블명이나 별칭(E.DEPTNO)을 붙일 수 없다!
  • 2
    단, 조인 기준 컬럼이 아닌 나머지 일반 컬럼(예: E.ENAME, D.DNAME)에는 테이블 별칭을 정상적으로 사용할 수 있다.
  • 3
    SELECT * 실행 시 일반 ON 절 조인은 공통 컬럼이 2번 중복 출력되지만, NATURAL JOIN과 USING 조인은 공통 컬럼이 맨 앞에 단 1번만 통합 출력된다.
📋 ANSI 표준 조인 3가지 방식 완벽 비교
조인 방식조인 기준 컬럼 지정법기준 컬럼에 별칭(E.DEPTNO) 사용SELECT * 실행 시 공통 컬럼 출력 횟수
JOIN ~ ON (E.DEPTNO = D.DEPTNO)ON 절에 조건식 직접 명시⭕ 필수 사용 (안 쓰면 모호성 에러!)2번 중복 출력 (DEPTNO, DEPTNO_1)
JOIN ~ USING (DEPTNO)USING (공통컬럼) 괄호로 지정❌ 절대 사용 불가 (쓰면 문법 에러!)맨 앞에 1번만 통합 출력
NATURAL JOIN지정 불가 (이름·타입 같은 모든 컬럼 자동 매칭)❌ 절대 사용 불가 (쓰면 문법 에러!)맨 앞에 1번만 통합 출력
SQL 실전 검증 코드Oracle / ANSI SQL
-- [X: 문법 에러!] USING 절 기준 컬럼(DEPTNO)에 별칭(E.)을 붙여서 에러!
SELECT E.DEPTNO, E.ENAME, D.DNAME
FROM EMP E JOIN DEPT D USING (DEPTNO);

-- [O: 정상 실행!] 기준 컬럼(DEPTNO)은 별칭 없이 단독 표기, 일반 컬럼은 별칭 사용 가능!
SELECT DEPTNO, E.ENAME, D.DNAME
FROM EMP E JOIN DEPT D USING (DEPTNO)
WHERE DEPTNO = 10;
💡 실행 해설: 시험에서 NATURAL JOIN이나 USING이 나오면 90% 확률로 기준 컬럼 앞에 Alias(E.)를 몰래 붙여놓은 틀린 보기를 찾는 문제입니다.
대표 실전 확인 문제 (Q.16)

Q. EMP(EMPNO, ENAME, DEPTNO) 테이블과 DEPT(DEPTNO, DNAME) 테이블을 조인하는 다음 SQL 중 문법 오류가 발생하는 것은?

  1. 1SELECT E.DEPTNO, E.ENAME, D.DNAME FROM EMP E JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
  2. 2SELECT DEPTNO, E.ENAME, D.DNAME FROM EMP E JOIN DEPT D USING (DEPTNO);
  3. 3SELECT DEPTNO, E.ENAME, D.DNAME FROM EMP E NATURAL JOIN DEPT D;
  4. 4SELECT E.DEPTNO, E.ENAME, D.DNAME FROM EMP E JOIN DEPT D USING (DEPTNO);
POINT 172과목 · 표준 조인

LEFT OUTER JOIN에서 ON 절 조건 vs WHERE 절 조건의 차이

킬러문항 ★★★
쉬운 비유 & 직관적 이해

ON 절에 적은 우측 테이블 조건은 '짝꿍을 고를 때만 까다롭게 보고, 짝이 없어도 왼쪽 주인공은 무조건 살려주는 것'이고, WHERE 절에 적은 조건은 '조인이 끝난 뒤 짝이 없어 NULL이 된 주인공들까지 가차 없이 해고(탈락)시키는 것'입니다.

시험장 단골 오답 함정

LEFT OUTER JOIN에서 우측 테이블 필터 조건을 ON 절에 적든 WHERE 절에 적든 결과 행 수가 같을 것이라고 착각합니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    LEFT OUTER JOIN에서 우측 테이블 일반 조건을 ON 절에 기술하면: 조인 매칭 시에만 필터링되고 좌측 기준 테이블의 모든 행은 무조건 보존된다 (매칭 실패 시 우측 컬럼만 NULL).
  • 2
    우측 테이블 일반 조건(예: WHERE B.LOC = '서울')을 WHERE 절에 기술하면: 조인 후 NULL로 채워진 행들이 WHERE 조건(NULL = '서울' → UNKNOWN)에서 모두 탈락하여 INNER JOIN과 동일한 결과로 변질된다!
  • 3
    반대로 WHERE B.PK IS NULL 조건을 걸면 매칭되지 않은 순수 차집합(A - B)만 추출할 수 있다.
원본 데이터 vs SQL 실행 결과 비교 (EMP(10, 20, 30번 부서 사원 3명) LEFT JOIN DEPT(10:서울, 20:부산))
[Before] Case A: 우측 조건을 ON 절에 기술 (ON E.DEPTNO = D.DEPTNO AND D.LOC = '서울')
EMPNOENAMEDEPTNOD.LOC생존 여부 및 이유
1김사원10서울⭕ 생존 (10번 부서이면서 서울 매칭 성공)
2이대리20NULL⭕ 생존! (20번은 부산이라 매칭 실패해 NULL이 됐지만 LEFT JOIN이므로 생존)
3박과장30NULL⭕ 생존! (30번 부서 없지만 LEFT JOIN이므로 생존) → 총 3건 출력!
[After] Case B: 우측 조건을 WHERE 절에 기술 (WHERE D.LOC = '서울')
EMPNOENAMEDEPTNOD.LOC생존 여부 및 이유
1김사원10서울⭕ 생존 → 최종 단 1건만 출력! (이대리·박과장은 D.LOC가 NULL이라 WHERE 절에서 탈락!)
📋 LEFT OUTER JOIN 조건 위치별 결과 요약 (좌측 A 5건, 우측 B 매칭 2건 가정)
쿼리 패턴좌측 A의 미매칭 행 보존 여부실제 동작 효과출력 행 수 (1:1 매칭 시)
LEFT JOIN B ON A.ID = B.ID AND B.AMT > 100⭕ 모두 보존됨 (NULL로 채워 출력)진정한 LEFT OUTER JOIN5건 (좌측 전체)
LEFT JOIN B ON A.ID = B.ID WHERE B.AMT > 100❌ 모두 탈락함!INNER JOIN으로 강제 변환됨!2건 이하 (매칭된 것만)
LEFT JOIN B ON A.ID = B.ID WHERE B.ID IS NULL⭕ 미매칭 행만 골라냄!순수 차집합 (A - B, Anti Join)3건 (5 - 2)
대표 실전 확인 문제 (Q.17)

Q. 좌측 테이블 A(ID: 1, 2, 3 총 3건)와 우측 테이블 B(ID: 1[LOC='서울'], ID: 2[LOC='부산'] 총 2건)에 대해 아래 (가), (나) 두 쿼리를 실행했을 때 조회되는 행의 개수로 올바른 것은?

(가) SELECT A.ID, B.LOC FROM A LEFT OUTER JOIN B ON A.ID = B.ID AND B.LOC = '서울';
(나) SELECT A.ID, B.LOC FROM A LEFT OUTER JOIN B ON A.ID = B.ID WHERE B.LOC = '서울';
  1. 1(가) 3건 / (나) 3건
  2. 2(가) 3건 / (나) 1건
  3. 3(가) 1건 / (나) 3건
  4. 4(가) 1건 / (나) 1건
POINT 182과목 · 조인

Oracle 외부 조인 (+) 기호의 위치와 제약사항

최빈출 ★★★
쉬운 비유 & 직관적 이해

(+) 기호는 병원 수혈 링거입니다! 피(데이터)가 넘치는 주인공 테이블이 아니라, 데이터가 모자라서 NULL이라도 수혈받아야 하는 반대쪽 약한 테이블에 (+)를 붙여야 합니다.

시험장 단골 오답 함정

LEFT OUTER JOIN이니까 왼쪽 테이블 컬럼에 (+)를 붙이거나, 부가 조건에서 (+)를 빼먹어도 아우터 조인이 유지된다고 착각합니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    LEFT OUTER JOIN (왼쪽 A 기준 보존) ⇔ WHERE A.ID = B.ID(+) (오른쪽에 (+) 표시!).
  • 2
    RIGHT OUTER JOIN (오른쪽 B 기준 보존) ⇔ WHERE A.ID(+) = B.ID (왼쪽에 (+) 표시!).
  • 3
    조인 조건 외에 우측 테이블의 부가 조건을 줄 때도 반드시 B.STATUS(+) = 'Y'처럼 (+)를 함께 붙여야 한다. 만약 (+)를 빼먹으면 INNER JOIN으로 풀려버린다!
  • 4
    (+) 기호는 양쪽에 동시에 붙여 FULL OUTER JOIN을 만들 수 없으며, OR 연산자나 IN 연산자와 함께 사용할 수 없다.
📋 ANSI 외부 조인 ↔ Oracle (+) 조인 완벽 변환표
ANSI 표준 구문Oracle WHERE 절 구문핵심 포인트
FROM A LEFT JOIN B ON A.ID = B.IDWHERE A.ID = B.ID(+)왼쪽(A)이 주인공이므로 부족한 오른쪽(B)에 (+) 부여
FROM A RIGHT JOIN B ON A.ID = B.IDWHERE A.ID(+) = B.ID오른쪽(B)이 주인공이므로 부족한 왼쪽(A)에 (+) 부여
FROM A LEFT JOIN B ON A.ID = B.ID AND B.DEPT = 10WHERE A.ID = B.ID(+) AND B.DEPT(+) = 10부가 조건에도 (+)를 붙여서 ON 절 효과를 냄!
FROM A LEFT JOIN B ON A.ID = B.ID WHERE B.DEPT = 10WHERE A.ID = B.ID(+) AND B.DEPT = 10(+)를 안 붙이면 WHERE 절 필터가 되어 INNER JOIN화!
대표 실전 확인 문제 (Q.18)

Q. 다음 ANSI 표준 외부 조인 SQL과 100% 동일한 결과를 반환하는 Oracle 전용 조인 구문은?

SELECT E.EMPNO, D.DNAME
FROM EMP E LEFT OUTER JOIN DEPT D
  ON E.DEPTNO = D.DEPTNO AND D.LOC = 'SEOUL';
  1. 1SELECT E.EMPNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO(+) = D.DEPTNO AND D.LOC(+) = 'SEOUL';
  2. 2SELECT E.EMPNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO(+) AND D.LOC = 'SEOUL';
  3. 3SELECT E.EMPNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO(+) AND D.LOC(+) = 'SEOUL';
  4. 4SELECT E.EMPNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO(+) = D.DEPTNO AND D.LOC = 'SEOUL';
POINT 192과목 · 서브쿼리

NOT IN과 NULL의 대형 참사 (vs NOT EXISTS)

킬러문항 ★★★
쉬운 비유 & 직관적 이해

IN은 '출석부에 내 이름이 하나라도 있으면 통과(OR)'라 빈칸(NULL)이 있어도 상관없지만, NOT IN은 '출석부 모든 사람과 내가 다 달라야 통과(AND)'라 정체불명 빈칸(NULL)이 한 명이라도 있으면 아무도 통과하지 못합니다!

시험장 단골 오답 함정

서브쿼리 결과에 NULL이 섞여 있을 때 WHERE ID NOT IN (10, 20, NULL)을 실행하면 10과 20을 제외한 나머지 행들이 조회된다고 착각합니다.

🔄 IN vs NOT IN 에 NULL이 포함되었을 때 논리 평가 과정
X IN (10, NULL) [X=10]
(10=10) OR (10=NULL) → TRUE OR UNKNOWN
결과: TRUE (정상 출력!)
X NOT IN (10, NULL) [X=30]
(30<>10) AND (30<>NULL) → TRUE AND UNKNOWN
결과: UNKNOWN (0건 공집합!)
안전한 해결책
NOT EXISTS 사용 또는 서브쿼리에 IS NOT NULL 추가
정상 차집합 추출
시험장 1초 판별 공식 (핵심 정리)
  • 1
    X IN (10, 20, NULL)은 X = 10 OR X = 20 OR X = NULL(UNKNOWN)과 같으므로, X가 10이나 20이면 TRUE가 되어 정상 출력된다.
  • 2
    X NOT IN (10, 20, NULL)은 X <> 10 AND X <> 20 AND X <> NULL(UNKNOWN)과 같으므로, 마지막 AND UNKNOWN 때문에 어떤 값을 넣어도 전체가 UNKNOWN이 되어 결과는 무조건 0건(공집합)이 된다!
  • 3
    NOT IN의 NULL 참사를 피하려면 서브쿼리에 WHERE COL IS NOT NULL 조건을 추가하거나, NOT EXISTS로 대체해야 한다.
📋 상사번호(MGR)에 NULL(사장님)이 포함된 EMP 테이블 조회 비교
실행 SQL 쿼리출력 행 수원인 및 대체 가능 여부
SELECT * FROM EMP WHERE EMPNO IN (SELECT MGR FROM EMP);상사 사원들 정상 출력OR 연결이므로 NULL이 있어도 TRUE인 행 모두 통과
SELECT * FROM EMP WHERE EMPNO NOT IN (SELECT MGR FROM EMP);0건 (공집합!) ★AND (EMPNO <> NULL) 때문에 모든 행이 UNKNOWN으로 탈락!
SELECT * FROM EMP E WHERE NOT EXISTS (SELECT 1 FROM EMP M WHERE M.MGR = E.EMPNO);말단 사원들 정상 출력EXISTS는 행 존재 여부(TRUE/FALSE)만 판별해 NULL 안전!
대표 실전 확인 문제 (Q.19)

Q. EMP 테이블은 총 10건이며, 상사 사번(MGR) 컬럼에는 [7839, 7698, NULL] 값들이 포함되어 있다. 아래 (가), (나) 두 SQL을 실행했을 때 반환되는 행의 수에 대한 설명으로 옳은 것은?

(가) SELECT COUNT(*) FROM EMP WHERE EMPNO IN (SELECT MGR FROM EMP);
(나) SELECT COUNT(*) FROM EMP WHERE EMPNO NOT IN (SELECT MGR FROM EMP);
  1. 1(가)와 (나) 모두 0을 반환한다.
  2. 2(가)는 상사인 사원 수를 정상 반환하지만, (나)는 서브쿼리의 NULL 때문에 0을 반환한다.
  3. 3(가)는 0을 반환하지만, (나)는 상사가 아닌 말단 사원 수를 정상 반환한다.
  4. 4(가)의 결과와 (나)의 결과를 더하면 전체 사원 수인 10이 된다.
POINT 202과목 · 서브쿼리

서브쿼리 위치별 분류와 스칼라 서브쿼리 / ALL · ANY

빈출 ★★☆
쉬운 비유 & 직관적 이해

SELECT 절에 들어가는 스칼라 서브쿼리는 '한 칸짜리 도시락'입니다. 반찬이 아예 없으면 빈 도시락(NULL)을 내주지만, 반찬이 2개 이상 들어오면 도시락 뚜껑이 안 닫혀서 에러가 터집니다!

시험장 단골 오답 함정

스칼라 서브쿼리의 결과가 0건(공집합)이면 에러가 발생한다고 착각하거나, > ALL을 최소값보다 큰 것(> MIN)으로 반대로 해석합니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    스칼라 서브쿼리(SELECT 절): 반드시 1행 1열(단일 값)만 반환해야 한다. 결과가 0건이면 NULL을 반환하고(LEFT JOIN 효과), 2건 이상이면 에러가 발생한다!
  • 2
    인라인 뷰(FROM 절): 쿼리 실행 시 동적으로 생성되는 임시 테이블 역할을 하며, 서브쿼리 중 유일하게 ORDER BY 절을 자유롭게 사용할 수 있다.
  • 3
    다중 행 비교 연산자: > ALL (10, 20, 30)은 모두가 이겨야 하므로 최대값보다 큼(> MAX(30)), > ANY (10, 20, 30)은 하나만 이기면 되므로 최소값보다 큼(> MIN(10))을 뜻한다.
📋 다중 행 서브쿼리 연산자 (ALL vs ANY/SOME) 1초 변환표 (집합: [1000, 2000, 3000])
조건 표현식쉬운 해석동일한 집계 함수 표현통과 기준
SAL > ALL (1000, 2000, 3000)전부 다 이겨야 함 (끝판왕 격파!)SAL > MAX (3000)3000 초과만 통과
SAL > ANY (1000, 2000, 3000)아무나 한 명만 이겨도 됨 (최약체 격파!)SAL > MIN (1000)1000 초과면 모두 통과
SAL < ALL (1000, 2000, 3000)전부보다 작아야 함SAL < MIN (1000)1000 미만만 통과
SAL < ANY (1000, 2000, 3000)아무나 한 명보다만 작으면 됨SAL < MAX (3000)3000 미만이면 모두 통과
대표 실전 확인 문제 (Q.20)

Q. 다음 중 서브쿼리(Subquery)에 대한 설명으로 가장 부적절한 것은?

  1. 1SELECT 절에 사용하는 스칼라 서브쿼리의 조회 결과가 0건(공집합)이면 에러가 발생하지 않고 NULL을 반환한다.
  2. 2스칼라 서브쿼리의 조회 결과가 2건 이상이면 단일 행 반환 제약 위반으로 런타임 에러가 발생한다.
  3. 3WHERE SAL > ALL (SELECT SAL FROM EMP WHERE DEPTNO = 20) 조건은 20번 부서의 최소 급여(MIN)보다 크면 참이 된다.
  4. 4FROM 절에 사용하는 인라인 뷰(Inline View) 내부에서는 ORDER BY 절을 사용할 수 있다.
POINT 212과목 · 집합연산자

집합 연산자 (UNION vs UNION ALL, INTERSECT, MINUS)

최빈출 ★★★
쉬운 비유 & 직관적 이해

UNION ALL은 두 상자의 공을 그냥 한 자루에 붓는 것(중복 유지, 빠름)이고, UNION은 같은 색 공이 있으면 한 상자 안에 원래 있던 중복 공까지 싹 골라내서 하나씩만 남기고 번호순으로 줄까지 세우는 것(중복 제거 + 정렬)입니다.

시험장 단골 오답 함정

R1 테이블 내부에 이미 중복 행이 있을 때, UNION이 두 테이블 간 중복만 제거하고 R1 자체 중복은 남겨둔다고 착각합니다 (제보 #105).

시험장 1초 판별 공식 (핵심 정리)
  • 1
    UNION ALL만 유일하게 중복을 제거하지 않고 정렬(Sort)도 수행하지 않아 속도가 가장 빠르다.
  • 2
    UNION, INTERSECT, MINUS(EXCEPT)는 모두 중복 행을 완전히 제거하며 내부적으로 정렬(Sort) 작업을 수행한다 (한 테이블 자체의 중복까지 1건으로 합쳐짐!).
  • 3
    집합 연산에서 ORDER BY 절은 전체 쿼리의 맨 마지막 줄에 단 한 번만 쓸 수 있으며, 반드시 첫 번째 SELECT 절의 컬럼명/별칭/순번을 기준으로 정렬해야 한다.
원본 데이터 vs SQL 실행 결과 비교 (R1 = {A, B, B} (3건) 와 R2 = {B, C} (2건) 의 집합 연산 결과)
[Before] 원본 테이블 데이터 (R1 내부에 'B'가 2개 중복 존재!)
테이블 구분보유 데이터 행행 개수
테이블 R1A, B, B3건 (B가 2건 중복)
테이블 R2B, C2건
[After] 4대 집합 연산자 실행 결과 및 행 수 비교
집합 연산 쿼리최종 출력 데이터결과 행 수중복 제거 및 정렬 여부
R1 UNION ALL R2A, B, B, B, C5건 (3 + 2)❌ 중복 유지 / 정렬 안 함
R1 UNION R2A, B, C3건 ★⭕ 중복 완전 제거 (B 3개가 1개로!) + 정렬 수행
R1 UNION R1 (자기 자신과 UNION)A, B2건 ★⭕ 자기 내부의 중복 B까지 제거되어 2건만 남음!
R1 INTERSECT R2 (교집합)B1건⭕ 공통된 B를 중복 제거하여 1건만 출력
R1 MINUS R2 (차집합, MSSQL: EXCEPT)A1건⭕ R1에서 R2에 있는 B를 모두 제거
📋 집합 연산자 문법 규칙 체크리스트
검증 항목올바른 규칙 (O)단골 문법 오류 함정 (X)
결과 컬럼 헤더 이름무조건 첫 번째 SELECT 절의 컬럼명/별칭을 따름두 번째 SELECT 절의 별칭이 출력된다 (X)
ORDER BY 절 위치전체 집합 연산의 맨 마지막 줄에 1번만 작성첫 번째 SELECT 문 끝에 ORDER BY를 적는다 (X)
ORDER BY 컬럼 지정첫 번째 SELECT 절의 컬럼명/별칭 또는 순번(1, 2) 사용두 번째 SELECT 절에만 있는 별칭으로 정렬한다 (X)
대표 실전 확인 문제 (Q.21)

Q. 테이블 R1에 [10, 20, 20] 총 3개 행이 있고, 테이블 R2에 [20, 30] 총 2개 행이 있을 때, 아래 (가), (나), (다) 쿼리 실행 결과의 행 개수가 바르게 연결된 것은?

(가) SELECT COL FROM R1 UNION ALL SELECT COL FROM R2;
(나) SELECT COL FROM R1 UNION SELECT COL FROM R2;
(다) SELECT COL FROM R1 UNION SELECT COL FROM R1;
  1. 1(가) 5건 / (나) 4건 / (다) 3건
  2. 2(가) 5건 / (나) 3건 / (다) 2건
  3. 3(가) 3건 / (나) 3건 / (다) 3건
  4. 4(가) 5건 / (나) 3건 / (다) 3건
POINT 222과목 · 그룹함수

그룹함수 3대장 (ROLLUP, CUBE, GROUPING SETS) & GROUPING()

최빈출 ★★★
쉬운 비유 & 직관적 이해

ROLLUP은 오른쪽 끝에서부터 하나씩 계단식으로 빼면서 총계까지 내는 것(N+1), CUBE는 가능한 모든 조합의 소계와 총계를 다 내는 것(2^N), GROUPING SETS는 내가 괄호로 찍어준 조합만 딱 내는 것입니다.

시험장 단골 오답 함정

GROUPING SETS((A, B), (A), (B))가 CUBE(A, B)와 똑같다고 착각합니다 (전체 총계인 빈 괄호 ()가 빠졌으므로 다름! - 제보 #377).

시험장 1초 판별 공식 (핵심 정리)
  • 1
    ROLLUP(A, B) (N+1 = 3개 그룹): (A, B) 상세 + (A) 소계 + () 전체 총계. 인자 순서가 바뀌면 결과도 달라진다 (B 소계는 생성 안 됨!).
  • 2
    CUBE(A, B) (2^N = 4개 그룹): (A, B) 상세 + (A) 소계 + (B) 소계 + () 전체 총계. 인자 순서와 무관하게 모든 조합을 생성한다.
  • 3
    GROUPING SETS(A, B): 지정한 (A) 소계 + (B) 소계만 생성하며, 빈 괄호 ()를 명시하지 않으면 전체 총계는 생성되지 않는다.
  • 4
    GROUPING(COL) 함수는 해당 컬럼이 소계/총계 집계로 인해 NULL로 뭉뚱그려진 자리이면 1, 원래 상세 데이터 자리이면 0을 반환한다.
📋 그룹함수 동치(같은 결과) 변환 공식 총정리표
원본 그룹함수 구문생성되는 그룹 수완전히 동일한 GROUPING SETS 변환 구문
GROUP BY ROLLUP(A, B)3개 (N+1)GROUP BY GROUPING SETS ((A, B), (A), ())
GROUP BY CUBE(A, B)4개 (2^N)GROUP BY GROUPING SETS ((A, B), (A), (B), ()) ★ 빈 괄호 () 필수!
GROUP BY ROLLUP(A, (B, C))3개 (괄호 묶음)GROUP BY GROUPING SETS ((A, B, C), (A), ()) ★ (B, C)가 한 몸으로 빠짐!
GROUP BY A, ROLLUP(B)2개 (부분 롤업)GROUP BY GROUPING SETS ((A, B), (A)) ★ A가 고정되어 전체 총계 () 없음!
SQL 실전 검증 코드Oracle / ANSI SQL
SELECT CASE WHEN GROUPING(REGION) = 1 THEN '전체총계' ELSE REGION END AS 지역,
       CASE WHEN GROUPING(PRODUCT) = 1 THEN '소계' ELSE PRODUCT END AS 상품,
       SUM(AMT) AS 매출합
FROM SALES
GROUP BY ROLLUP(REGION, PRODUCT)
HAVING SUM(AMT) >= 150; -- ★ 주의: HAVING 조건은 상세행·소계행·총계행 각각에 독립 적용됨!
💡 실행 해설: 상세 행 합계가 150 미만이어서 탈락하더라도, 지역 소계나 전체 총계가 150 이상이면 소계·총계 행은 정상 출력됩니다 (제보 #2598).
대표 실전 확인 문제 (Q.22)

Q. 다음 중 `GROUP BY CUBE(DEPTNO, JOB)` 구문과 완전히 동일한 집계 결과를 생성하는 SQL 구문은?

  1. 1GROUP BY ROLLUP(DEPTNO, JOB)
  2. 2GROUP BY GROUPING SETS ((DEPTNO, JOB), (DEPTNO), (JOB))
  3. 3GROUP BY GROUPING SETS ((DEPTNO, JOB), (DEPTNO), (JOB), ())
  4. 4GROUP BY DEPTNO, ROLLUP(JOB)
POINT 232과목 · 윈도우함수

윈도우 순위 함수 (RANK vs DENSE_RANK vs ROW_NUMBER)

최빈출 ★★★
쉬운 비유 & 직관적 이해

공동 2등이 두 명 나왔을 때, 올림픽처럼 3등을 비워두고 바로 4등상을 주면 RANK(), 아까우니까 빈틈없이(Dense) 다음 사람에게 3등상을 주면 DENSE_RANK(), 동점 무시하고 줄 세워 1·2·3·4번 번호표를 주면 ROW_NUMBER()입니다.

시험장 단골 오답 함정

WHERE 절에서 바로 WHERE RANK() OVER(...) <= 3 처럼 윈도우 함수를 조건으로 걸 수 있다고 착각하거나, OVER 절 안에 ORDER BY를 PARTITION BY보다 앞에 씁니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    점수가 [100, 90, 90, 80]일 때: RANK()는 1, 2, 2, 4, DENSE_RANK()는 1, 2, 2, 3, ROW_NUMBER()는 1, 2, 3, 4를 반환한다.
  • 2
    OVER 절 내부 구문 순서는 반드시 PARTITION BY → ORDER BY → ROWS/RANGE 순서여야 한다 (순서 변경 시 문법 에러!).
  • 3
    윈도우 함수는 원본 행 수를 줄이지 않으며, WHERE 절에서 직접 사용할 수 없으므로 반드시 인라인 뷰(서브쿼리)로 감싼 뒤 바깥 WHERE 절에서 필터링해야 한다.
📋 급여 데이터 [5000, 3000, 3000, 2900]에 대한 3대 순위 함수 비교
사원명급여 (SAL)RANK() 결과DENSE_RANK() 결과ROW_NUMBER() 결과
KING5000111
FORD3000 (공동)222
SCOTT3000 (공동)223 ★ (동점이어도 고유 번호)
JONES29004 ★ (3등 건너뜀!)3 ★ (건너뛰지 않음!)4
SQL 실전 검증 코드Oracle / ANSI SQL
-- [정석] 부서별 급여 상위 3위 이내 사원 추출 (인라인 뷰 필수!)
SELECT EMPNO, DEPTNO, SAL, RK
FROM (
    SELECT EMPNO, DEPTNO, SAL,
           RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) AS RK
    FROM EMP
)
WHERE RK <= 3;
💡 실행 해설: OVER 절 안에서 ORDER BY가 PARTITION BY 앞에 나오거나, 인라인 뷰 없이 WHERE 절에 RANK()가 쓰인 보기는 즉시 오답 처리하세요.
대표 실전 확인 문제 (Q.23)

Q. 4명의 사원 급여가 [5000, 3000, 3000, 2000]일 때, 아래 SQL 실행 결과에서 급여가 2000인 사원의 (가), (나), (다) 값으로 올바른 것은?

SELECT SAL,
       RANK() OVER (ORDER BY SAL DESC) AS (가),
       DENSE_RANK() OVER (ORDER BY SAL DESC) AS (나),
       ROW_NUMBER() OVER (ORDER BY SAL DESC) AS (다)
FROM EMP;
  1. 1(가) 4 / (나) 3 / (다) 4
  2. 2(가) 3 / (나) 4 / (다) 4
  3. 3(가) 4 / (나) 4 / (다) 3
  4. 4(가) 3 / (나) 3 / (다) 4
POINT 242과목 · 윈도우함수

윈도우 프레임 (ROWS vs RANGE)과 동점자 누적합 함정

킬러문항 ★★★
쉬운 비유 & 직관적 이해

OVER(ORDER BY 날짜)로 누적합을 구할 때 기본값은 ROWS(한 줄씩)가 아니라 RANGE(같은 값 묶음)입니다! 그래서 같은 날짜가 두 줄 있으면 두 줄의 금액을 한 방에 다 끌어모아서 똑같은 누적합을 찍어버립니다.

시험장 단골 오답 함정

SUM(AMT) OVER(ORDER BY DT)에서 날짜가 같은 2행(1000)과 3행(2000)이 차례대로 2000, 4000으로 계산될 것이라고 착각합니다 (실제 제보 #608 최다 오답!).

시험장 1초 판별 공식 (핵심 정리)
  • 1
    OVER() 안에 ORDER BY가 없으면 기본 프레임은 파티션 전체 총합(UNBOUNDED PRECEDING ~ UNBOUNDED FOLLOWING)이다.
  • 2
    OVER(ORDER BY 컬럼)처럼 ORDER BY만 지정하고 ROWS/RANGE를 생략하면, 기본 프레임은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW이다!
  • 3
    RANGE(논리적 값 단위, 기본값)는 ORDER BY 기준 값이 동점(같은 값)인 행들을 한꺼번에 묶어서 합산하며, ROWS(물리적 행 단위)는 동점이든 아니든 무조건 한 줄씩 차례대로 합산한다.
원본 데이터 vs SQL 실행 결과 비교 (동점 날짜(01.02)가 있을 때 RANGE(기본값) vs ROWS 누적합 결과 비교)
[Before] 원본 매출 테이블 (2행과 3행의 일자가 '01.02'로 동일!)
행 번호일자 (DT)금액 (AMT)
1행2026.01.011000
2행2026.01.02 (동점!)1000
3행2026.01.02 (동점!)2000
4행2026.01.032000
[After] 윈도우 프레임 옵션에 따른 누적합 실행 결과 (제보 #608 완벽 해부)
행일자금액SUM(AMT) OVER() (ORDER BY 없음)SUM(AMT) OVER(ORDER BY DT) (기본값: RANGE ★)SUM(AMT) OVER(ORDER BY DT ROWS UNBOUNDED PRECEDING)
1행01.0110006000 (전체합)10001000
2행01.0210006000 (전체합)4000 ★ (1000 + [1000+2000] 일괄 합산!)2000 ★ (1000 + 1000 한 줄씩!)
3행01.0220006000 (전체합)4000 ★ (2행과 동일한 묶음 값!)4000 (2000 + 2000)
4행01.0320006000 (전체합)60006000
📋 윈도우 프레임 경계 지정 키워드
키워드의미반대 방향 키워드
UNBOUNDED PRECEDING파티션의 맨 첫 번째 행(시작점)UNBOUNDED FOLLOWING (파티션의 맨 마지막 행)
N PRECEDING현재 행으로부터 N행(또는 N값) 이전N FOLLOWING (현재 행으로부터 N행/값 이후)
CURRENT ROW현재 행 위치-
대표 실전 확인 문제 (Q.24)

Q. 아래와 같이 2행과 3행의 주문일자(DT)가 '01.02'로 동일한 T_ORDER 테이블에서 다음 SQL을 실행했을 때, 2행(ID=2)의 S1과 S2 컬럼 값으로 올바른 것은?

[T_ORDER 데이터]
ID=1 (DT: '01.01', AMT: 1000)
ID=2 (DT: '01.02', AMT: 1000)  <-- 3행과 DT 동점!
ID=3 (DT: '01.02', AMT: 2000)  <-- 2행과 DT 동점!

SELECT ID,
       SUM(AMT) OVER (ORDER BY DT) AS S1,
       SUM(AMT) OVER (ORDER BY DT ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS S2
FROM T_ORDER;
  1. 1S1 = 2000 / S2 = 2000
  2. 2S1 = 4000 / S2 = 2000
  3. 3S1 = 2000 / S2 = 4000
  4. 4S1 = 4000 / S2 = 4000
POINT 252과목 · 윈도우함수

행 순서 · 비율 분석 함수 (LAG, LEAD, PERCENT_RANK, CUME_DIST, NTILE)

최빈출 ★★★
쉬운 비유 & 직관적 이해

PERCENT_RANK는 1등을 0점, 꼴찌를 1점으로 두고 줄을 세우는 것이고, CUME_DIST는 1등도 자기 몫(1/N)을 챙겨서 0보다 큰 값으로 출발하는 누적 분포입니다.

시험장 단골 오답 함정

PERCENT_RANK()의 1등 값을 0이 아니라 0.25로 계산하거나, 10개 행을 NTILE(4)로 나눌 때 남는 2개 행을 뒤쪽 조에 배정한다고 착각합니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    LAG(컬럼, N, 기본값)은 이전(위쪽) N번째 행 값을 가져오고, LEAD(컬럼, N, 기본값)는 다음(아래쪽) N번째 행 값을 가져온다.
  • 2
    RATIO_TO_REPORT(컬럼)는 파티션 전체 합계 대비 현재 행 값의 비율을 구하며, OVER() 안에 ORDER BY를 사용할 수 없다.
  • 3
    PERCENT_RANK() 공식은 (RANK - 1) / (전체행수 - 1)이므로 1등은 무조건 0, 꼴찌는 무조건 1이다.
  • 4
    CUME_DIST() 공식은 (현재 값 이하 행 수) / (전체행수)이므로 절대 0이 될 수 없으며 1/N ~ 1 사이의 값을 가진다.
  • 5
    NTILE(N)에서 전체 행 수가 N으로 나누어떨어지지 않으면, 남는 나머지 행들은 1번 조부터 차례대로 1개씩 더 배정한다!
📋 총 4명의 점수 [100, 80, 60, 40]에 대한 행/비율 함수 결과 비교표
점수LAG(점수, 1, 0)LEAD(점수, 1, 0)PERCENT_RANK()CUME_DIST()RATIO_TO_REPORT(점수)
100 (1등)0 ★ (이전 행 없음)800 ★ ( (1-1)/(4-1) )0.25 ★ ( 1/4 )100 / 280
80 (2등)100601/3 (0.33)0.50 ( 2/4 )80 / 280
60 (3등)80402/3 (0.67)0.75 ( 3/4 )60 / 280
40 (4등)600 ★ (다음 행 없음)1.0 ( (4-1)/(4-1) )1.00 ( 4/4 )40 / 280
SQL 실전 검증 코드Oracle / ANSI SQL
-- 총 10명의 사원을 급여순으로 NTILE(4) 분할할 때 조별 인원수는?
-- 10 ÷ 4 = 몫 2명, 나머지 2명!
-- 나머지 2명은 1조와 2조에 각각 1명씩 추가 배정됨!
-- 결과: 1조(3명: 1,1,1), 2조(3명: 2,2,2), 3조(2명: 3,3), 4조(2명: 4,4)
💡 실행 해설: NTILE(N) 문제가 나오면 '전체 행 수 ÷ N'의 나머지를 구해 1번 그룹부터 +1씩 더해주면 바로 풀립니다.
대표 실전 확인 문제 (Q.25)

Q. 총 10명의 학생 데이터를 성적순으로 정렬하여 아래 윈도우 함수를 적용했을 때의 결과 설명으로 옳은 것은?

  1. 1PERCENT_RANK() 함수를 적용하면 1등 학생의 결과값은 0.1 이다.
  2. 2CUME_DIST() 함수를 적용하면 1등 학생의 결과값은 0 이다.
  3. 3NTILE(4) 함수를 적용하면 1조부터 4조까지의 인원수는 각각 3명, 3명, 2명, 2명으로 배정된다.
  4. 4RATIO_TO_REPORT(SCORE) OVER (ORDER BY SCORE DESC) 구문은 성적순 누적 비율을 정상 반환한다.
POINT 262과목 · TopN쿼리

Top-N 쿼리와 Oracle ROWNUM의 치명적 함정 2가지

최빈출 ★★★
쉬운 비유 & 직관적 이해

Oracle의 ROWNUM은 식당 입구(WHERE 절)를 통과하는 손님에게 실시간으로 1번부터 나눠주는 대기번호표입니다. 1번 손님을 돌려보내면 다음 손님이 다시 1번표를 받기 때문에 '2번 손님만 들어오세요(ROWNUM = 2)'라고 하면 영원히 아무도 못 들어옵니다!

시험장 단골 오답 함정

WHERE ROWNUM <= 5 ORDER BY SAL DESC 쿼리가 급여 상위 5명을 뽑아준다고 착각하거나, WHERE ROWNUM = 2가 두 번째 행을 출력한다고 고릅니다.

🔄 ROWNUM 오답 쿼리 vs 정답 쿼리 실행 흐름 비교
[오답 1] WHERE ROWNUM > 1
첫 행(1번) 탈락 → 다음 행도 다시 1번 부여되어 영구 탈락
결과: 0건!
[오답 2] WHERE ROWNUM<=5 ORDER BY
무작위 5건 선할당 후 정렬 (가짜 Top-5)
순서 오류!
[정답] FROM (SELECT...ORDER BY) WHERE ROWNUM<=5
인라인 뷰 정렬 완료 후 상위 5건 추출
정석 Top-5!
시험장 1초 판별 공식 (핵심 정리)
  • 1
    함정 1: 인라인 뷰 없이 단독으로 쓰인 WHERE ROWNUM = 2 또는 WHERE ROWNUM > 1 조건의 결과는 무조건 0건(공집합)이다!
  • 2
    함정 2: 같은 쿼리 블록에서 WHERE ROWNUM <= 5 ORDER BY SAL DESC를 쓰면, WHERE가 먼저 실행되어 정렬되지 않은 무작위 5건을 먼저 자른 뒤 그 5건만 정렬한다!
  • 3
    올바른 Top-N 추출: 반드시 인라인 뷰(서브쿼리) 안에서 ORDER BY를 먼저 수행한 후 바깥 쿼리에서 WHERE ROWNUM <= N으로 잘라야 한다 (또는 FETCH FIRST N ROWS ONLY 사용).
📋 DBMS별 올바른 Top-N 쿼리 작성법
방식올바른 SQL 구문 예시동점자 처리 및 특징
Oracle 전통 방식 (인라인 뷰)SELECT * FROM (SELECT * FROM EMP ORDER BY SAL DESC) WHERE ROWNUM <= 3;반드시 인라인 뷰 내부에서 정렬을 먼저 완료해야 함
ANSI 표준 / Oracle 12c+SELECT * FROM EMP ORDER BY SAL DESC FETCH FIRST 3 ROWS ONLY;동점자 포함 시 ONLY 대신 WITH TIES 사용
SQL Server (MSSQL)SELECT TOP(3) WITH TIES * FROM EMP ORDER BY SAL DESC;WITH TIES 옵션으로 3위 동점자까지 함께 추출 가능
대표 실전 확인 문제 (Q.26)

Q. Oracle DBMS에서 EMP 테이블(총 14건)의 급여(SAL) 상위 2번째~5번째 사원을 조회하거나 상위 N명을 추출하려는 아래 쿼리 설명 중 옳은 것은?

  1. 1SELECT * FROM EMP WHERE ROWNUM = 2; 를 실행하면 두 번째 행 1건이 정상 출력된다.
  2. 2SELECT * FROM EMP WHERE ROWNUM > 1 AND ROWNUM <= 5; 를 실행하면 2번째부터 5번째까지 총 4건이 출력된다.
  3. 3SELECT * FROM EMP WHERE ROWNUM <= 5 ORDER BY SAL DESC; 를 실행하면 전사 급여 상위 5명이 정확히 출력된다.
  4. 4SELECT * FROM (SELECT * FROM EMP ORDER BY SAL DESC) WHERE ROWNUM <= 5; 를 실행해야 급여 상위 5명이 정확히 출력된다.
POINT 272과목 · 계층형쿼리

계층형 질의 (CONNECT BY PRIOR) 순방향 vs 역방향 전개

최빈출 ★★★
쉬운 비유 & 직관적 이해

등호(=)의 왼쪽이냐 오른쪽이냐는 아무 상관이 없습니다! 오직 'PRIOR'라는 이름표가 사번(자식키) 목에 걸려 있는지, 매니저(부모키) 목에 걸려 있는지만 보면 됩니다.

시험장 단골 오답 함정

'PRIOR가 왼쪽에 있으면 순방향, 오른쪽에 있으면 역방향'이라고 잘못 외웠다가 CONNECT BY MGR = PRIOR EMPNO를 역방향이라고 골라 틀립니다 (제보 #278).

🔄 조직도 트리 전개 방향: KING(사번 100, MGR NULL) → JONES(사번 200, MGR 100) → SCOTT(사번 300, MGR 200)
순방향 전개 (Top-Down: 위 → 아래)
PRIOR EMPNO(자식) = MGR(부모) 또는 MGR = PRIOR EMPNO
PRIOR 사번 = 순방향!
역방향 전개 (Bottom-Up: 아래 → 위)
PRIOR MGR(부모) = EMPNO(자식) 또는 EMPNO = PRIOR MGR
PRIOR 매니저 = 역방향!
시험장 1초 판별 공식 (핵심 정리)
  • 1
    PRIOR 자식키(EMPNO) = 부모키(MGR) (또는 MGR = PRIOR EMPNO): 부모에서 자식으로 내려가는 순방향 전개(Top-Down)이다!
  • 2
    PRIOR 부모키(MGR) = 자식키(EMPNO) (또는 EMPNO = PRIOR MGR): 자식에서 부모로 거슬러 올라가는 역방향 전개(Bottom-Up)이다!
  • 3
    계층형 질의에서 WHERE 절 조건은 계층 전개가 모두 끝난 뒤에 개별 행을 필터링하며, CONNECT BY 절에 적은 조건은 전개 과정 자체에서 하위 가지치기(Pruning)를 수행한다.
  • 4
    ORDER SIBLINGS BY 컬럼은 계층 트리 구조를 깨뜨리지 않고 같은 레벨(형제 노드)끼리만 정렬한다.
📋 계층형 질의 필수 키워드 · 가상 컬럼 · 함수 총정리
키워드 / 가상 컬럼역할 및 반환값시험장 핵심 체크포인트
START WITH 조건계층 전개를 시작할 루트(Root) 노드 조건 지정 (예: START WITH MGR IS NULL)조건을 만족하는 행이 여러 개면 다중 루트로 각각 전개됨
LEVEL루트 노드가 1, 하위 단계로 갈수록 2, 3, 4... 반환현재 행의 트리 깊이(Depth) 표시
CONNECT_BY_ISLEAF더 이상 자식이 없는 말단(Leaf) 노드이면 1, 자식이 있으면 0 반환루트가 아님! 말단(잎사귀) 여부를 1/0으로 반환
CONNECT_BY_ROOT 컬럼현재 행이 속한 최상위 루트 노드의 해당 컬럼 값 반환단항 연산자 형태로 컬럼 앞에 기술
SYS_CONNECT_BY_PATH(열, '/')루트부터 현재 행까지의 경로를 구분자('/')로 연결해 반환예: /KING/JONES/SCOTT
ORDER SIBLINGS BY 열계층 구조를 유지하면서 같은 부모를 둔 형제 노드끼리만 정렬일반 ORDER BY를 쓰면 계층 트리 순서가 완전히 깨짐!
대표 실전 확인 문제 (Q.27)

Q. 조직도 테이블 ORG(EMPNO: 사번, ENAME: 성명, MGR: 상사사번)에서 사장(MGR IS NULL)부터 시작하여 부하직원으로 내려가는 [순방향 전개(Top-Down)] 계층형 질의를 작성할 때, 빈칸 ( ㄱ )에 들어갈 구문으로 올바른 것을 모두 고른 것은?

SELECT LEVEL, EMPNO, ENAME, MGR
FROM ORG
START WITH MGR IS NULL
CONNECT BY (       ㄱ       )
ORDER SIBLINGS BY EMPNO;

[보기]
(a) PRIOR EMPNO = MGR      (b) PRIOR MGR = EMPNO
(c) MGR = PRIOR EMPNO      (d) EMPNO = PRIOR MGR
  1. 1(a), (b)
  2. 2(a), (c)
  3. 3(b), (d)
  4. 4(c), (d)
POINT 282과목 · pivot & unpivot

PIVOT과 UNPIVOT의 구조 및 암묵적 그룹화 규칙

빈출 ★★☆
쉬운 비유 & 직관적 이해

PIVOT은 세로로 긴 영수증(행)을 가로로 넓은 엑셀 요약표(열)로 눕히는 것이고, UNPIVOT은 가로로 넓은 표(열)를 다시 세로로 긴 데이터(행)로 세우는 것입니다.

시험장 단골 오답 함정

PIVOT 절 앞에 인라인 뷰 없이 원본 테이블 전체 컬럼을 그대로 넣으면, PIVOT에 쓰이지 않은 나머지 컬럼(예: 주문번호 PK)까지 자동으로 GROUP BY 기준이 되어 행이 쪼개진다는 점을 놓칩니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    PIVOT (집계함수(값컬럼) FOR 회전컬럼 IN (값1, 값2...)): 행 데이터를 열로 회전시켜 집계한다.
  • 2
    PIVOT 절 내부의 집계 컬럼과 FOR 절 컬럼을 제외한 나머지 모든 원본 컬럼은 암묵적 GROUP BY 기준이 된다! 따라서 반드시 인라인 뷰로 필요한 컬럼만 추출해서 PIVOT에 넣어야 한다.
  • 3
    UNPIVOT (값컬럼명 FOR 회전컬럼명 IN (열1, 열2...)): 열 데이터를 행으로 세우며, 기본적으로 값이 NULL인 행은 결과에서 제외(EXCLUDE NULLS)된다 (포함하려면 INCLUDE NULLS 명시).
원본 데이터 vs SQL 실행 결과 비교 (PIVOT (SUM(AMT) FOR QUARTER IN ('Q1' AS Q1, 'Q2' AS Q2)) 실행)
[Before] PIVOT 전: 인라인 뷰 원본 데이터 (3행)
REGION (암묵적 그룹 기준)QUARTER (FOR 회전열)AMT (집계값)
서울Q1100
서울Q2200
부산Q1150
[After] PIVOT 후: 가로로 펼쳐진 요약 테이블 (2행)
REGIONQ1Q2해설
서울100200서울의 Q1, Q2 금액이 각각 가로 열로 배치됨
부산150NULL ★부산의 Q2 데이터는 없으므로 NULL로 채워짐 (다시 UNPIVOT 하면 이 NULL 칸은 기본 제외되어 3행으로 복구됨!)
📋 PIVOT vs UNPIVOT 핵심 비교
구분PIVOT (행 → 열 회전)UNPIVOT (열 → 행 세우기)
방향세로 행(Row) 값들을 가로 열(Column) 헤더로 변환가로 열(Column) 헤더들을 세로 행(Row) 값으로 변환
집계 함수 유무⭕ 반드시 집계 함수(SUM, COUNT, AVG 등) 필수!❌ 집계 함수 사용하지 않음 (단순 구조 변환)
다중 집계 시 열 이름IN 절 별칭 + '_' + 집계 별칭 조합 (예: Q1_SUM, Q1_CNT)지정한 단일 컬럼명으로 통합
대표 실전 확인 문제 (Q.28)

Q. 주문실적 테이블 SALES(ORDER_ID, REGION, QUARTER, AMT)에서 지역(REGION)별로 분기(QUARTER: 'Q1', 'Q2') 매출합계를 가로 열로 회전시켜 지역당 1줄씩 총 2줄(서울, 부산)로 요약 출력하려고 한다. 다음 중 가장 올바른 SQL은?

  1. 1SELECT * FROM SALES PIVOT (SUM(AMT) FOR QUARTER IN ('Q1', 'Q2'));
  2. 2SELECT * FROM (SELECT REGION, QUARTER, AMT FROM SALES) PIVOT (SUM(AMT) FOR QUARTER IN ('Q1', 'Q2'));
  3. 3SELECT * FROM (SELECT REGION, QUARTER, AMT FROM SALES) PIVOT (AMT FOR QUARTER IN ('Q1', 'Q2'));
  4. 4SELECT * FROM (SELECT REGION, QUARTER, AMT FROM SALES) UNPIVOT (SUM(AMT) FOR QUARTER IN ('Q1', 'Q2'));
POINT 292과목 · 정규표현식

정규표현식 (REGEXP_LIKE, REGEXP_SUBSTR, 메타문자)

빈출 ★★☆
쉬운 비유 & 직관적 이해

똑같은 캐럿(^) 기호라도 대괄호 밖(^A)에 서 있으면 '출발선(문자열의 시작)'을 뜻하고, 대괄호 안([^A])에 들어가 있으면 '출입금지(NOT A)'를 뜻합니다!

시험장 단골 오답 함정

^[0-9]와 [^0-9]를 똑같이 숫자로 시작하는 문자열로 해석하거나, *와 +의 반복 횟수(0회 이상 vs 1회 이상)를 헷갈립니다.

시험장 1초 판별 공식 (핵심 정리)
  • 1
    대괄호 밖의 ^패턴은 문자열의 시작을 의미하고, 대괄호 안의 [^패턴]은 해당 문자들을 제외한 부정(NOT) 문자 1개를 의미한다.
  • 2
    수량자 구분: *는 0회 이상 반복, +는 1회 이상 반복, ?는 0회 또는 1회, {m,n}은 m회 이상 n회 이하 반복을 의미한다.
  • 3
    문자열 전체가 패턴과 정확히 일치하는지 검증하려면 시작 앵커(^)와 끝 앵커($)를 함께 사용해야 부분 일치를 막을 수 있다.
📋 시험장 필수 정규표현식 메타문자 완벽 비교표
메타문자 패턴정확한 의미매칭 성공 (O)매칭 실패 (X)
^[0-9]숫자로 시작하는 문자열 (대괄호 밖 ^ = 시작)'1ABC', '99''A123' (문자로 시작)
[^0-9]숫자가 아닌 문자가 1개라도 포함된 문자열 (대괄호 안 ^ = NOT!)'12A3', '010-1234''12345' (전부 숫자뿐이므로 실패!)
AB*CA 뒤에 B가 0번 이상 나오고 C가 오는 패턴 (* = 0회 이상)'AC' ★ (0번도 통과!), 'ABC', 'ABBC''ADC'
AB+CA 뒤에 B가 최소 1번 이상 나오고 C가 오는 패턴 (+ = 1회 이상)'ABC', 'ABBC''AC' ★ (B가 0번이라 실패!)
A.BA와 B 사이에 임의의 문자 정확히 1글자 (. = 임의의 1글자)'ACB', 'A1B''AB' (0글자), 'ACDB' (2글자)
SQL 실전 검증 코드Oracle / ANSI SQL
-- 1) 숫자가 아닌 모든 특수문자('-', 공백 등) 제거하기:
SELECT REGEXP_REPLACE('010-1234-5678', '[^0-9]', '') FROM DUAL;
-- 결과: '01012345678'

-- 2) 영문+숫자 묶음 중 2번째 매칭되는 구간 추출하기:
SELECT REGEXP_SUBSTR('A10-B20-C30', '[A-Z][0-9]+', 1, 2) FROM DUAL;
-- 결과: 'B20'
💡 실행 해설: REGEXP_REPLACE에서 '[^0-9]'를 빈 문자열('')로 치환하면 숫자만 남는다는 패턴은 실무와 시험 모두에서 단골로 출제됩니다.
대표 실전 확인 문제 (Q.29)

Q. 다음 정규표현식 조건 중 문자열 `'A123'`과 매칭(TRUE)되지 않는 것은?

  1. 1REGEXP_LIKE('A123', '^[A-Z][0-9]+$')
  2. 2REGEXP_LIKE('A123', '[^0-9]')
  3. 3REGEXP_LIKE('A123', '^[0-9]')
  4. 4REGEXP_LIKE('A123', 'A.23')
POINT 302과목 · 관리구문

DML / DDL / TCL과 트랜잭션, 참조 무결성 (DELETE vs TRUNCATE, SAVEPOINT, CASCADE)

최빈출 ★★★
쉬운 비유 & 직관적 이해

DELETE는 연필로 쓴 글씨를 지우개로 한 줄씩 지우는 것(취소 ROLLBACK 가능)이고, TRUNCATE는 노트 속지를 통째로 찢어 버리고 새 속지를 끼우는 것(복구 불가, 용량 초기화), DROP은 노트 자체를 소각장에 태워버리는 것입니다.

시험장 단골 오답 함정

INSERT 후 CREATE TABLE(DDL)을 실행하고 ROLLBACK을 하면 앞서 넣은 INSERT가 취소된다고 착각하거나, ROLLBACK TO S1 이후에 S2로 다시 갈 수 있다고 착각합니다.

🔄 트랜잭션 SAVEPOINT 이동 및 Oracle DDL 자동 커밋 타임라인
① INSERT 10 → SAVEPOINT S1
현재 데이터: [10] / S1 저장
진행 중
② INSERT 20 → SAVEPOINT S2 → INSERT 30
현재 데이터: [10, 20, 30] / S2 저장
진행 중
③ ROLLBACK TO S1 실행!
20, 30 취소 → 데이터: [10] (★주의: 미래의 S2는 영구 소멸!)
S2 소멸!
④ CREATE TABLE 실행 (Oracle DDL)
DDL 실행 순간 직전 데이터 [10] 강제 자동 COMMIT!
이후 ROLLBACK 무효!
시험장 1초 판별 공식 (핵심 정리)
  • 1
    DELETE(DML)는 로그를 남기며 ROLLBACK이 가능하지만 디스크 용량은 즉시 반환되지 않는다. 반면 TRUNCATE(DDL)는 구조만 남기고 전체 행을 즉시 삭제하며 Auto-Commit이 발생해 ROLLBACK이 절대 불가능하다!
  • 2
    Oracle에서는 트랜잭션 도중 DDL(CREATE, ALTER, DROP, TRUNCATE)을 실행하면 그 순간 직전까지의 모든 미결 DML이 암시적으로 자동 COMMIT되어 이후 ROLLBACK을 해도 취소되지 않는다! (단, SQL Server는 DDL도 ROLLBACK 가능).
  • 3
    SAVEPOINT S1 → SAVEPOINT S2 순서일 때, 상위인 ROLLBACK TO S1을 실행하면 그 이후에 생성했던 S2는 함께 소멸되어 다시 ROLLBACK TO S2를 실행할 수 없다.
  • 4
    외래키 ON DELETE CASCADE 옵션이 설정된 경우, 부모 테이블의 행을 삭제하면 해당 부모를 참조하던 자식 테이블의 행들도 자동으로 연쇄 삭제된다.
📋 데이터 삭제 명령어 3형제 (DELETE vs TRUNCATE vs DROP) 완벽 비교표
비교 항목DELETE FROM TTRUNCATE TABLE TDROP TABLE T
명령어 분류DML (데이터 조작어)DDL (데이터 정의어)DDL (데이터 정의어)
WHERE 조건절 사용⭕ 가능 (일부 행 선택 삭제)❌ 불가 (무조건 전체 행 삭제)❌ 불가
ROLLBACK (복구) 여부⭕ 가능! (COMMIT 전 복구 가능)❌ 절대 불가! (Auto-Commit)❌ 절대 불가! (Auto-Commit)
테이블 구조(스키마) 유지⭕ 유지됨⭕ 구조는 남기고 데이터만 초기화❌ 테이블 구조와 인덱스까지 완전 삭제
저장 공간(용량) 반환❌ 반환 안 함⭕ 즉시 저장 공간 반환 (HWM 초기화)⭕ 즉시 저장 공간 반환
대표 실전 확인 문제 (Q.30)

Q. Oracle DBMS에서 빈 테이블 T(COL NUMBER)를 생성한 직후 아래 SQL 문장들을 순서대로 실행했을 때, 최종적으로 테이블 T에 남아있는 데이터의 행 개수와 값으로 올바른 것은?

INSERT INTO T VALUES (10);
SAVEPOINT SP1;
INSERT INTO T VALUES (20);
SAVEPOINT SP2;
DELETE FROM T WHERE COL = 10;
ROLLBACK TO SP1;
INSERT INTO T VALUES (30);
CREATE TABLE T_DUMMY (ID NUMBER); -- DDL 실행!
ROLLBACK;
  1. 10건 (공집합)
  2. 21건 (10)
  3. 32건 (10, 30)
  4. 43건 (10, 20, 30)