SQL 개발자 자격증 2024년 55회차 기출 복원입니다. 각 문제 아래의 「정답·해설 보기」를 펼치면 정답과 해설이 나타나요. 실제 시험 환경(타이머·자동 채점·오답 누적)에서 풀어보고 싶다면 글 맨 아래 「직접 풀러가기」를 눌러주세요.
문제 1
4지선다내부 스키마에 대한 설명으로 가장 적절한 것은?
- 1.사용자별로 바라보는 데이터베이스의 논리적 관점을 정의한다.
- 2.데이터베이스 전체의 통합된 논리적 구조를 정의한다.
- 3.데이터가 물리적 저장 장치에 실제로 저장되는 방법을 표현한다.
- 4.응용 프로그램에서 사용하는 화면 단위의 데이터 구조만 표현한다.
정답·해설 보기▾
정답
3번. 데이터가 물리적 저장 장치에 실제로 저장되는 방법을 표현한다.
해설
정답: 3. 내부 스키마는 데이터베이스가 물리적 저장 장치에 실제로 저장되는 방법을 표현하는 스키마이다.
오답 풀이
- 1번: 외부 스키마에 가깝다.
- 2번: 개념 스키마에 가깝다.
- 3번: 내부 스키마에 대한 올바른 설명이다.
- 4번: 외부 사용자 관점의 일부일 수 있으나 내부 스키마 설명은 아니다.
보충 개념 3단계 스키마 구조는 외부 스키마, 개념 스키마, 내부 스키마로 나뉜다. 내부 스키마는 저장 구조, 인덱스, 접근 경로 등 물리적 저장 방식을 다룬다.
문제 2
4지선다엔터티명에 대한 설명으로 적절하지 않은 것은?
- 1.가능하면 현업 업무에서 사용하는 용어를 사용한다.
- 2.가능하면 약어를 사용한다.
- 3.단수 명사를 사용한다.
- 4.모든 엔터티에서 유일하게 이름이 부여되어야 한다.
정답·해설 보기▾
정답
2번. 가능하면 약어를 사용한다.
해설
정답: 2. 엔터티명은 가능하면 약어를 사용하지 않고 업무에서 사용하는 명확한 용어를 사용해야 한다.
오답 풀이
- 1번: 올바른 명명 기준이다.
- 2번: 약어는 의미 전달을 어렵게 하므로 부적절하다.
- 3번: 엔터티명은 일반적으로 단수 명사를 사용한다.
- 4번: 엔터티명은 모델 내에서 유일해야 한다.
보충 개념 엔터티명은 업무 의미를 명확히 표현해야 하며, 전체 모델 안에서 유일해야 한다. 약어는 조직 내 합의가 없다면 혼란을 유발할 수 있다.
문제 3
4지선다기본 엔터티에 대한 설명으로 적절하지 않은 것은?
- 1.업무에 원래 존재하는 정보이다.
- 2.다른 엔터티와의 관계에 의해 생성되지 않고 독립적으로 생성 가능하다.
- 3.다른 엔터티로부터 주식별자를 상속받는다.
- 4.타 엔터티의 부모 역할을 할 수 있다.
정답·해설 보기▾
정답
3번. 다른 엔터티로부터 주식별자를 상속받는다.
해설
정답: 3. 기본 엔터티는 다른 엔터티로부터 주식별자를 상속받지 않고 자신의 고유한 주식별자를 가진다.
오답 풀이
- 1번: 기본 엔터티의 특징이다.
- 2번: 기본 엔터티는 독립적으로 생성 가능하다.
- 3번: 다른 엔터티로부터 주식별자를 상속받는 것은 기본 엔터티의 특징이 아니다.
- 4번: 기본 엔터티는 중심 정보로서 다른 엔터티의 부모 역할을 할 수 있다.
보충 개념 엔터티는 발생 시점과 성격에 따라 기본 엔터티, 중심 엔터티, 행위 엔터티 등으로 구분할 수 있다. 기본 엔터티는 업무의 원천 데이터에 해당한다.
문제 4
4지선다다음 설명에 해당하는 정규화 단계로 가장 적절한 것은?
<보기> 복합 주식별자를 가진 테이블에서 일반 속성이 주식별자 전체가 아니라 일부 속성에만 종속되어 있어 이를 별도 테이블로 분리하였다.
- 1.제1정규화
- 2.제2정규화
- 3.제3정규화
- 4.보이스-코드 정규화
정답·해설 보기▾
정답
2번. 제2정규화
해설
정답: 2. 복합 식별자의 일부에만 종속되는 부분 함수 종속을 제거하는 것은 제2정규화이다.
오답 풀이
- 1번: 제1정규화는 반복 속성이나 다중값 속성을 제거한다.
- 2번: 부분 함수 종속 제거에 해당한다.
- 3번: 제3정규화는 이행 함수 종속을 제거한다.
- 4번: 보이스-코드 정규화는 결정자가 후보키가 되도록 하는 더 강한 정규화이다.
보충 개념 제2정규형은 제1정규형을 만족하면서 기본키 전체에 대해 완전 함수 종속을 만족해야 한다. 복합키 일부에만 의존하는 속성은 별도 엔터티로 분리한다.
문제 5
4지선다제1정규형에 대한 설명으로 적절하지 않은 것은?
- 1.속성의 원자성을 만족해야 한다.
- 2.반복 속성이나 다중값 속성을 제거한다.
- 3.하나의 속성에는 하나의 값만 저장되도록 한다.
- 4.일반 속성은 주식별자 전체에 종속되어야 한다.
정답·해설 보기▾
정답
4번. 일반 속성은 주식별자 전체에 종속되어야 한다.
해설
정답: 4. 일반 속성이 주식별자 전체에 종속되어야 한다는 설명은 제2정규형의 핵심 조건이다.
오답 풀이
- 1번: 제1정규형의 핵심 조건이다.
- 2번: 제1정규화는 반복 그룹과 다중값을 제거한다.
- 3번: 원자값만 저장하도록 하는 설명이다.
- 4번: 부분 함수 종속 제거와 관련된 제2정규형 설명이다.
보충 개념 제1정규형은 컬럼 값의 원자성을 보장하는 단계이다. 복합키 전체 종속성은 제2정규형에서 다루는 내용이다.
문제 6
4지선다식별자 관계에 대한 설명으로 적절하지 않은 것은?
- 1.부모 엔터티의 식별자가 자식 엔터티의 주식별자에 포함된다.
- 2.자식 엔터티는 부모 엔터티에 존재 종속될 수 있다.
- 3.부모 엔터티와 자식 엔터티의 관계는 항상 1:1 관계이다.
- 4.부모 식별자와 자식 자체 식별자가 결합되어 자식의 주식별자를 구성할 수 있다.
정답·해설 보기▾
정답
3번. 부모 엔터티와 자식 엔터티의 관계는 항상 1:1 관계이다.
해설
정답: 3. 식별자 관계라고 해서 부모와 자식 관계가 항상 1:1인 것은 아니며 1:M 관계도 가능하다.
오답 풀이
- 1번: 식별자 관계의 특징이다.
- 2번: 자식 엔터티가 부모에 종속될 수 있다.
- 3번: 항상 1:1이라는 설명은 틀리다.
- 4번: 부모 식별자를 포함해 복합 주식별자를 구성할 수 있다.
보충 개념 식별자 관계는 부모의 주식별자가 자식의 주식별자 일부 또는 전부가 되는 관계이다. 자식 엔터티의 식별 방식에 따라 1:1 또는 1:M 관계가 가능하다.
문제 7
4지선다트랜잭션의 특성 중 작업이 모두 수행되거나 모두 수행되지 않아야 한다는 성질은?
- 1.원자성
- 2.일관성
- 3.고립성
- 4.지속성
정답·해설 보기▾
정답
1번. 원자성
해설
정답: 1. 원자성은 트랜잭션의 연산이 모두 반영되거나 전혀 반영되지 않아야 한다는 특성이다.
오답 풀이
- 1번: 모두 수행 또는 모두 취소를 의미한다.
- 2번: 일관성은 트랜잭션 수행 전후 데이터 무결성이 유지되는 성질이다.
- 3번: 고립성은 동시에 실행되는 트랜잭션이 서로 간섭하지 않는 성질이다.
- 4번: 지속성은 커밋된 결과가 영구적으로 보존되는 성질이다.
보충 개념 트랜잭션의 ACID는 Atomicity, Consistency, Isolation, Durability를 의미한다.
문제 8
4지선다계층형 데이터 모델에 대한 설명으로 적절하지 않은 것은?
- 1.데이터를 트리 구조로 표현한다.
- 2.상위 레코드와 하위 레코드 간 부모-자식 관계를 가진다.
- 3.개체 간 관계는 일반적으로 1:N 구조로 표현된다.
- 4.개체 간 관계는 반드시 1:1 관계로만 표현된다.
정답·해설 보기▾
정답
4번. 개체 간 관계는 반드시 1:1 관계로만 표현된다.
해설
정답: 4. 계층형 모델은 부모-자식의 1:N 관계를 트리 구조로 표현하는 모델이므로 반드시 1:1 관계라는 설명은 틀리다.
오답 풀이
- 1번: 계층형 모델의 특징이다.
- 2번: 부모-자식 관계를 가진다.
- 3번: 일반적으로 1:N 관계를 표현한다.
- 4번: 1:1 관계로만 표현된다는 설명은 부적절하다.
보충 개념 계층형 모델은 트리 구조이므로 하나의 자식은 하나의 부모를 갖는 구조가 일반적이다. 복잡한 M:N 관계 표현에는 한계가 있다.
문제 9
4지선다다음 그림의 빈칸에 들어갈 데이터 모델링 구성 요소를 상위 개념부터 순서대로 나열한 것은?
- 1.엔터티 - 인스턴스 - 속성 - 속성값
- 2.인스턴스 - 엔터티 - 속성값 - 속성
- 3.속성 - 엔터티 - 인스턴스 - 속성값
- 4.엔터티 - 속성값 - 인스턴스 - 속성
정답·해설 보기▾
정답
1번. 엔터티 - 인스턴스 - 속성 - 속성값
해설
정답: 1. 엔터티는 인스턴스의 집합이고, 인스턴스는 속성을 가지며, 속성에는 실제 속성값이 저장된다.
오답 풀이
- 1번: 구성 요소의 관계가 올바르다.
- 2번: 엔터티와 인스턴스의 관계가 뒤바뀌었다.
- 3번: 속성은 엔터티보다 상위 개념이 아니다.
- 4번: 속성값과 속성의 위치가 부적절하다.
보충 개념 엔터티는 업무상 관리해야 하는 대상이다. 인스턴스는 엔터티의 개별 사례이며, 속성은 인스턴스를 설명하는 항목이다.
문제 10
4지선다두 엔터티 간 관계에서 참여자의 수를 표현하며 1:1, 1:M, M:N 등으로 나타내는 것은?
- 1.관계 선택성
- 2.관계 차수
- 3.식별자
- 4.속성 도메인
정답·해설 보기▾
정답
2번. 관계 차수
해설
정답: 2. 관계 차수는 두 엔터티 간 관계에서 참여 개체의 수를 표현한다.
오답 풀이
- 1번: 관계 선택성은 필수 참여와 선택 참여 여부와 관련된다.
- 2번: 1:1, 1:M, M:N은 관계 차수 표현이다.
- 3번: 식별자는 인스턴스를 구분하는 속성이다.
- 4번: 도메인은 속성이 가질 수 있는 값의 범위이다.
보충 개념 관계 차수는 카디널리티라고도 하며 엔터티 간 수적 대응 관계를 의미한다. 데이터 모델링에서 관계의 구조를 결정하는 중요한 요소이다.
문제 11
4지선다서브쿼리에 대한 설명으로 적절하지 않은 것은?
- 1.서브쿼리는 SELECT, FROM, WHERE 절 등에서 사용할 수 있다.
- 2.IN 절에는 다중 행 서브쿼리를 사용할 수 있다.
- 3.단일 행 비교 연산자에는 단일 행 서브쿼리를 사용하는 것이 일반적이다.
- 4.IN 절은 단일 행 서브쿼리만 사용할 수 있다.
정답·해설 보기▾
정답
4번. IN 절은 단일 행 서브쿼리만 사용할 수 있다.
해설
정답: 4. IN 절은 여러 값을 비교할 수 있으므로 다중 행 서브쿼리를 사용할 수 있다.
오답 풀이
- 1번: 서브쿼리는 여러 절에서 사용 가능하다.
- 2번: IN 절은 다중 행 결과와 비교할 수 있다.
- 3번: =, >, < 같은 단일 행 비교 연산자는 단일 행 서브쿼리와 함께 사용한다.
- 4번: IN 절이 단일 행 서브쿼리만 가능하다는 설명은 틀리다.
보충 개념 서브쿼리는 반환 행 수에 따라 단일 행 서브쿼리와 다중 행 서브쿼리로 구분된다. IN, ANY, ALL 등은 다중 행 서브쿼리와 함께 사용할 수 있다.
문제 12
4지선다다음 중 DML(Data Manipulation Language)에 해당하는 명령어로만 묶인 것은?
- 1.CREATE, ALTER, DROP
- 2.INSERT, UPDATE, DELETE
- 3.GRANT, REVOKE, COMMIT
- 4.SELECT, CREATE, ROLLBACK
정답·해설 보기▾
정답
2번. INSERT, UPDATE, DELETE
해설
정답: 2. INSERT, UPDATE, DELETE는 테이블의 데이터를 조작하는 DML이다.
오답 풀이
- 1번: CREATE, ALTER, DROP은 DDL이다.
- 2번: 모두 DML에 해당한다.
- 3번: GRANT, REVOKE는 DCL이고 COMMIT은 TCL이다.
- 4번: SELECT는 넓게 DML로 보기도 하지만 CREATE는 DDL, ROLLBACK은 TCL이다.
보충 개념 SQL 명령어는 DDL, DML, DCL, TCL 등으로 구분한다. DML은 데이터 조회 및 변경과 관련된 명령어이다.
문제 13
4지선다다음 SQL에서 DENSE_RANK 함수의 결과에 대한 설명으로 적절한 것은?
SQLSELECT 부서, 사원명, 급여, DENSE_RANK() OVER(PARTITION BY 부서 ORDER BY 급여 DESC) AS RNK FROM 사원;동일 부서에서 급여 순위가 1, 2, 2로 발생한 다음 행의 순위는?
- 1.3
- 2.4
- 3.1
- 4.NULL
정답·해설 보기▾
정답
1번. 3
해설
정답: 1. DENSE_RANK는 동일 순위가 있어도 다음 순위를 건너뛰지 않으므로 1, 2, 2 다음은 3이다.
오답 풀이
- 1번: DENSE_RANK의 올바른 결과이다.
- 2번: RANK 함수라면 1, 2, 2 다음이 4가 된다.
- 3번: PARTITION이 바뀌지 않는 한 다시 1이 되지 않는다.
- 4번: 순위 함수는 해당 행에 대해 순위 값을 반환한다.
보충 개념 RANK는 공동 순위 이후 순위를 건너뛴다. DENSE_RANK는 공동 순위 이후에도 연속된 순위를 부여한다.
문제 14
4지선다다음 SQL의 실행 결과로 가장 적절한 것은?
SQLCREATE TABLE TAB1 (COL1 VARCHAR2(10), COL2 NUMBER); INSERT INTO TAB1 VALUES('A',100); INSERT INTO TAB1 VALUES('B',200); INSERT INTO TAB1 VALUES('C',300); INSERT INTO TAB1 VALUES('C',400); SELECT COUNT(*) FROM ( SELECT COL1, SUM(COL2) FROM TAB1 GROUP BY ROLLUP(COL1), COL1 );- 1.3
- 2.4
- 3.6
- 4.7
정답·해설 보기▾
정답
3번. 6
해설
정답: 3. GROUP BY ROLLUP(COL1), COL1은 COL1별 그룹이 중복 생성되어 A, B, C 그룹이 각각 두 번 나타나므로 총 6건이다.
오답 풀이
- 1번: 단순 GROUP BY COL1의 결과 건수이다.
- 2번: 원본 행 수와 혼동한 값이다.
- 3번: 중복된 COL1 그룹 기준 결과로 적절하다.
- 4번: 일반적인 ROLLUP(COL1)의 그룹 수와 혼동한 값이다.
보충 개념 ROLLUP은 소계와 총계를 생성한다. GROUP BY 항목이 중복되거나 결합될 경우 논리적으로 동일한 그룹 결과가 여러 번 생성될 수 있다.
문제 15
4지선다다음 SQL에서 오류가 발생하는 원인으로 가장 적절한 것은?
SQLCREATE TABLE 1234_TABLE ( COL1 NUMBER );- 1.테이블명은 숫자로 시작할 수 없다.
- 2.NUMBER 타입은 테이블 생성 시 사용할 수 없다.
- 3.컬럼명은 반드시 소문자로 작성해야 한다.
- 4.CREATE TABLE 문에는 반드시 기본키가 있어야 한다.
정답·해설 보기▾
정답
1번. 테이블명은 숫자로 시작할 수 없다.
해설
정답: 1. 일반적인 SQL 객체명은 숫자로 시작할 수 없으므로 테이블명 1234_TABLE은 부적절하다.
오답 풀이
- 1번: 오류 원인이다.
- 2번: NUMBER 타입은 사용할 수 있다.
- 3번: 컬럼명을 반드시 소문자로 작성할 필요는 없다.
- 4번: 테이블 생성 시 기본키가 필수는 아니다.
보충 개념 객체명은 DBMS 규칙을 따라야 하며 일반적으로 문자로 시작해야 한다. 숫자로 시작하는 이름이 필요하면 인용 식별자를 사용해야 하지만 권장되지 않는다.
문제 16
4지선다다음 중 다른 SQL들과 결과 집합이 다른 것은?
- 1.GROUP BY ROLLUP(A, B)
- 2.GROUP BY GROUPING SETS((A, B), (A), ())
- 3.GROUP BY A, B UNION ALL GROUP BY A UNION ALL GROUP BY ()
- 4.GROUP BY GROUPING SETS((A, B), (A))
정답·해설 보기▾
정답
4번. GROUP BY GROUPING SETS((A, B), (A))
해설
정답: 4. ROLLUP(A, B)는 (A, B), (A), () 그룹을 생성하지만 4번은 전체 합계 그룹 ()이 없다.
오답 풀이
- 1번: ROLLUP(A, B)의 기본 결과이다.
- 2번: ROLLUP(A, B)와 같은 그룹 집합이다.
- 3번: 동일한 그룹 집합을 UNION ALL 형태로 표현한 것이다.
- 4번: 전체 합계 그룹이 빠져 결과가 다르다.
보충 개념 ROLLUP(A, B)는 계층적 소계를 생성한다. 이를 GROUPING SETS로 표현하면 GROUPING SETS((A, B), (A), ())가 된다.
문제 17
4지선다다음 GROUP BY 절과 동일한 그룹 집합을 생성하는 것은?
SQLGROUP BY GROUPING SETS(ROLLUP(A), B)- 1.GROUPING SETS((A), (B), ())
- 2.GROUPING SETS((A, B), (A), ())
- 3.GROUPING SETS((A), (B))
- 4.ROLLUP(A, B)
정답·해설 보기▾
정답
1번. GROUPING SETS((A), (B), ())
해설
정답: 1. ROLLUP(A)는 (A), ()를 생성하고 여기에 B가 별도 그룹 집합으로 포함되므로 (A), (), (B)가 된다.
오답 풀이
- 1번: 원문의 그룹 집합과 동일하다.
- 2번: (A, B)가 추가되어 원문과 다르다.
- 3번: 전체 합계 ()가 빠져 있다.
- 4번: ROLLUP(A, B)는 (A, B), (A), ()를 생성한다.
보충 개념 GROUPING SETS 안에 ROLLUP을 중첩할 수 있다. 이 경우 ROLLUP이 생성하는 그룹 집합과 다른 그룹 집합들이 함께 결과에 포함된다.
문제 18
4지선다다음 데이터와 SQL의 실행 결과로 가장 적절한 것은?
<데이터>
COL1 COL2 NULL 10 10 10 10 NULL SQLSELECT COL1 * 2 + COL2 * 2 AS RESULT FROM TAB1;- 1.20, 40, 20
- 2.NULL, 40, NULL
- 3.0, 40, 0
- 4.NULL, NULL, NULL
정답·해설 보기▾
정답
2번. NULL, 40, NULL
해설
정답: 2. NULL이 포함된 산술 연산 결과는 NULL이므로 첫 번째와 세 번째 행은 NULL, 두 번째 행은 40이다.
오답 풀이
- 1번: NULL을 0처럼 계산한 잘못된 결과이다.
- 2번: NULL 산술 연산 규칙에 맞다.
- 3번: NULL은 자동으로 0으로 변환되지 않는다.
- 4번: 두 번째 행은 102 + 102 = 40이다.
보충 개념 SQL에서 NULL은 알 수 없는 값을 의미한다. NULL이 산술 연산에 포함되면 결과도 일반적으로 NULL이다.
문제 19
4지선다다음 SQL에 대한 설명으로 적절한 것은?
SQLSELECT NVL(SUM(C1) + SUM(C2), 0) AS RESULT FROM TAB1;- 1.SUM 함수는 NULL 값을 0으로 변환한 뒤 집계한다.
- 2.SUM 함수는 NULL 값을 제외하고 집계하며, 각 컬럼의 SUM 결과를 더한다.
- 3.NULL이 하나라도 있으면 SUM(C1)과 SUM(C2)는 항상 NULL이다.
- 4.NVL은 집계 전에 각 행의 NULL 값을 제거한다.
정답·해설 보기▾
정답
2번. SUM 함수는 NULL 값을 제외하고 집계하며, 각 컬럼의 SUM 결과를 더한다.
해설
정답: 2. SUM(expr)은 NULL을 제외하고 집계하며, 위 SQL은 SUM(C1)과 SUM(C2)를 각각 구한 후 더한다.
오답 풀이
- 1번: SUM이 NULL을 0으로 직접 변환하는 것은 아니다. NULL을 제외하고 집계한다.
- 2번: 올바른 설명이다.
- 3번: NULL이 있어도 NULL이 아닌 값이 있으면 합계를 구한다.
- 4번: NVL은 SUM(C1)+SUM(C2)의 결과가 NULL일 때 0으로 바꾼다.
보충 개념 집계 함수는 COUNT(*)를 제외하면 일반적으로 NULL을 제외하고 계산한다. 단, 모든 값이 NULL이면 SUM 결과는 NULL이 될 수 있다.
문제 20
4지선다T1과 T2를 조인했을 때 다음 결과 건수로 가장 적절한 것은?
<조건>
- T1 LEFT OUTER JOIN T2 결과: 3건
- T1 FULL OUTER JOIN T2 결과: 5건
- T1 RIGHT OUTER JOIN T2 결과: 3건
<질문> LEFT, FULL, RIGHT OUTER JOIN의 결과 건수를 순서대로 나열한 것은?
- 1.3, 3, 5
- 2.3, 5, 3
- 3.5, 3, 3
- 4.5, 5, 3
정답·해설 보기▾
정답
2번. 3, 5, 3
해설
정답: 2. 문제 조건상 LEFT는 3건, FULL은 5건, RIGHT는 3건이다.
오답 풀이
- 1번: FULL과 RIGHT의 순서가 잘못되었다.
- 2번: LEFT, FULL, RIGHT 순서에 맞다.
- 3번: LEFT 결과 건수를 잘못 배치했다.
- 4번: LEFT 결과 건수가 조건과 다르다.
보충 개념 FULL OUTER JOIN은 LEFT OUTER JOIN 결과와 RIGHT OUTER JOIN 결과를 모두 포함하되 중복 매칭 행은 한 번만 포함한다. 따라서 양쪽 미매칭 행이 모두 포함된다.
문제 21
4지선다다음과 같은 조인 구조에서 최종 결과 건수로 가장 적절한 것은?
SQLSELECT COUNT(*) FROM T1 LEFT OUTER JOIN T2 ON (...) LEFT OUTER JOIN T3 ON (...) INNER JOIN T4 ON (...);<조건> T1과 T2의 LEFT OUTER JOIN 결과를 기준으로 T3와 다시 LEFT OUTER JOIN한 뒤, 마지막에 T4와 INNER JOIN한 결과 매칭되는 행은 1건이다.
- 1.0건
- 2.1건
- 3.3건
- 4.5건
정답·해설 보기▾
정답
2번. 1건
해설
정답: 2. 마지막 INNER JOIN 조건을 만족하는 행이 1건이므로 최종 COUNT 결과는 1건이다.
오답 풀이
- 1번: INNER JOIN 매칭 행이 1건 존재하므로 0건이 아니다.
- 2번: 조건에 맞는 최종 결과이다.
- 3번: 앞선 LEFT OUTER JOIN 중간 결과와 혼동한 값이다.
- 4번: FULL OUTER JOIN 결과와 혼동한 값이다.
보충 개념 OUTER JOIN 이후 INNER JOIN이 수행되면 INNER JOIN 조건을 만족하지 못하는 행은 제거될 수 있다. 따라서 마지막 조인 방식이 최종 결과 건수에 큰 영향을 준다.
문제 22
4지선다다음 SQL의 실행 결과로 가장 적절한 것은?
SQLSELECT REGEXP_INSTR('12345678', '(123)(4(56)(78))', 1, 1, 0, 'i', 2) FROM DUAL;- 1.1
- 2.2
- 3.4
- 4.6
정답·해설 보기▾
정답
3번. 4
해설
정답: 3. subexpr 인수 2는 두 번째 괄호 그룹인 4(56)(78)의 시작 위치를 반환하므로 결과는 4이다.
오답 풀이
- 1번: 전체 패턴 또는 첫 번째 그룹의 시작 위치와 혼동한 값이다.
- 2번: 두 번째 문자 위치가 아니다.
- 3번: 두 번째 서브 표현식의 시작 위치이다.
- 4번: 세 번째 그룹 56의 시작 위치와 혼동한 값이다.
보충 개념 Oracle REGEXP_INSTR의 subexpr 인수는 정규식 안의 괄호로 묶인 하위 표현식 중 몇 번째 표현식의 위치를 반환할지 지정한다.
문제 23
4지선다다음 SQL의 실행 결과로 가장 적절한 것은?
SQLSELECT REGEXP_SUBSTR('abcd', 'b\*c') AS COL1, REGEXP_SUBSTR('abcd', 'b*c') AS COL2 FROM DUAL;- 1.NULL, bc
- 2.bc, NULL
- 3.bc, bc
- 4.NULL, NULL
정답·해설 보기▾
정답
1번. NULL, bc
해설
정답: 1. 'b*c'는 문자 그대로 bc를 찾으므로 매칭되지 않아 NULL이고, 'bc'는 b가 0회 이상 반복된 뒤 c가 오는 패턴으로 bc에 매칭된다.
오답 풀이
- 1번: 정규식 해석에 맞는 결과이다.
- 2번: 이스케이프된 별표와 메타문자 별표의 의미를 반대로 해석했다.
- 3번: 원문 문자열에 b*c가 없으므로 COL1은 bc가 아니다.
- 4번: COL2는 bc에 매칭된다.
보충 개념 정규식에서 *는 앞 문자가 0회 이상 반복됨을 의미한다. 문자 그대로의 *를 찾으려면 이스케이프 처리가 필요하다.
문제 24
4지선다계층형 쿼리에서 최상위 관리자를 시작으로 사원번호에서 관리자번호 방향으로 하위 직원을 조회하려고 한다. CONNECT BY 절로 가장 적절한 것은?
SQLSELECT 사원번호, 관리자번호 FROM 사원 START WITH 관리자번호 IS NULL CONNECT BY ________;- 1.PRIOR 사원번호 = 관리자번호
- 2.사원번호 = PRIOR 관리자번호
- 3.PRIOR 관리자번호 = 관리자번호
- 4.사원번호 = 관리자번호
정답·해설 보기▾
정답
1번. PRIOR 사원번호 = 관리자번호
해설
정답: 1. 부모 행의 사원번호가 자식 행의 관리자번호와 같아야 하므로 PRIOR 사원번호 = 관리자번호가 적절하다.
오답 풀이
- 1번: 상위 사원에서 하위 사원으로 내려가는 순방향 계층 조회이다.
- 2번: 방향이 반대가 된다.
- 3번: 부모의 관리자번호와 자식의 관리자번호를 비교하므로 부적절하다.
- 4번: PRIOR가 없어 계층 관계를 표현하지 못한다.
보충 개념 CONNECT BY PRIOR 부모컬럼 = 자식컬럼 형태는 부모에서 자식 방향으로 계층을 탐색한다. PRIOR의 위치에 따라 탐색 방향이 달라진다.
문제 25
4지선다다음 SQL에 대한 설명으로 가장 적절한 것은?
SQLSELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY 점수 DESC) AS RN, 이름, 점수 FROM 성적 ) WHERE RN <= 2 ORDER BY RN DESC;<조건> 점수 상위 2명의 RN과 점수가 각각 RN=1, 점수=150 / RN=2, 점수=40이라고 할 때 최종 출력 순서는 어떻게 되는가?
- 1.RN=1, 점수=150 다음 RN=2, 점수=40
- 2.RN=2, 점수=40 다음 RN=1, 점수=150
- 3.점수 오름차순으로 전체 데이터 출력
- 4.RN 값과 무관하게 입력 순서대로 출력
정답·해설 보기▾
정답
2번. RN=2, 점수=40 다음 RN=1, 점수=150
해설
정답: 2. ROW_NUMBER는 점수 DESC 기준으로 번호를 부여하지만 최종 출력은 ORDER BY RN DESC에 따라 RN이 큰 행부터 출력된다.
오답 풀이
- 1번: RN 오름차순 출력일 때의 결과이다.
- 2번: 최종 ORDER BY RN DESC에 맞다.
- 3번: 전체 데이터가 아니라 RN <= 2인 행만 출력한다.
- 4번: 최종 ORDER BY가 있으므로 입력 순서대로 출력되지 않는다.
보충 개념 분석 함수의 ORDER BY와 최종 SELECT의 ORDER BY는 역할이 다르다. 분석 함수의 ORDER BY는 순번 산정 기준이고, 마지막 ORDER BY는 출력 순서 기준이다.
문제 26
4지선다로그인 이력 테이블에서 사용자별 로그인 횟수를 집계하는 SQL에 대한 설명으로 적절하지 않은 것은?
SQLSELECT USER_ID AS ALIAS1, LOGIN_DATE AS ALIAS2, COUNT(*) AS LOGIN_CNT FROM LOGIN_HISTORY GROUP BY USER_ID, LOGIN_DATE ORDER BY ALIAS1, ALIAS2;- 1.한 사용자가 5일간 하루 3회씩 로그인했다면 전체 로그인 이력은 15건이다.
- 2.Oracle에서 SELECT 절의 별칭을 ORDER BY 절에서 사용할 수 있다.
- 3.ORDER BY ALIAS1, ALIAS2는 ALIAS1 기준으로 먼저 정렬한 뒤 ALIAS2 기준으로 정렬한다.
- 4.WHERE 절에서도 SELECT 절에서 정의한 ALIAS1을 항상 그대로 사용할 수 있다.
정답·해설 보기▾
정답
4번. WHERE 절에서도 SELECT 절에서 정의한 ALIAS1을 항상 그대로 사용할 수 있다.
해설
정답: 4. SELECT 절에서 정의한 별칭은 일반적으로 WHERE 절에서 사용할 수 없다.
오답 풀이
- 1번: 5일 × 하루 3회 = 15건이므로 타당하다.
- 2번: Oracle에서 ORDER BY 절은 SELECT 별칭을 사용할 수 있다.
- 3번: ORDER BY에 여러 기준을 쓰면 앞 기준부터 차례대로 정렬한다.
- 4번: WHERE 절은 SELECT 절보다 논리적으로 먼저 처리되므로 SELECT 별칭을 일반적으로 사용할 수 없다.
보충 개념 SQL 논리 처리 순서상 WHERE는 SELECT보다 먼저 평가된다. 반면 ORDER BY는 SELECT 이후 결과를 정렬하므로 SELECT 절의 별칭을 사용할 수 있다.
문제 27
4지선다컬럼 ALIAS에 대한 설명으로 적절하지 않은 것은?
- 1.컬럼 별칭은 SELECT 절에서 컬럼 또는 표현식에 다른 이름을 부여할 때 사용한다.
- 2.AS 키워드를 사용하여 컬럼 별칭을 지정할 수 있다.
- 3.컬럼 별칭은 컬럼 앞뒤 어디에나 사용할 수 있다.
- 4.공백이나 특수문자가 포함된 별칭은 큰따옴표로 묶어 사용할 수 있다.
정답·해설 보기▾
정답
3번. 컬럼 별칭은 컬럼 앞뒤 어디에나 사용할 수 있다.
해설
정답: 3. 컬럼 별칭은 컬럼 또는 표현식 뒤에 지정하며 컬럼 앞에 사용할 수 없다.
오답 풀이
- 1번: ALIAS의 목적이다.
- 2번: AS를 사용해 별칭을 지정할 수 있다.
- 3번: 컬럼 앞에 별칭을 둘 수 없으므로 틀리다.
- 4번: 공백이나 대소문자 보존이 필요한 별칭은 큰따옴표를 사용할 수 있다.
보충 개념 예를 들어 SELECT salary AS 급여 FROM emp는 가능하지만 SELECT 급여 salary FROM emp처럼 컬럼 앞에 별칭을 두는 방식은 올바르지 않다.
문제 28
4지선다다음 WHERE 절의 논리 연산 해석으로 가장 적절한 것은?
SQLWHERE 고객번호 = 'X' OR 고객번호 = 'Y' AND 상태 = '정상' AND 등급 = 'A'<조건> 고객번호가 X인 행은 2건이고, 고객번호가 Y이면서 상태가 정상이고 등급이 A인 행은 3건이다.
- 1.(고객번호 = 'X' OR 고객번호 = 'Y') AND 상태 = '정상' AND 등급 = 'A'이므로 3건이다.
- 2.고객번호 = 'X' OR (고객번호 = 'Y' AND 상태 = '정상' AND 등급 = 'A')이므로 5건이다.
- 3.(고객번호 = 'X' OR 고객번호 = 'Y' OR 상태 = '정상') AND 등급 = 'A'이므로 2건이다.
- 4.고객번호 = 'X' AND 고객번호 = 'Y' AND 상태 = '정상' AND 등급 = 'A'이므로 0건이다.
정답·해설 보기▾
정답
2번. 고객번호 = 'X' OR (고객번호 = 'Y' AND 상태 = '정상' AND 등급 = 'A')이므로 5건이다.
해설
정답: 2. SQL에서 AND가 OR보다 우선순위가 높으므로 고객번호 X 조건 2건과 Y이면서 나머지 조건을 만족하는 3건이 합쳐져 5건이다.
오답 풀이
- 1번: 괄호가 없으면 OR보다 AND가 먼저 처리된다.
- 2번: 올바른 논리 연산 순서와 결과 건수이다.
- 3번: 상태 조건이 OR로 연결되지 않는다.
- 4번: OR 조건을 AND로 잘못 해석했다.
보충 개념 WHERE 절에서 AND는 OR보다 우선순위가 높다. 의도한 조건을 명확히 하려면 괄호를 사용하는 것이 좋다.
문제 29
4지선다'홍길동'의 자식의 자식 노드를 셀프 조인으로 조회하는 SQL로 가장 적절한 것은?
- 1.SELECT B.EMPNO, B.ENAME, B.MGR FROM EMP A, EMP B WHERE A.ENAME = '홍길동' AND B.MGR = A.EMPNO
- 2.SELECT C.EMPNO, C.ENAME, C.MGR FROM EMP A, EMP B, EMP C WHERE A.ENAME = '홍길동' AND B.MGR = A.EMPNO AND C.MGR = B.EMPNO
- 3.SELECT A.EMPNO, A.ENAME, A.MGR FROM EMP A WHERE A.ENAME = '홍길동'
- 4.SELECT C.EMPNO, C.ENAME, C.MGR FROM EMP A, EMP C WHERE A.ENAME = '홍길동' AND A.MGR = C.EMPNO
정답·해설 보기▾
정답
2번. SELECT C.EMPNO, C.ENAME, C.MGR FROM EMP A, EMP B, EMP C WHERE A.ENAME = '홍길동' AND B.MGR = A.EMPNO AND C.MGR = B.EMPNO
해설
정답: 2. A를 홍길동, B를 홍길동의 자식, C를 B의 자식으로 조인해야 자식의 자식 노드를 조회할 수 있다.
오답 풀이
- 1번: 홍길동의 직접 자식만 조회한다.
- 2번: 홍길동의 손자 노드를 조회한다.
- 3번: 홍길동 본인만 조회한다.
- 4번: 홍길동의 상위 관리자 방향으로 조회하는 형태이다.
보충 개념 계층 구조를 셀프 조인으로 표현할 때는 계층 단계 수만큼 테이블 별칭을 추가한다. 부모-자식 관계는 일반적으로 자식.MGR = 부모.EMPNO 형태로 연결한다.
문제 30
4지선다다음 중 오류가 발생하는 JOIN 구문으로 가장 적절한 것은?
- 1.SELECT * FROM EMPLOYEES A INNER JOIN DEPARTMENTS B ON (DEPARTMENT_ID) WHERE A.DEPARTMENT_ID = 90
- 2.SELECT * FROM EMPLOYEES A INNER JOIN DEPARTMENTS B ON A.DEPARTMENT_ID = B.DEPARTMENT_ID WHERE A.DEPARTMENT_ID = 90
- 3.SELECT * FROM EMPLOYEES A INNER JOIN DEPARTMENTS B USING (DEPARTMENT_ID) WHERE DEPARTMENT_ID = 90
- 4.SELECT * FROM EMPLOYEES A NATURAL JOIN DEPARTMENTS B WHERE DEPARTMENT_ID = 90
정답·해설 보기▾
정답
1번. SELECT * FROM EMPLOYEES A INNER JOIN DEPARTMENTS B ON (DEPARTMENT_ID) WHERE A.DEPARTMENT_ID = 90
해설
정답: 1. ON 절에는 A.DEPARTMENT_ID = B.DEPARTMENT_ID처럼 조인 조건식이 와야 하며 단순 컬럼명만 괄호로 쓰는 것은 부적절하다.
오답 풀이
- 1번: ON 절의 조건식이 불완전하여 오류가 발생한다.
- 2번: 명시적 ON 조인 조건이 올바르다.
- 3번: USING 절은 동일 이름 컬럼을 기준으로 조인할 때 사용할 수 있다.
- 4번: NATURAL JOIN은 동일 이름 컬럼을 자동으로 조인 조건으로 사용한다.
보충 개념 ON 절은 논리 조건식을 작성하는 곳이다. USING은 동일한 컬럼명을 괄호 안에 지정하는 별도의 문법이다.
문제 31
4지선다계약이 없는 고객을 찾는 SQL로 가장 적절한 것은?
- 1.SELECT * FROM 고객 C WHERE EXISTS (SELECT 1 FROM 계약 K WHERE K.고객ID = C.고객ID)
- 2.SELECT * FROM 고객 C WHERE NOT EXISTS (SELECT 1 FROM 계약 K WHERE K.고객ID = C.고객ID)
- 3.SELECT * FROM 고객 C WHERE 고객ID = NULL
- 4.SELECT * FROM 고객 C WHERE 계약ID IS NOT NULL
정답·해설 보기▾
정답
2번. SELECT * FROM 고객 C WHERE NOT EXISTS (SELECT 1 FROM 계약 K WHERE K.고객ID = C.고객ID)
해설
정답: 2. 계약 테이블에 해당 고객의 계약이 존재하지 않는 고객을 찾으려면 NOT EXISTS를 사용한다.
오답 풀이
- 1번: 계약이 있는 고객을 찾는다.
- 2번: 계약이 없는 고객을 찾는다.
- 3번: NULL 비교는 = NULL이 아니라 IS NULL을 사용해야 하며 의미도 다르다.
- 4번: 고객 테이블에 계약ID가 있다는 전제가 없고 계약이 있는 경우에 가깝다.
보충 개념 NOT EXISTS는 상관 서브쿼리 결과가 존재하지 않을 때 TRUE가 된다. 미존재 데이터를 찾을 때 자주 사용된다.
문제 32
4지선다다음 ERD에 대한 설명으로 가장 적절한 것은?
고객과 계약상세를 계약을 통해 조인하여 COUNT(*)를 수행할 때, 고객별 필터 없이 전체 조인 결과를 집계하면 어떤 건수와 같아지는가?
- 1.고객의 건수
- 2.계약의 건수
- 3.계약상세의 건수
- 4.항상 1건
정답·해설 보기▾
정답
3번. 계약상세의 건수
해설
정답: 3. 고객-계약-계약상세가 1:M:M 구조로 조인되면 최종 조인 결과는 가장 하위 상세 행 기준으로 생성되므로 계약상세 건수와 같아진다.
오답 풀이
- 1번: 고객 1건이 여러 상세 행으로 확장될 수 있다.
- 2번: 계약 1건도 여러 계약상세 행으로 확장될 수 있다.
- 3번: 하위 상세 엔터티의 행 수와 일치하는 것이 일반적이다.
- 4번: 집계 결과 COUNT(*)는 1개의 값으로 출력되지만 그 값이 1이라는 의미는 아니다.
보충 개념 1:M 관계를 따라 조인하면 부모 행은 자식 행 수만큼 반복된다. 여러 단계의 1:M 조인에서는 최하위 자식 행의 수가 결과 건수를 결정하는 경우가 많다.
문제 33
4지선다다음 SQL에서 최종 결과 컬럼명으로 가장 적절한 것은?
SQLSELECT COL1 AS AAB, COL2 AS BBA FROM T1 UNION ALL SELECT COL1 AS BBA, COL2 AS AAB FROM T2;- 1.AAB, BBA
- 2.BBA, AAB
- 3.COL1, COL2
- 4.첫 번째 행의 데이터 값에 따라 달라진다.
정답·해설 보기▾
정답
1번. AAB, BBA
해설
정답: 1. 집합 연산자의 결과 컬럼명은 첫 번째 SELECT 문의 컬럼명 또는 별칭을 따른다.
오답 풀이
- 1번: 첫 번째 SELECT의 별칭이 결과 컬럼명이 된다.
- 2번: 두 번째 SELECT의 별칭은 결과 컬럼명 결정에 사용되지 않는다.
- 3번: 첫 번째 SELECT에서 별칭을 지정했으므로 COL1, COL2가 아니다.
- 4번: 데이터 값에 따라 컬럼명이 달라지지 않는다.
보충 개념 UNION, UNION ALL 등 집합 연산에서는 각 SELECT의 컬럼 개수와 타입 호환성이 중요하다. 결과 컬럼명은 첫 번째 SELECT 문 기준으로 정해진다.
문제 34
4지선다3회 이상 주문한 고객을 찾는 SQL의 HAVING 절로 가장 적절한 것은?
- 1.HAVING COUNT(구매번호) >= 3
- 2.WHERE COUNT(구매번호) >= 3
- 3.HAVING 구매번호 >= 3
- 4.GROUP BY COUNT(구매번호) >= 3
정답·해설 보기▾
정답
1번. HAVING COUNT(구매번호) >= 3
해설
정답: 1. 그룹별 주문 건수를 조건으로 제한하려면 HAVING COUNT(구매번호) >= 3을 사용한다.
오답 풀이
- 1번: 그룹 집계 조건으로 적절하다.
- 2번: WHERE 절에는 집계 함수를 직접 사용할 수 없다.
- 3번: 구매번호 값 자체를 비교하는 것으로 주문 횟수 조건이 아니다.
- 4번: GROUP BY는 그룹 기준을 지정하는 절이지 조건식을 쓰는 절이 아니다.
보충 개념 WHERE는 그룹화 전 개별 행을 필터링하고, HAVING은 GROUP BY 이후 그룹 결과를 필터링한다.
문제 35
4지선다다음 SQL 중 오류가 발생하는 문장으로 가장 적절한 것은?
SQLCREATE TABLE SQLD_55_34_01 ( COL1 VARCHAR2(50), COL2 NUMBER, COL3 VARCHAR2(50), CONSTRAINT PK_01 PRIMARY KEY (COL1) ); CREATE TABLE SQLD_55_34_02 ( COL4 VARCHAR2(50), COL5 NUMBER, COL1 VARCHAR2(50), CONSTRAINT PK_02 PRIMARY KEY (COL4), CONSTRAINT FK_02_01 FOREIGN KEY (COL1) REFERENCES SQLD_55_34_01(COL1) ); -- 1 INSERT INTO SQLD_55_34_01 VALUES ('A',100,'가'); -- 2 INSERT INTO SQLD_55_34_02 VALUES ('02_A',100,NULL); -- 3 INSERT INTO SQLD_55_34_02 VALUES ('02_B',200,'A'); -- 4 UPDATE SQLD_55_34_02 SET COL1 = 'B' WHERE COL4 = '02_A';- 1.1번 INSERT
- 2.2번 INSERT
- 3.3번 INSERT
- 4.4번 UPDATE
정답·해설 보기▾
정답
4번. 4번 UPDATE
해설
정답: 4. 자식 테이블의 외래키 COL1을 부모 테이블에 존재하지 않는 값 'B'로 변경하려 하므로 참조 무결성 위반이 발생한다.
오답 풀이
- 1번: 부모 테이블에 'A'를 정상 삽입한다.
- 2번: 외래키 컬럼은 NULL 허용 시 NULL 삽입이 가능하다.
- 3번: 부모 테이블에 'A'가 존재하므로 정상 삽입된다.
- 4번: 부모 키 'B'가 없으므로 오류가 발생한다.
보충 개념 외래키는 부모 테이블에 존재하는 값만 참조할 수 있다. 단, 외래키 컬럼이 NULL을 허용하면 NULL 값은 참조 무결성 위반이 아니다.
문제 36
4지선다다음 트랜잭션 수행 후 최종 반영되는 작업으로 가장 적절한 것은?
SQL-- (가) SQL1 수행 SAVEPOINT A; -- (나) SQL2 수행 SAVEPOINT B; -- (다) SQL3 수행 ROLLBACK TO SAVEPOINT A; -- (라) SQL4 수행 -- (마) SQL5 수행 COMMIT;- 1.가, 나, 다
- 2.가, 라, 마
- 3.나, 다, 라
- 4.다, 라, 마
정답·해설 보기▾
정답
2번. 가, 라, 마
해설
정답: 2. SAVEPOINT A 이후 수행된 SQL2, SQL3은 ROLLBACK TO SAVEPOINT A로 취소되고 이후 SQL4, SQL5는 다시 수행되어 커밋된다.
오답 풀이
- 1번: 나와 다는 SAVEPOINT A로 롤백되어 취소된다.
- 2번: 가는 유지되고 라, 마는 롤백 이후 수행되어 반영된다.
- 3번: 나와 다는 취소된다.
- 4번: 다는 롤백 대상이며 가가 누락되어 있다.
보충 개념 SAVEPOINT는 트랜잭션 내 중간 저장점을 만든다. ROLLBACK TO SAVEPOINT는 해당 저장점 이후의 작업만 취소한다.
문제 37
4지선다Oracle에서 다음 정렬 구문을 사용할 때 NULL 값의 기본 정렬 위치로 가장 적절한 것은?
SQLORDER BY COL1 DESC- 1.NULLS FIRST
- 2.NULLS LAST
- 3.NULL 값은 항상 제외된다.
- 4.DBMS가 오류를 발생시킨다.
정답·해설 보기▾
정답
1번. NULLS FIRST
해설
정답: 1. Oracle에서 DESC 정렬 시 NULL의 기본 위치는 NULLS FIRST이다.
오답 풀이
- 1번: Oracle의 기본 동작에 맞다.
- 2번: ASC 정렬의 기본 위치가 NULLS LAST이다.
- 3번: ORDER BY는 NULL 값을 제외하지 않는다.
- 4번: NULL 포함 정렬은 오류가 아니다.
보충 개념 Oracle 기본 정렬에서 ASC는 NULLS LAST, DESC는 NULLS FIRST이다. 명시적으로 NULLS FIRST 또는 NULLS LAST를 지정할 수 있다.
문제 38
4지선다ROW LIMITING 절에 대한 설명으로 적절하지 않은 것은?
- 1.OFFSET은 건너뛸 행의 개수를 지정한다.
- 2.FETCH는 반환할 행의 개수나 백분율을 지정한다.
- 3.ONLY는 지정된 행의 개수나 백분율만큼만 반환한다.
- 4.WITH TIES는 첫 번째 행에 대한 동순위를 포함해서 반환한다.
정답·해설 보기▾
정답
4번. WITH TIES는 첫 번째 행에 대한 동순위를 포함해서 반환한다.
해설
정답: 4. WITH TIES는 마지막으로 반환되는 행과 정렬 기준이 같은 동순위 행을 추가로 반환한다.
오답 풀이
- 1번: OFFSET의 올바른 설명이다.
- 2번: FETCH의 올바른 설명이다.
- 3번: ONLY는 지정된 수만 반환한다.
- 4번: 첫 번째 행이 아니라 마지막 행 기준 동순위를 포함한다.
보충 개념 FETCH FIRST n ROWS WITH TIES는 ORDER BY 기준으로 n번째 행과 같은 정렬 값을 가진 행을 함께 반환한다. WITH TIES를 사용할 때는 ORDER BY가 중요하다.
문제 39
4지선다집계 함수에 대한 설명으로 적절하지 않은 것은?
- 1.COUNT(*)는 NULL 포함 여부와 관계없이 행의 수를 센다.
- 2.COUNT(expr)는 expr이 NULL인 행을 제외하고 센다.
- 3.SUM(expr)는 NULL 값을 제외하고 합계를 계산한다.
- 4.COUNT(expr)는 NULL을 포함하여 센다.
정답·해설 보기▾
정답
4번. COUNT(expr)는 NULL을 포함하여 센다.
해설
정답: 4. COUNT(expr)는 expr이 NULL인 행을 제외하고 센다.
오답 풀이
- 1번: COUNT(*)는 전체 행 수를 센다.
- 2번: COUNT(expr)의 올바른 설명이다.
- 3번: SUM은 NULL을 제외하고 계산한다.
- 4번: COUNT(expr)가 NULL을 포함한다는 설명은 틀리다.
보충 개념 COUNT()와 COUNT(컬럼)은 다르다. COUNT()는 행 수, COUNT(컬럼)은 해당 컬럼이 NULL이 아닌 행 수를 반환한다.
문제 40
4지선다각 행에 전체 합계와 부서별 합계를 함께 출력하는 SQL로 가장 적절한 것은?
- 1.SELECT DEPTNO, SAL, SUM(SAL) OVER() AS 전체합계, SUM(SAL) OVER(PARTITION BY DEPTNO) AS 부서합계 FROM EMP
- 2.SELECT DEPTNO, SAL, SUM(SAL) AS 전체합계, SUM(SAL) AS 부서합계 FROM EMP
- 3.SELECT DEPTNO, SAL FROM EMP GROUP BY SUM(SAL)
- 4.SELECT DEPTNO, SAL, COUNT(*) OVER(PARTITION BY SAL) AS 전체합계 FROM EMP
정답·해설 보기▾
정답
1번. SELECT DEPTNO, SAL, SUM(SAL) OVER() AS 전체합계, SUM(SAL) OVER(PARTITION BY DEPTNO) AS 부서합계 FROM EMP
해설
정답: 1. 전체 합계는 SUM(SAL) OVER(), 부서별 합계는 SUM(SAL) OVER(PARTITION BY DEPTNO)로 구할 수 있다.
오답 풀이
- 1번: 분석 함수를 올바르게 사용했다.
- 2번: 일반 집계 함수와 일반 컬럼을 함께 사용하려면 GROUP BY가 필요하며 행별 출력 목적에도 맞지 않는다.
- 3번: GROUP BY 사용 방식이 잘못되었다.
- 4번: COUNT를 사용하고 있어 급여 합계를 구하지 못한다.
보충 개념 윈도우 함수는 행을 유지한 상태에서 집계 결과를 함께 보여줄 수 있다. PARTITION BY는 집계 범위를 그룹 단위로 나누는 역할을 한다.
문제 41
4지선다두 SQL 집합 A, B에 대해 UNION ALL의 결과를 개념적으로 표현한 것으로 가장 적절한 것은?
- 1.UNION 결과와 INTERSECT 결과를 함께 포함한다.
- 2.UNION 결과에서 INTERSECT 결과를 제거한다.
- 3.INTERSECT 결과만 반환한다.
- 4.MINUS 결과만 반환한다.
정답·해설 보기▾
정답
1번. UNION 결과와 INTERSECT 결과를 함께 포함한다.
해설
정답: 1. UNION ALL은 중복을 제거하지 않으므로, 중복 제거된 UNION 결과에 중복되는 INTERSECT 결과를 추가로 포함한 것과 개념적으로 유사하다.
오답 풀이
- 1번: UNION ALL의 중복 포함 성격을 설명한다.
- 2번: 중복되는 값을 제거하는 방향이므로 UNION ALL과 다르다.
- 3번: 공통 부분만 반환하므로 다르다.
- 4번: 차집합만 반환하므로 다르다.
보충 개념 UNION은 중복을 제거하고 UNION ALL은 중복을 제거하지 않는다. 두 집합에 모두 존재하는 행은 UNION ALL에서 중복되어 나타날 수 있다.
문제 42
4지선다다음 나눗셈 연산 결과로 가장 적절한 것은?
<조건>
- COL1 = 0, COL2 = 300인 행에서 COL1 / COL2
- COL1 = 300, COL2 = 0인 행에서 COL1 / COL2
- COL1 = 100, COL2 = NULL인 행에서 COL1 / COL2
- 1.0, ERROR, NULL
- 2.0, 0, NULL
- 3.NULL, ERROR, NULL
- 4.ERROR, ERROR, NULL
정답·해설 보기▾
정답
1번. 0, ERROR, NULL
해설
정답: 1. 0을 300으로 나누면 0이고, 300을 0으로 나누면 0으로 나누기 오류가 발생하며, NULL과의 연산 결과는 NULL이다.
오답 풀이
- 1번: SQL 산술 연산 규칙에 맞다.
- 2번: 0으로 나누기는 0이 아니라 오류이다.
- 3번: 0/300은 NULL이 아니라 0이다.
- 4번: 0/300은 오류가 아니다.
보충 개념 Oracle에서 0으로 나누면 ORA-01476 오류가 발생한다. NULL이 포함된 산술 연산은 일반적으로 NULL을 반환한다.
문제 43
4지선다테이블 구조는 유지하면서 로우만 삭제하는 명령어로 적절한 것은?
- 1.DELETE, TRUNCATE
- 2.DROP, DELETE
- 3.ALTER, DROP
- 4.CREATE, TRUNCATE
정답·해설 보기▾
정답
1번. DELETE, TRUNCATE
해설
정답: 1. DELETE와 TRUNCATE는 테이블 구조를 유지한 채 데이터를 삭제할 수 있다.
오답 풀이
- 1번: 두 명령 모두 행 데이터 삭제에 사용된다.
- 2번: DROP은 테이블 구조 자체를 삭제한다.
- 3번: ALTER는 구조 변경, DROP은 객체 삭제이다.
- 4번: CREATE는 객체 생성 명령이다.
보충 개념 DELETE는 DML로 조건 삭제가 가능하고 롤백 가능성이 있다. TRUNCATE는 DDL 성격으로 전체 데이터를 빠르게 삭제하며 일반적으로 조건을 지정할 수 없다.
문제 44
4지선다다음 SQL의 결과 건수로 가장 적절한 것은?
<데이터>
과목명 물리학 화학 영어 수학개론 SQLSELECT COUNT(*) FROM 과목 WHERE 과목명 LIKE '%학';- 1.1건
- 2.2건
- 3.3건
- 4.4건
정답·해설 보기▾
정답
2번. 2건
해설
정답: 2. LIKE '%학'은 '학'으로 끝나는 문자열을 찾으므로 물리학, 화학 2건이 조회된다.
오답 풀이
- 1번: 물리학만 고려한 값이다.
- 2번: 물리학과 화학이 조건에 맞다.
- 3번: 수학개론은 학으로 끝나지 않는다.
- 4번: 영어는 학으로 끝나지 않는다.
보충 개념 LIKE에서 %는 0개 이상의 임의 문자열을 의미한다. '%학'은 마지막 글자가 학인 값을 찾는 패턴이다.
문제 45
4지선다NULL이 아닌 값을 찾는 조건으로 가장 적절한 것은?
- 1.= NULL
- 2.!= NULL
- 3.IS NOT NULL
- 4.NOT NULL = TRUE
정답·해설 보기▾
정답
3번. IS NOT NULL
해설
정답: 3. SQL에서 NULL 여부는 IS NULL 또는 IS NOT NULL로 비교한다.
오답 풀이
- 1번: NULL은 = 연산자로 비교할 수 없다.
- 2번: NULL은 != 연산자로도 비교할 수 없다.
- 3번: NULL이 아닌 값을 찾는 올바른 조건이다.
- 4번: 일반적인 SQL NULL 비교 문법이 아니다.
보충 개념 NULL은 알 수 없는 값이므로 일반 비교 연산 결과가 TRUE/FALSE로 확정되지 않는다. 따라서 IS NULL 계열 연산자를 사용해야 한다.
문제 46
4지선다기존 테이블에 직장우편번호 정보를 저장할 컬럼을 추가하는 SQL로 가장 적절한 것은?
- 1.ALTER TABLE 회원 ADD (OFFI_POST_NUMBER VARCHAR2(80));
- 2.UPDATE TABLE 회원 ADD OFFI_POST_NUMBER VARCHAR2(80);
- 3.CREATE COLUMN OFFI_POST_NUMBER VARCHAR2(80) ON 회원;
- 4.INSERT COLUMN 회원 OFFI_POST_NUMBER VARCHAR2(80);
정답·해설 보기▾
정답
1번. ALTER TABLE 회원 ADD (OFFI_POST_NUMBER VARCHAR2(80));
해설
정답: 1. 기존 테이블에 컬럼을 추가할 때는 ALTER TABLE ... ADD 구문을 사용한다.
오답 풀이
- 1번: 컬럼 추가 구문으로 적절하다.
- 2번: UPDATE는 데이터 변경 명령이지 구조 변경 명령이 아니다.
- 3번: 일반적인 SQL 컬럼 추가 문법이 아니다.
- 4번: INSERT는 행 데이터를 삽입하는 명령이다.
보충 개념 DDL 명령인 ALTER TABLE은 테이블 구조를 변경할 때 사용한다. 컬럼 추가, 컬럼 변경, 제약조건 추가 등에 사용된다.
문제 47
4지선다참조 무결성을 구현하는 키로 가장 적절한 것은?
- 1.기본키
- 2.외래키
- 3.후보키
- 4.대체키
정답·해설 보기▾
정답
2번. 외래키
해설
정답: 2. 외래키는 자식 테이블의 값이 부모 테이블의 기본키 또는 유일키 값을 참조하도록 하여 참조 무결성을 구현한다.
오답 풀이
- 1번: 기본키는 개체 무결성과 관련이 깊다.
- 2번: 외래키가 참조 무결성을 구현한다.
- 3번: 후보키는 튜플을 유일하게 식별할 수 있는 속성 집합이다.
- 4번: 대체키는 후보키 중 기본키로 선택되지 않은 키이다.
보충 개념 개체 무결성은 기본키, 참조 무결성은 외래키, 도메인 무결성은 CHECK 제약조건 등으로 구현할 수 있다.
문제 48
4지선다무결성에 대한 설명으로 적절하지 않은 것은?
- 1.기본키에는 NULL이 들어갈 수 없다.
- 2.외래키는 부모 테이블에 존재하는 값을 참조해야 한다.
- 3.CHECK 제약조건은 도메인 무결성을 구현하는 데 사용할 수 있다.
- 4.기본키 중복 삽입 오류는 참조 무결성 위반이다.
정답·해설 보기▾
정답
4번. 기본키 중복 삽입 오류는 참조 무결성 위반이다.
해설
정답: 4. 기본키 중복 삽입 오류는 개체 무결성 위반에 해당하며 참조 무결성 위반이 아니다.
오답 풀이
- 1번: 개체 무결성의 핵심 조건이다.
- 2번: 참조 무결성의 설명이다.
- 3번: 도메인 무결성은 속성 값의 범위를 제한하는 제약조건과 관련된다.
- 4번: 기본키 중복은 개체 무결성 위반이다.
보충 개념 무결성은 데이터의 정확성과 일관성을 보장하는 제약이다. 개체 무결성, 참조 무결성, 도메인 무결성을 구분해야 한다.
문제 49
4지선다다음 BETWEEN 조건과 결과가 다른 조건으로 가장 적절한 것은?
SQLWHERE COL1 BETWEEN DATE '2024-01-01' AND DATE '2024-01-31'- 1.WHERE COL1 >= DATE '2024-01-01' AND COL1 <= DATE '2024-01-31'
- 2.WHERE DATE '2024-01-01' <= COL1 AND COL1 <= DATE '2024-01-31'
- 3.WHERE COL1 > DATE '2024-01-01' AND COL1 < DATE '2024-01-31'
- 4.WHERE COL1 BETWEEN DATE '2024-01-01' AND DATE '2024-01-31'
정답·해설 보기▾
정답
3번. WHERE COL1 > DATE '2024-01-01' AND COL1 < DATE '2024-01-31'
해설
정답: 3. BETWEEN은 양 끝값을 포함하므로 초과와 미만을 사용하는 3번은 결과가 다르다.
오답 풀이
- 1번: BETWEEN과 같은 포함 범위 조건이다.
- 2번: BETWEEN과 같은 의미이다.
- 3번: 시작값과 종료값을 제외하므로 결과가 다르다.
- 4번: 원문과 동일하다.
보충 개념 BETWEEN A AND B는 A 이상 B 이하를 의미한다. 날짜 컬럼에 시간이 포함되어 있다면 종료일 처리에 주의해야 한다.
문제 50
4지선다다음 SQL의 IN 절에 대한 설명으로 적절하지 않은 것은?
SQLSELECT * FROM 부서 D WHERE D.DEPTNO IN ( SELECT E.DEPTNO FROM 사원 E WHERE E.EMPNM IN ('JOHN', 'SMITH') );- 1.서브쿼리가 여러 행을 반환해도 IN 절에서 비교할 수 있다.
- 2.서브쿼리 결과에 동일한 DEPTNO가 여러 번 나와도 IN 비교 자체는 가능하다.
- 3.JOHN이라는 이름의 사원이 두 명이면 반드시 오류가 발생한다.
- 4.IN은 목록 중 하나와 일치하는지 판단하는 연산자이다.
정답·해설 보기▾
정답
3번. JOHN이라는 이름의 사원이 두 명이면 반드시 오류가 발생한다.
해설
정답: 3. IN 절은 다중 행 결과를 처리할 수 있으므로 JOHN이라는 이름의 사원이 여러 명이어도 그 자체로 오류가 발생하지 않는다.
오답 풀이
- 1번: IN 절은 다중 행 서브쿼리와 함께 사용할 수 있다.
- 2번: 중복 값이 있어도 IN 비교는 가능하다.
- 3번: 단일 행 서브쿼리가 아니므로 여러 명이어도 오류가 아니다.
- 4번: IN의 기본 의미이다.
보충 개념 IN은 서브쿼리 결과 집합에 비교 값이 포함되는지 확인한다. 단일 행 비교 연산자 = 와 달리 여러 행이 반환되어도 사용할 수 있다.