[오답풀이] 2과목
1. SUBSTR 결과가 다른 것을 고르시오
- SELECT SUBSTR('DATABASE',7)FROM DUAL;
- SELECT SUBSTR('DATABASE',-2)FROM DUAL;
- SELECT SUBSTR('DATABASE',8,-2)FROM DUAL;
- SELECT SUBSTR('DATABASE',INSTR('DATABASE','S'),2)FROM DUAL;
1. `SELECT SUBSTR('DATABASE', 7) FROM DUAL;`
• `SUBSTR('DATABASE', 7)`은 문자열의 7번째 문자부터 끝까지 반환합니다.
• `'DATABASE'`에서 7번째 문자는 `'S'`이며, 결과는 `'SE'`입니다.
2. `SELECT SUBSTR('DATABASE', -2) FROM DUAL;`
• `SUBSTR('DATABASE', -2)`은 문자열의 뒤에서 두 번째 문자부터 끝까지 반환합니다.
• `'DATABASE'`에서 뒤에서 두 번째 문자는 `'S'`, 결과는 `'SE'`입니다.
3. `SELECT SUBSTR('DATABASE', 8, -2) FROM DUAL;`
• `SUBSTR('DATABASE', 8, -2)`는 시작 위치가 8이고 길이가 음수(-2)로 지정되었습니다.
• SQL에서 `SUBSTR` 함수의 길이 값은 음수가 될 수 없으므로, 이 구문은 유효하지 않으며 오류가 발생합니다.
4. `SELECT SUBSTR('DATABASE', INSTR('DATABASE','S'), 2) FROM DUAL;`
• `INSTR('DATABASE', 'S')`는 문자열 `'S'`가 처음 등장하는 위치를 반환합니다. `'DATABASE'`에서 `'S'`는 7번째 위치에 있습니다.
• `SUBSTR('DATABASE', 7, 2)`는 7번째 문자부터 길이 2만큼 반환하므로 결과는 `'SE'`입니다.
2. 아래 테이블 및 결과가 있을 때 SQL수행으로 올바른 것은?
[table1]
COL1 COL2
-----------
1 10
2 20
3 30
[table2]
COL1 COL2
------------
1 10
2 20
[RESULT]
COL1
----
3
- WHERE NOT EXISTS (SELECT 1 FROM T2 B WHERE B.COL1 = A.COL1)
- SELECT table1.COL1 FROM table1 INNER JOIN table2 ON table1.COL1 = table2.COL1;
- SELECT COL1 FROM table2 EXCEPT SELECT COL1 FROM table1;
- SELECT COL1 FROM table1 WHERE COL1 IN (SELECT COL1 FROM table2);
3. TABLE1, TABLE2, TABLE3 테이블에 대한 아래의 INSERT 결과 개수로 알맞은 것은?
[TABLE0]
N1
---
1
2
5
INSERT FIRST
WHEN N1 >= 2 THEN INTO TABLE1(N1) VALUES(N1)
WHEN N1 >= 3 THEN INTO TABLE2(N1) VALUES(N1)
ELSE INTO TABLE3 VALUES(N1)
SELECT N1 FROM TABLE0;
- 0,0,0
- 1,1,1
- 2,0,1
- 0,0,1
(2,0,1)
`INSERT FIRST`는 조건문을 평가할 때 첫 번째로 만족하는 조건만 실행하고, 이후 조건은 무시합니다. 따라서, 각 행에 대해 조건을 순차적으로 평가하여 해당 조건에 맞는 테이블에 데이터를 삽입합니다.
| 테이블 | 삽입된 데이터 | 개수 |
| table1 | 2, 5 | 2 |
| table2 | 없음 | 0 |
| table3 | 1 | 1 |
4. 아래 SQL에서 위반된 트랜잭션의 특징은?
UPDATE TAB1 SET COL1 = 'VALUE1';
UPDATE TAB1 SET COL1 = 'VALUE2';
COMMIT;
COMMIT;
- 원자성
- 일관성
- 고립성
- 지속성
위 SQL 쿼리에서 두 개의 `COMMIT` 명령이 사용되었습니다. 트랜잭션의 특징에 따라, 이 방식은 원자성(Atomicity)을 위반하게 됩니다.
[ACID 속성]
ACID는 데이터베이스 트랜잭션의 4가지 핵심 속성을 나타냅니다:
1. 원자성 (Atomicity):
• 트랜잭션은 전체 작업이 성공하거나 실패해야 합니다. 즉, 트랜잭션 내 모든 작업이 완료되거나, 하나라도 실패하면 전체 작업이 롤백됩니다.
• 두 개의 `COMMIT` 명령을 사용하면 트랜잭션이 나눠져 원자성을 위반하게 됩니다. 트랜잭션은 하나의 단위로 처리되어야 하며, 중간에 부분적으로 완료된 상태를 허용하지 않습니다.
2. 일관성 (Consistency):
• 트랜잭션은 데이터베이스를 한 유효한 상태에서 다른 유효한 상태로 변경해야 합니다.
• 일관성은 데이터 무결성을 보장하며, 정의된 규칙이나 제약 조건을 위반하지 않아야 합니다.
3. 고립성 (Isolation):
• 트랜잭션은 서로 독립적으로 실행되어야 하며, 다른 트랜잭션의 중간 결과를 볼 수 없어야 합니다.
• 고립성은 동시 실행 시 데이터 충돌을 방지합니다.
4. 지속성 (Durability):
• 트랜잭션이 `COMMIT`된 후에는 시스템 장애가 발생하더라도 변경 사항이 영구적으로 저장됩니다.
왜 원자성이 위반되었는가?
• 트랜잭션은 하나의 단위로 처리되어야 하지만, 두 개의 `COMMIT` 명령으로 인해 트랜잭션이 분리되었습니다.
• 첫 번째 `COMMIT` 후에는 데이터베이스가 부분적으로 변경된 상태로 저장됩니다. 만약 두 번째 `UPDATE`가 실패하더라도 첫 번째 변경 사항은 롤백되지 않으므로 원자성이 깨집니다.
다른 속성과 비교
• 일관성: 데이터베이스는 여전히 유효한 상태를 유지하므로 일관성 위반은 아닙니다.
• 고립성: 다른 트랜잭션과의 충돌이 언급되지 않았으므로 고립성과는 관련이 없습니다.
• 지속성: `COMMIT` 후 데이터는 영구적으로 저장되므로 지속성이 위반되지 않습니다.
5. 실행 결과는?
[t1]
col1
1
2
3
4
5
[t2]
col1
1
1
1
3
6
select count(*)
from t1, t2
where t1.col1 = t2.col1;
- 2
- 3
- 4
- 5
1
1
1
3
6. 아래 SQL 실행값을 고르시오
INSERT INTO TABLE50 VALUES(1);
INSERT INTO TABLE50 VALUES(2);
INSERT INTO TABLE50 VALUES(3);
SAVEPOINT SQL1;
INSERT INTO TABLE50 VALUES(4);
INSERT INTO TABLE50 VALUES(5);
COMMIT;
INSERT INTO TABLE50 VALUES(6);
ROLLBACK TO SAVEPOINT SQL1;
SELECT * FROM TABLE50;
- 4
- 5
- 6
- 7
1. INSERT문에 의해 순서대로 1,2,3의 값을 TABLE50에 삽입합니다.
2. SAVEPOINT SQL1을 지정합니다.
3. 값 4,5를 TABLE50에 삽입합니다.
4. COMMIT으로 현재 상태를 확정합니다.
5. 값 6을 TABLE50에 삽입합니다.
6.SQL1 시점으로 ROLLBACK합니다. 이때 확정된 4,5의 값은 되돌아 가지 않습니다.
따라서 1,2,3,4,5가 최종 저장된 값입니다.
7. View에 대한 설명으로 적절하지 않은 것은?
- 컬럼 추가가 되더라도 View 를 변경하지 않아 응용프로그램 변경이 없다.
- VIEW는 논리적 데이터 독립성을 제공한다.
- 뷰는 독립적인 인덱스를 가질 수 없다.
- 뷰로 정의를 변경할 수 없다.
1. View의 주요 특징
• View는 가상 테이블로, 실제 데이터를 저장하지 않고, 정의된 SQL 쿼리를 기반으로 동적으로 데이터를 생성합니다.
• View는 데이터의 보안, 단순화, 논리적 독립성을 제공하며, 복잡한 쿼리를 단순화하여 사용자가 쉽게 접근할 수 있도록 합니다.
• View는 다음과 같은 특징을 가집니다:
• 논리적 데이터 독립성 제공: View는 기본 테이블의 구조가 변경되더라도 사용자가 동일한 방식으로 데이터를 조회할 수 있게 합니다.
• 독립적인 인덱스를 가질 수 없다: View는 실제 데이터를 저장하지 않으므로, 독립적으로 인덱스를 생성할 수 없습니다.
• 정의 변경 불가: View 자체는 정의된 SQL 쿼리를 기반으로 하며, View를 통해 기본 테이블의 구조를 변경할 수 없습니다.
[선택지 분석]
1. 컬럼 추가가 되더라도 View를 변경하지 않아 응용프로그램 변경이 없다. (부적절)
• 기본 테이블에 컬럼이 추가되더라도 View는 기존에 정의된 쿼리에 포함되지 않은 새로운 컬럼을 자동으로 포함하지 않습니다.
• 즉, View를 수정하지 않으면 새로운 컬럼은 응용프로그램에서 사용할 수 없습니다.
• 따라서 이 설명은 부적절합니다.
2. VIEW는 논리적 데이터 독립성을 제공한다. (적절)
• View는 기본 테이블과 독립적으로 동작하며, 기본 테이블의 구조가 변경되더라도 사용자는 동일한 방식으로 데이터를 조회할 수 있습니다.
• 이는 논리적 데이터 독립성을 제공하는 대표적인 사례입니다.
3. 뷰는 독립적인 인덱스를 가질 수 없다. (적절)
• View는 실제 데이터를 저장하지 않는 가상 테이블이므로, 독립적으로 인덱스를 생성할 수 없습니다.
• 다만, 특정 DBMS에서는 “인덱스가 있는 뷰”를 지원하기도 하지만, 이는 일반적인 뷰의 특성과 다릅니다.
4. 뷰로 정의를 변경할 수 없다. (적절)
• View는 기본적으로 읽기 전용이며, 기본 테이블의 정의(예: 컬럼 추가/삭제)를 직접 변경할 수 없습니다.
• 일부 DBMS에서 `INSTEAD OF` 트리거 등을 사용해 제한적으로 수정 작업을 지원하기도 하지만, 이는 일반적인 뷰의 기능과는 다릅니다.
8. Database의 논리적 업무 최소 단위는?
- 트랜잭션
- 쿼리
- 도메인
- 인스턴스
트랜잭션은 데이터베이스의 논리적 업무 최소 단위입니다.
9. 아래의 SQL에 대한 설명으로 알맞은 것은?
SELECT ...
FROM .
WHERE COL1 LIKE 'A%'
- 소문자 A, 대문자 A가 포함된 모든 ROW
- A로 끝나는 모든 ROW
- A가 포함된 모든 ROW
- 대문자 A 로 시작하는 모든 ROW
• `LIKE 'A%'`는 문자열 패턴 매칭을 수행하는 조건입니다.
• `A%`의 의미:
• `'A'`로 시작하는 문자열을 찾습니다.
• `%`는 0개 이상의 임의의 문자를 의미합니다.
• 따라서, `COL1` 값이 대문자 `'A'`로 시작하고 뒤에 어떤 문자(또는 아무 문자도 없을 수 있음)가 올 수 있는 모든 행을 반환합니다.