틀린문제 유형별·핵심 개념별로 묶어 완벽하게 이해하고 오답을 정리할 수 있도록 분석
1. 데이터 모델링 & 관계 (Q1, Q6, Q9)
📌 Q1. 엔터티 분류 (정답: ②)
* 핵심 개념: 발생 시점에 따른 엔터티 분류
* 기본/키 엔터티(Key Entity): 업무에 원래 존재하는 독립적 엔터티 (사원, 부서, 고객, 상품 등).
* 중심 엔터티(Main Entity): 기본 엔터티로부터 발생하며 업무의 중심이 되는 엔터티 (주문, 청구, 프로젝트, 매출 등).
* 행위 엔터티(Action Entity): 2개 이상의 부모 엔터티로부터 빈번하게 생성/변경되는 엔터티 (주문내역, 로그, 변경이력 등).
* 오답 포인트: 프로젝트는 사원/부서 등의 활동에 의해 발생하는 중심 엔터티입니다.
📌 Q6. 식별자 vs 비식별자 관계 (정답: ②)
* 핵심 개념:
* 식별자 관계: 부모와 자식의 생명주기가 동일(부모가 삭제되면 자식도 삭제)하거나 강한 종속일 때 사용.
* 비식별자 관계: 부모와 자식의 생명주기가 다름(부모가 없어져도 자식 유지), FK가 선택적(NULL 허용), 상속받은 속성이 불필요하게 PK가 되는 것을 방지할 때 사용.
* 오답 포인트: '생명주기를 동일하게 관리'하는 경우는 비식별자가 아니라 식별자 관계의 특징입니다.
📌 Q9. ERD 관계 해석 (정답: ③)
* 핵심 개념: 다대다 관계 해소 엔터티의 식별성
* '수강' 엔터티는 보통 (학번, 과목번호) 또는 고유한 수강번호를 PK로 가집니다.
* 기본키(PK)는 유일성(Uniqueness)을 가지므로 동일한 수강번호를 여러 학생이 공유할 수 없습니다.
2. SQL 기본 문법 & 함수 (Q11, Q12, Q26, Q41, Q42, Q43)
📌 Q11. 문자열 함수 TRIM 문법 (정답: ①)
* 핵심 개념: Oracle의 TRIM 문법은 인자 방식이 다릅니다.
* LTRIM(str, 'x'), RTRIM(str, 'x') \rightarrow 콤마(,) 사용 가능
* REPLACE(str, 'x') \rightarrow 콤마(,) 사용
* TRIM \rightarrow TRIM('x' FROM str) 형태를 써야 합니다. TRIM(str, 'x')는 ORA-00909(인수의 개수가 부적합합니다) 에러가 발생합니다.
📌 Q12. 와일드카드 이스케이프 (정답: ②)
* 핵심 개념: LIKE에서 _(한 글자 매칭) 자체를 문자로 찾으려면 ESCAPE를 지정해야 합니다.
* WHERE COL LIKE '%a\_c%' ESCAPE '\' \rightarrow \_가 순수 문자 _로 처리되어 'a_c'가 포함된 1건만 조회됩니다.
📌 Q26. NULL 비교 연산 (정답: ①)
* 핵심 개념: NULL은 '알 수 없는 값'이므로 =, <>, != 연산자로 비교할 수 없으며 결과가 UNKNOWN이 됩니다.
* 반드시 IS NULL 또는 IS NOT NULL을 사용해야 합니다.
📌 Q41. REGEXP_INSTR 함수 (정답: ③)
* 핵심 개념: REGEXP_INSTR(문자열, 패턴)은 패턴이 처음 시작하는 문자 인덱스(1부터 시작)를 반환합니다.
* '123123123'에서 '312'는 3번째 글자인 '3'부터 시작하므로 3을 반환합니다.
📌 Q42. 정규표현식 이메일 검증 (정답: ①)
* 핵심 개념:
* ^ (시작), $ (끝)
* \w+ (영문/숫자/_ 1자 이상)
* \. (마침표 문자 자체를 의미, 그냥 .은 임의의 한 문자를 뜻함)
* 정답: '^\w+@\w+\.com$'
📌 Q43. 따옴표(') 이스케이프 (정답: ②)
* 핵심 개념: SQL 문자열 리터럴 안에서 작은따옴표를 표현하려면 ''(연속 2개)를 사용합니다.
* SELECT '''A''''' FROM DUAL;
* 맨 앞/뒤 ' (문자열 감싸기) 제외 \rightarrow ''(') + A + ''(') + ' (남은 따옴표) \rightarrow 출력: 'A''
3. 조인, 집합 & 서브쿼리 (Q14, Q15, Q20, Q24, Q25, Q27, Q31)
📌 Q14. DCL 권한 회수 (정답: ④)
* 핵심 개념: REVOKE DELETE ON R FROM U1;은 U1의 DELETE 권한만 회수합니다.
* U1의 SELECT 권한은 그대로 남고, U2와 U3의 권한도 영향받지 않으므로 DBA, U1, U2, U3 모두 SELECT가 가능합니다.
📌 Q15. 조인 행 수 계산 (정답: ④)
* (ㄱ) CROSS JOIN: 3 \times 4 = 12행
* (ㄴ) INNER JOIN (BETWEEN):
* 100 \rightarrow C등급(50~149) : 1건
* 120 \rightarrow C등급(50~149) : 1건
* 200 \rightarrow B등급(150~249) : 1건 \rightarrow 총 3행
* (ㄷ) FULL OUTER JOIN: INNER 조인 3행 + 매칭되지 않은 GRADE(A등급, D등급) 2행 = 5행
* 총합: 12 + 3 + 5 = 20
📌 Q20. 서브쿼리 연산자 (정답: ①)
* 핵심 개념: 서브쿼리가 반환하는 결과가 2건 이상인 다중행 서브쿼리는 단일행 비교 연산자(=, >, <)를 사용할 수 없고, IN, ANY, ALL, EXISTS를 써야 합니다.
📌 Q24. NATURAL JOIN 제약사항 (정답: ①)
* 핵심 개념: NATURAL JOIN은 이름과 타입이 같은 컬럼을 자동으로 찾아 조인하므로 ON 절이나 USING 절을 함께 명시할 수 없습니다 (구문 에러).
📌 Q25. DISTINCT & 서브쿼리 (정답: ②)
* 풀이 과정:
* 서브쿼리: Tbl_B에서 E='E'인 D값 \rightarrow ('y', 'z')
* 메인 쿼리: Tbl_A에서 C IN ('y', 'z')인 행
* (2, a, z, 1), (2, a, y, 2), (3, b, y, 2)
* SELECT DISTINCT A, B 적용 \rightarrow (2, a), (3, b) \rightarrow 총 2건
📌 Q27. EXISTS 연산자 특징 (정답: ①)
* 핵심 개념: EXISTS는 조건을 만족하는 행을 1건이라도 찾는 즉시 True를 반환하고 검색을 중단하므로 대용량 데이터에서 성능상 매우 유리합니다.
📌 Q31. 스칼라 서브쿼리 (정답: ③)
* 핵심 개념: SELECT 절에 오는 스칼라 서브쿼리는 결과가 2건 이상이면 에러가 발생하지만, 0건(공집합)일 경우 에러가 아니라 NULL을 반환합니다.
4. 그룹화, 소계 & 윈도우 함수 (Q21, Q29, Q30, Q34, Q35, Q40)
📌 Q21 & Q34. GROUPING 함수 & 소계 필터링 (Q21 정답: ① / Q34 정답: ①)
* 핵심 개념:
* GROUPING(컬럼): 소계/총계로 인해 생성된 가상 NULL 행은 1, 원본 데이터 집계 행은 0을 반환.
* Q34 풀이: GROUPING(ID) + GROUPING(TYPE) != 1
* (0, 0) \rightarrow 상세 데이터 (합=0) \rightarrow 포함
* (1, 0) 또는 (0, 1) \rightarrow 중간 소계 (합=1) \rightarrow 제외
* (1, 1) \rightarrow 전체 총합계 (합=2) \rightarrow 포함
* \rightarrow 중간 소계를 제외한 상세 데이터와 전체 총합계만 출력.
📌 Q29. RANK vs DENSE_RANK (정답: ①)
* 핵심 개념: 데이터 (200, 100, 100) 내림차순 정렬 시
* RANK(): 1등, 2등, 2등 \rightarrow 다음 순위는 건너뛰고 1, 2, 2, 4 (문제 예시 100, 100, 200 내림차순 \rightarrow 1, 1, 3)
* DENSE_RANK(): 1등, 1등 \rightarrow 건너뛰지 않고 1, 1, 2
📌 Q30. Oracle 정렬 시 NULL 처리 (정답: ①)
* 핵심 개념: Oracle에서 ASC(오름차순) 정렬 시 NULL은 가장 큰 값(무한대)으로 취급되어 맨 마지막에 위치합니다.
* ORDER BY COL3 ASC, COL2 ASC \rightarrow COL3가 같을 때 COL2의 날짜 오름차순(12-03 \rightarrow 12-15 \rightarrow NULL) 순으로 정렬됩니다.
📌 Q35. GROUPING SETS 특징 (정답: ②)
* 핵심 개념: GROUPING SETS(A, B)와 GROUPING SETS(B, A)는 개별 그룹의 합집합(UNION ALL)이므로 집계 결과 항목 자체는 동일합니다. (인수 순서에 따라 집계 대상 항목이 바뀌지 않음)
📌 Q40. 집계 함수 필터링 절 (정답: ③)
* 핵심 개념: WHERE 절에서는 SUM, COUNT 등 집계 함수를 직접 조건으로 사용할 수 없으며, 반드시 HAVING 절에서 필터링해야 합니다.
5. 계층형 쿼리, DDL/DML/트랜잭션 (Q17, Q39, Q45, Q46, Q49, Q50)
📌 Q17 & Q39. 계층형 질의 (Q17 정답: ④ / Q39 정답: ③)
* Q17: 계층형 쿼리 실행 순서는 START WITH \rightarrow CONNECT BY 전개 \rightarrow WHERE 절 필터링(가장 마지막) 입니다.
* Q39: DUAL에서 CONNECT BY LEVEL <= 2 실행 시 LEVEL이 1, 2인 가상 행 2건이 생성됩니다.
📌 Q45. 복합 뷰(View)의 DML 제약 (정답: ④)
* 핵심 개념: GROUP BY, 집계 함수, DISTINCT 등이 포함된 뷰는 여러 행이 하나로 축약되어 있으므로 1:1 행 매핑이 불가능하여 INSERT/UPDATE/DELETE를 수행할 수 없습니다.
📌 Q46. SAVEPOINT 롤백 (정답: ④)
* 실행 과정:
* 1, 2 삽입
* sv1 설정 \rightarrow 1을 4로 수정 (데이터: 4, 2)
* 동일 이름의 sv1 재설정 (이전 sv1을 덮어씀)
* no >= 2 삭제 (데이터: 4)
* ROLLBACK TO sv1 \rightarrow 4번 단계(삭제)만 취소되어 데이터는 다시 (4, 2) 상태로 복구됨
* 3 삽입 \rightarrow 최종 데이터: (4, 2, 3)
* MAX(no) \rightarrow 4
📌 Q49. CTAS 제약조건 복제 범위 (정답: ②)
* 핵심 개념: CREATE TABLE ... AS SELECT (CTAS) 구문은 테이블 구조와 데이터를 복사하지만, NOT NULL 제약조건만 복제됩니다. (PK, FK, CHECK, DEFAULT 등은 복제되지 않음)
📌 Q50. DEFAULT & 제약조건 INSERT (정답: ③)
* 테이블 정의: COL1 DEFAULT 9 PRIMARY KEY, COL2 NOT NULL
* ① INSERT INTO T1 VALUES (10); \rightarrow 컬럼 개수 불일치 에러
* ② INSERT INTO T1 (COL1, COL2) VALUES (NULL, 'A'); \rightarrow PK에 명시적 NULL 삽입 불가
* ③ INSERT INTO T1 (COL2) VALUES ('A'); \rightarrow COL1을 생략했으므로 DEFAULT 값인 9가 자동 입력되어 PK 만족, 정상 실행 ✅
* ④ INSERT INTO T1 (COL1) VALUES (10); \rightarrow NOT NULL인 COL2 누락 에러