728x90
반응형
001 문제: SQL을 ANSI 표준 구문으로 변환하기
(SQL 자격검정 실전문제 문제집 P60,46번 문제)
아래의 오래된 SQL을 동일한 결과를 출력하는 ANSI 표준 구문으로 변환하고자 한다.
가장 적절한 SQL을 선택하시오.
[문제에서 제시한 SQL (오라클 구식 OUTER JOIN)]
SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A, 게시글 B
WHERE A.게시판ID = B.게시판ID(+)
AND B.삭제여부(+) = 'N'
AND A.사용여부 = 'Y'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;
[테이블 구조]
게시판(A)
컬럼명 | 설명 |
게시판ID (PK) | 게시판의 고유 ID |
게시판명 | 게시판의 이름 |
사용여부 | 사용 가능 여부 (Y 또는 N) |
게시글(B)
컬럼명 | 설명 |
게시글ID (PK) | 게시글의 고유 ID |
게시판ID (FK) | 게시판 테이블(A)과 연결되는 외래 키 |
제목 | 게시글 제목 |
내용요약 | 게시글 내용 요약 |
등록일시 | 게시글 등록 시간 |
등록자명 | 게시글 작성자 |
삭제여부 | 게시글 삭제 여부 (Y 또는 N) |
[보기]
①
SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A LEFT OUTER JOIN 게시글 B
ON A.게시판ID = B.게시판ID AND B.삭제여부 = 'N'
WHERE A.사용여부 = 'Y'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;
②
SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A LEFT OUTER JOIN 게시글 B
ON (A.게시판ID = B.게시판ID AND A.사용여부 = 'Y')
WHERE B.삭제여부 = 'N'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;
③
SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A LEFT OUTER JOIN 게시글 B
ON (A.게시판ID = B.게시판ID)
WHERE A.사용여부 = 'Y'
AND B.삭제여부 = 'N'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;
[해설 및 정답]
1. (+)의 의미
제시된 SQL에서 사용된 (+)는 오라클의 구식 OUTER JOIN 문법입니다.
- B.게시판ID(+) → LEFT OUTER JOIN을 의미하며, 게시판(A)은 모두 표시되지만 게시글(B)이 없으면 NULL이 반환됩니다.
- B.삭제여부(+) = 'N' → 삭제되지 않은 게시글만 포함하지만, 게시글이 없는 경우도 유지.
- A.사용여부 = 'Y' → 사용 가능한 게시판만 필터링.
2. ANSI 표준 SQL 변환
(+)을 LEFT OUTER JOIN으로 변환하면 다음과 같습니다.
SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A
LEFT OUTER JOIN 게시글 B
ON A.게시판ID = B.게시판ID
AND B.삭제여부 = 'N'
WHERE A.사용여부 = 'Y'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;
✅ 변경된 점
오라클 구식 | SQL ANSI 표준 SQL |
A, B 쉼표(,) JOIN | LEFT OUTER JOIN 사용 |
B.게시판ID(+) | ON A.게시판ID = B.게시판ID |
B.삭제여부(+) = 'N' | ON A.게시판ID = B.게시판ID AND B.삭제여부 = 'N' |
3. 선택지 검토 및 정답
✅ 정답: ①
SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A LEFT OUTER JOIN 게시글 B
ON A.게시판ID = B.게시판ID AND B.삭제여부 = 'N'
WHERE A.사용여부 = 'Y'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;
- LEFT OUTER JOIN을 사용하여 B.삭제여부 = 'N'을 ON 절에서 필터링 → 삭제된 게시글 제외
- WHERE A.사용여부 = 'Y'로 사용 가능한 게시판만 필터링.
- ANSI 표준 SQL을 올바르게 적용함.
❌ 오답 분석
②
SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A LEFT OUTER JOIN 게시글 B
ON (A.게시판ID = B.게시판ID AND A.사용여부 = 'Y')
WHERE B.삭제여부 = 'N'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;
- 잘못된 점: ON 절에서 A.사용여부 = 'Y'를 필터링 → JOIN 결과가 변경될 수 있음.
- LEFT OUTER JOIN 의미 상실: WHERE B.삭제여부 = 'N'이 적용되면서 게시글이 없는 게시판이 사라질 가능성 있음.
③
SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNT
FROM 게시판 A LEFT OUTER JOIN 게시글 B
ON (A.게시판ID = B.게시판ID)
WHERE A.사용여부 = 'Y'
AND B.삭제여부 = 'N'
GROUP BY A.게시판ID, A.게시판명
ORDER BY A.게시판ID;
- 잘못된 점: WHERE B.삭제여부 = 'N'을 사용하여 OUTER JOIN 결과가 손실됨.
- 게시글이 없는 게시판도 포함해야 하는데, WHERE 절에서 B.삭제여부 = 'N'을 강제하면 게시글이 없는 게시판이 제외됨.
4. 결론
✅ 정답은 ①번 SQL
- LEFT OUTER JOIN을 유지하면서 B.삭제여부 = 'N'을 ON 절에서 필터링하여 삭제되지 않은 게시글만 포함.
- WHERE A.사용여부 = 'Y'로 사용 가능한 게시판만 필터링.
- 게시판별로 COUNT(B.게시글ID)를 사용하여 게시글 개수를 정확히 집계.
🚀 즉, ANSI 표준 SQL을 사용할 때는 LEFT OUTER JOIN을 적절히 사용하여 데이터 손실 없이 변환하는 것이 중요합니다.\
문제 002: 집합 연산자에 대한 설명으로 가장 적절하지 않은 것은?
① UNION 연산자는 합집합 결과에서 중복된 행을 하나의 행으로 만든다.
② UNION ALL 연산자는 집합 간의 결과가 중복되지 않는 경우, UNION과 결과가 동일하다.
③ UNION 연산자를 사용한 SQL은 각각의 집합에 GROUP BY절을 사용할 수 있다.
④ UNION 연산자를 사용한 SQL은 각각의 집합에 ORDER BY절을 사용할 수 있다.
✅ 정답은 4번
집합(SET) 연산자를 사용한 SQL의 ORDER BY절은 최종 결과를 정렬하며, 가장 마지막 줄에 한번만 사용할 수 있다.
문제 003: 아래 중 윈도우 함수(Window Function)에 대한 설명으로 가장 적절하지 않은 것을 고르시오.
① PARTITION BY 절과 GROUP BY 절은 의미적으로 유사하다.
② PARTITION BY 절이 없으면 전체 집합을 하나의 Partition으로 정의한 것과 동일하다.
③ 윈도우 함수 처리로 결과 건수가 줄어든다.
④ 윈도우 함수 적용 범위는 Partition을 넘을 수 없다.
❌ ③ 윈도우 함수 처리로 결과 건수가 줄어든다.
- 틀린 설명입니다!
- 윈도우 함수는 기존 행을 유지한 채 계산된 값을 추가합니다.
문제004
이기적 CBT, 영진닷컴 모의고사 6번 문제
문제007
이기적 CBT, 영진닷컴 모의고사 7번 문제
문제 008
이기적 CBT, 영진닷컴 모의고사 37번 문제
문제 009
이기적 CBT, 영진닷컴 모의고사 11번 문제
미분류 문제
728x90
반응형
'자격증 > SQLD' 카테고리의 다른 글
SQLD 84점 합격 리뷰 ( 난이도, 독학 방법 및 자료) (0) | 2025.03.28 |
---|---|
[SQLD SP02] 물리적 JOIN(조인)의 모든 것 (0) | 2025.02.27 |
[SQLD SP01]JOIN에서 ON과 WHERE 차이 (0) | 2025.02.26 |
[SQLD] 5-2: 데이터 정의어(DDL) & 데이터 제어어(DCL) (0) | 2025.02.22 |
[SQLD] 5-1: 데이터 조작어 (DML) 와 트랜잭션 제어(TCL) (0) | 2025.02.22 |