본문 바로가기
SQLD/SQLD 오답노트

오답노트 (문1 ~ 문38) (2-1 과목 [상])

by moca7 2023. 11. 14.

ㅁ 문4. 데이터베이스를 정의하고 접근하기 위해서는 데이터베이스 관리 시스템과의 통신수단이 필요한데 이를 데이터 언어(Data Language)라고 하며, 그 기능과 사용 목적에 따라 데이터 정의어(DDL), 데이터 조작어(DML), 데이터 제어어(DCL)로 구분된다. 다음 중 데이터 언어와 SQL 명령어에 대한 설명으로 가장 부적절한 것은?

 

(1) 비절차적 데이터 조작어(DML)는 사용자가 무슨 데이터를 원하며, 어떻게 그것을 접근해야 되는지를 명세하는 언어이다.

(2) DML은 데이터베이스 사용자가 응용 프로그램이나 질의어를 통하여 저장된 데이터베이스를 실질적으로 접근하는데 사용되며 SELECT, INSERT, DELETE, UPDATE 등이 있다.

(3) DDL은 스키마, 도메인, 테이블, 뷰, 인덱스를 정의하거나 변경 또는 제거할 때 사용되며 CREATE, ALTER, DROP, RENAME 등이 있다.

(4) 호스트 프로그램 속에 삽입되어 사용되는 DML 명령어들을 데이터 부속어(Data Sub Language)라고 한다.

 

= 답4. AS-IS: 비절차적 데이터 조작어(DML)는 사용자가 무슨(What) 데이터를 원하는 지만을 명세함.

TO-BE: 비절차적 데이터 조작어(DML)는 사용자가 무슨(What) 데이터를 원하는 지만을 명세하지만, 절차적 데이터 조작어는 어떻게(How) 데이터를 접근해야 하는지 명세한다. 절차적 데이터 조작어로는 PL/SQL(오라클), T-SQL(SQL Server) 등이 있다. 

 

ㅁ 문6. 다음 중 아래의 데이터 모델과 같은 테이블 및 PK 제약조건을 생성하는 DDL 문장으로 올바른 것은 (단, DBMS는 Oracle을 기준으로 한다.)

 

[PRODUCT]

PROD_ID: VARCHAR2(10) NOT NULL

---------------------------------------------------------

PROD_NM: VARCHAR2(100) NOT NULL

REG_DT: DATE NOT NULL

REGR_NO: NUMBER(10) NULL

 

(1) CREATE TABLE PRODUCT

(PROD_ID VARCHAR2(10) NOT NULL,

PROD_NM VARCHAR2(100) NOT NULL,

REG_DT DATE NOT NULL,

REGR_NO NUMBER(10) NULL);

ALTER TABLE PRODUCT ADD PRIMARY KEY PRODUCT_PK ON (PROD_ID);

 

- ALTER TABLE PRODUCT ADD CONSTRAINT PRODUCT_PK PRIMARY KEY (PROD_ID);이 맞음. 

ADD CONSTRAINT - 제약조건명 - 제약조건 - 칼럼명 순서.

- 제약조건은 CREATE, ALTER 테이블 ADD CONSTRAINT ~ 둘 다 가능.

 

(3) CREATE TABLE PRODUCT

(PROD_ID VARCHAR2(10) NOT NULL,

PROD_NM VARCHAR2(100) NOT NULL,

REG_DT DATE NOT NULL,

REGR_NO NUMBER(10) NULL,

ADD CONSTRAINT PRIMARY KEY (PROD_ID);

- 테이블을 생성할 때 PK를 지정하는 문장에 문법 오류가 존재한다.

 

(4) CREATE TABLE PRODUCT

(PROD_ID VARCHAR2(10) NOT NULL,

PROD_NM VARCHAR2(100) NOT NULL,

REG_DT DATE NOT NULL,

REGR_NO NUMBER(10),

CONSTRANINT PRODUCT_PK PRIMARY KEY (PROD_ID) );

 

- 테이블을 생성할 때 NOT NULL이나 PRIMARY KEY로 정의되지 않은 모든 데이터 유형은 NULL 값을 포함할 수 있다. NULL은 그림에 있어도 SQL에 없어도 상관없는 듯.

 

ㅁ 문7. 아래와 같이 데이터가 들어있지 않은 왼쪽의 기관분류 테이블 (가)를 오른쪽 기관분류 테이블 (나)처럼 변경하고자 할 때 다음 중 올바른 SQL 문장은? (단, DBMS는 SQL Server로 가정한다.)

 

(가)                                                                              (나)

[기관분류]                                                                  [기관분류]

분류ID: VARCHAR(10) NOT NULL                          분류ID: VARCHAR(10) NOT NULL

------------------------------------------------                      --------------------------------------------------

분류명: VARCHAR(10) NOT NULL                          분류명: VARCHAR(30) NOT NULL

등록일자: VARCHAR(10) NULL                               등록일자: DATE NOT NULL

 

(1) ALTER TABLE 기관분류 ALTER COLUMN (분류명 VARCHAR(30), 등록일자 DATE NOT NULL);

- (1), (2) SQL Server에서는 여러 개의 칼럼을 동시에 수정하는 구문은 지원하지 않으므로 오류가 발생한다. 또한 SQL Server에서는 괄호를 사용하지 않는다. 

(2) ALTER TABLE 기관분류 ALTER COLUMN (분류명 VARCHAR(30) NOT NULL, 등록일자 DATE NOT NULL);

(3) ALTER TABLE 기관분류 ALTER COLUMN 분류명 VARCHAR(30);

ALTER TABLE 기관분류 ALTER COLUMN 등록일자 DATE NOT NULL;

- 분류명을 수정할 때 NOT NULL 구무을 지정하지 않으면, 기존의 NOT NULL 제약조건이 NULL로 변경된다.

(4) ALTER TABLE 기관분류 ALTER COLUMN 분류명 VARCHAR(30) NOT NULL;

ALTER TABLE 기관분류 ALTER COLUMN 등록일자 DATE NOT NULL;

 

= 테이블 칼럼에 대한 정의 변경.

[Oracle] ALTER TABLE 테이블명 MODIFY (칼럼명1 데이터유형 [DEFAULT식] [NOTNULL], 칼럼명2 ...)

[SQL Server] ALTER TABLE 테이블명 ALTER (칼럼명1 데이터유형 [DEFAULT식] [NOTNULL], 칼럼명2 ...)

 

ㅁ 문8. 다음 중 NULL의 설명으로 가장 부적절한 것은?

 

(1) 모르는 값을 의미한다.

(2) 값의 부재를 의미한다.

(3) 공백문자 혹은 숫자 0을 의미한다.

(4) NULL과의 모든 비교(IS NULL 제외)는 알 수 없음을 반환한다. 

 

= NULL은 공백이나 숫자 0과는 전혀 다른 값이며, 조건에 맞는 데이터가 없을 때의 공집합과도 다르다. 아직 정의되지 않은 미지의 값이나 현재 데이터를 입력하지 못하는 경우를 의미한다. 

= NULL값에 수치연산을 하면  NULL 값을 리턴한다. NULL값과의 비교연산은(IS NULL, IS NOT NULL 제외) 거짓(FALSE)를 리턴한다.

= NULL은 어떤 값과도 비교할 수 없으며, 특정 값보다 크다, 작다라고 표현할 수 없다. 

 

ㅁ 문9. 아래 테이블 T, S, R이 각각 다음과 같이 선언되었다. 다음 중 DELETE FROM T;를 수행한 후에 테이블 R에 남아있는 데이터로 가장 적절한 것은?

 

CREATE TABLE T

(C INTEGER PRIMARY KEY,

D INTEGER);

 

CREATE TABLE S

(B INTEGER PRIMARY KEY,

C INTEGER REFERENCES T(C) ON DELETE CASCADE);

 

CREATE TABLE R

(A INTEGER PRIMARY KEY,

B INTEGER REFERENCES S(B) ON DELTE SET NULL);

 

현재 테이블 T, S, R의 상태는 다음과 같다.

[T]                        [S]                   [R]

C D                      B C                 A B

------                     ------               -----

1 1                        1 1                 1 1

2 1                        2 1                 2 2

 

(1) (1, NULL)과 (2, 2) 

(2) (1, NULL)과 (2, NULL)

(3) (2, 2)

(4) (1, 1)

 

= 답9. DELTE FROM T; 이후 데이터 현황. 

T 테이블: 두 건 모두 삭제됨, S 테이블(Cascade 옵션): 두 건 모두 삭제됨, R 테이블(Set Null 옵션): Child 해당 필드(FK: B칼럼) 값이 NULL로 변경됨.

 

= 데이터 표기법이 괄호로 1행 다 넣고, 2행 다 넣고 이런식이네.

= DELETE CASCADE는 참조하고 있는 칼럼 값이 사라지면, 그 로우도 모두 사라지는 옵션이다. DELETE SET NULL은 값이 사라지면 사라진 값을 NULL로 만들어라.

= 입력이나 삭제는 '행 단위'로 함. '열 단위'가 아님. INTERGER은 정수.

= 'REFERENCE ON DELETE'는 삭제에 대해서만 참조하겠다는 뜻. 그래서 데이터 값이 다름.

 

ㅁ 문10. 다음 중 테이블 생성시 칼럼별 생성할 수 있는 제약조건(Constraints)에 대한 설명으로 가장 부적절한 것은?

 

(1) UNIQUE: 테이블 내에서 중복되는 값이 없으며 NULL 입력이 불가능하다.

(2) PK: 주키로 테이블당 1개만 생성이 가능하다.

(3) FK: 외래키로 테이블당 여러 개 생성이 가능하다.

(4) NOT NULL: 명시적으로 NULL 입력을 방지한다.

 

= 답10. PK는 UNIQUE&NOT NULL 특징을 가짐. UNIQUE는 테이블 내에서 중복되는 값이 없지만 NULL 입력이 가능하다.

= UNIQUE는 중복값이 있으면 안된다는 거임. NOT NULL은 NULL이 있으면 안된다는거고. PK는 그 둘 합친거.

= 제약조건에 CHECK도 있음. 입력할 수 있는 값의 범위를 제한함.

 

ㅁ 문11. 다음 중 물리적 테이블 명으로 가장 적절한 것은?

 

(1) EMP_10     (2) 100-EMP        (3) EMP-100          (4) 100_EMP

 

= 답11. 테이블명과 칼럼명은 반드시 문자로 시작해야 한다. A-Z, a-z, 0-9, _, $, #만 허용함.

 

ㅁ 문12. 아래와 같은 테이블 구조를 정의하려고 한다. 이때 아직 부서가 정의되지 않은 사원은 기본부서(코드: '0000')로 배치하고, 입사일자(JOIN_DATE) 기준으로 많은 조회가 발생하므로 입사일자에 Index를 생성하려고 한다. 올바른 문장 2개.

 

[EMP]

EMP_NO: VARCHAR2(10) NOT NULL

----------------------------------------------------

EMP_NM: VARCHAR2(30) NOT NULL

DEPT_CODE: VARCHAR2(4) NOT NULL

JOIN_DATE: DATE NOT NULL

REGIST_DATE: DATE NULL

 

(1) CREATE TABLE EMP

(EMP_NO VARCHAR2(10) PRIMARY KEY,

EMP_NM VARCHAR2(30) NOT NULL,

DEPT_CODE VARCHAR2(4) DEFAULT '0000' NOT NULL,

JOIN_DATE DATE NOT NULL,

REGIST_DATE DATE NULL);

CREATE INDEX IDX_EMP_01 ON EMP (JOIN_DATE);

 

(3) CREATE TABLE EMP

(EMP_NO VARCHAR2(10) NOT NULL,

EMP_NM VARCHAR2(30) NOT NULL,

DEPT_CODE VARCHAR2(4) DEFAULT '0000' NOT NULL,

JOIN_DATE DATE NOT NULL,

REGIST_DATE DATE);

ALTER TABLE EMP ADD CONSTRAINT EMP_PK PRIMARY KEY (EMP_NO);

CREATE INDEX IDX_EMP_01 ON EMP (JOIN_DATE);

 

(4) CREATE TABLE EMP

(EMP_NO VARCHAR2(10) NOT NULL PRIMARY KEY,

EMP_NM VARCHAR2(30) NOT NULL,

DEPT_CODE VARCHAR2(4) DEFAULT '0000' NOT NULL,

JOIN_DATE DATE NOT NULL,

REGIST_DATE DATE NULL);

ALTER TABLE EMP ADD CONSTRAINT EMP_PK PRIMARY KEY (EMP_NO);

CREATE INDEX IDX_EMP_01 ON EMP (JOIN_DATE);

- 테이블 생성문과 인덱스 생성문은 정상적으로 수행되지만, 테이블 생성문장에 이미 PRIMARY KEY를 지정하였으므로 ALTER TABLE 문장에서 오류가 발생한다.

 

= 제약조건에 그냥 NULL도 되네. NOT NULL, PRIMARY KEY, FOREIGN KEY, UNIQUE KEY, CHECK.

 

문 13. 아래와 같은 문장으로 '학생' 테이블을 생성한 후, 유효한 튜플(Tuple)들을 삽입하였다. SQL1, SQL2 문장의 실행 결과로 가장 적절한 것은?

 

생성) create table 학생 (학번 char (8) primary key, 장학금 integer) ;

 

SQL1: select count(*) from 학생

SQL2: select count(학번) from 학생

 

(1) SQL1, SQL2 문장의 실행 결과는 다를 수 있으며, 그 이유는 장학금 속성에 NULL 값이 존재할 수 있기 때문이다.

(2) SQL1, SQL2 문장의 실행 결과는 항상 다르다.

(3) SQL1, SQL2 문장의 실행 결과는 항상 같다.

(4) SQL1, SQL2 문장의 실행 결과는 다를 수 있으며, 그 이유는 학번 속성에 NULL값이 존재할 수 있기 때문이다.

 

= 답13. 학번 칼럼이 PK이기 때문에 NULL 값이 없다.

 

ㅁ 문14. 외래키에 대한 설명으로 가장 부적절한 것을 2개 고르시오.

 

(1) 테이블 생성시 설정할 수 있다.

(2) 외래키 값은 널 값을 가질 수 없다.

(3) 한 테이블에 하나만 존재해야 한다.

(4) 외래키 값은 참조 무결성 제약을 받을 수 있다.

 

ㅁ 문15. 데이터베이스 테이블의 제약조건(Constraints)에 대한 설명으로 가장 부적절한 것은?

 

(1) Check 제약조건은 데이터베이스에서 데이터의 무결성을 유지하기 위하여 테이블의 특정 칼럼에 설정하는 제약이다.

(2) 기본키는 반드시 테이블 당 하나의 제약만을 정의할 수 있다.

(3) 고유키로 지정된 모든 칼럼들은 null값을 가질 수 없다.

(4) 외래키는 테이블 간의 관계를 정의하기 위해 기본키를 다른 테이블의 외래키가 참조하도록 생성한다. 

 

- 기본키를 구성하는 컬럼은 복수일 수 있지만, 기본키가 복수로 존재할수는 없습니다.

 

ㅁ 문16. 4개의 칼럼으로 이루어진 EMP 테이블에서 COMM 칼럼을 삭제하고자 할 때, 아래 SQL 문장의 (ㄱ), (ㄴ) 안에 들어갈 내용을 기술하시오. (COMM 칼럼에 데이터들은 하나도 없는 NULL 상태)

 

(ㄱ) TABLE EMP

(ㄴ) COMM;

 

= 답16. ALTER, DROP.

= DELETE 아님. DELETE는 칼럼 데이터 삭제.

= DDL에 CREATE, ALTER, DROP, RENAME + TRUNCATE. 

= DROP은 칼럼이나 테이블 자체를 삭제. 데이터가 있거나 없거나 삭제 가능. 

= TRUNCATE 테이블만 되는듯. DROP과 비교되는게 아니고 DELETE와 비교됨. 데이터만 삭제함. 복구 불가능.

 

ㅁ 문17. 아래 7개의 SQL 문장이 성공적으로 수행되었다고 할 때, A, B, C 세 개의 SQL 문장을 차례대로 실행하면 A와 C의 SELECT 문장 수행결과는 각각 무엇인가?

 

SQL1. CREATE TABLE 부서(부서번호 CHAR(10), 부서명 CHAR(10), PRIMARY KEY(부서번호));

SQL2. CREATE TABLE 직원(직원번호 CHAR(10), 소속부서 CHAR(10), PRIMARY KEY(직원번호), 

FOREIGN KEY(소속부서) REFERENCES 부서(부서번호) ON DELETE CASCADE);

SQL3. INSERT INTO 부서 VALUES('10', '영업과');

SQL4. INSERT INTO 부서 VALUES('20', '기획과');

SQL5. INSERT INTO 직원 VALUES('1000', '10');

SQL6. INSERT INTO 직원 VALUES('2000', '20');

SQL7. INSERT INTO 직원 VALUES('3000', '20');

COMMIT;

 

A. SELECT COUNT(직원번호) FROM 직원

B. DELETE FROM 부서 WHERE 부서번호 = '20';

C. SELECT COUNT(직원번호) FROM 직원 

COMMIT;

 

= 답17. 3,1

 

ㅁ 문18. STADIUM 테이블의 이름을 STADIUM_JSC로 변경하는 SQL을 작성하시오.(ANSI 표준 기준)

 

= RENAME STADIUM TO STADIUM_JSC

= RENAME STADIUM TO STADUM_JSC; <------- 마지막에 세미콜론 넣어야 함.

 

ㅁ 문 19. 표준 SQL(SQL:1999)에서 테이블 생성시 참조관계를 정의하기 위해 외래키를 선언한다. 관계형 데이터베이스에서 Child Table의 FK 데이터 생성시 Parent Table에 PK가 없는 경우, Child Table 데이터 입력을 허용하지 않는 참조동작(Referential Action)인 것은?

 

(1) CASCADE      (2) RESTRICT        (3) AUTOMATIC       (4) DEPENDENT

 

= 답19. 

< Delete(/Modify) Action > 부서 - 사원

1) cascade: master 삭제 시 child 같이 삭제

2) set null: master 삭제 시 child 해당 필드 null

3) set default: master 삭제 시 child 해당 필드 default 값으로 설정

4) restrict: child 테이블에 pk값이 없는 경우만 master 삭제 허용

5) no action: 참조무결성을 위반하는 삭제/수정 액션을 취하지 않음.

 - PK와 FK의 관계에서, PK를 지우면 FK도 자동 삭제되는가? NO ACTION으로 참조무결성을 위반해서 아예 삭제가 안되는 것 같습니다. 기본적으로 자식이 딸린 부모는 삭제가 불가능 합니다. FK로 연결된 데이터에 대한 처리 룰을 지정해야 함.( ON DELETE CASCADE, ON DELETE SET NULL 등)

 

< Insert Action> 부서-사원

1) automatic: master 테이블에 pk가 없는 경우 master pk를 생성 후 child 입력

2) set null: master 테이블에 pk가 없는 경우 child 외부키를 null 값으로 처리

3) set default: master 테이블에 pk가 없는 경우 child 외부키를 지정된 기본값으로 입력

4) dependent: master 테이블에 pk가 존재할 때만 child 입력 허용

5) no action: 참조무결성을 위반하는 입력 액션을 취하지 않음.

 

ㅁ 문20. 아래와 같은 SQL문에 대해 삽입이 성공하는 SQL문은?

 

CREATE TABLE TBL

( ID NUMBER PRIMARY KEY,

AMT NUMBER NOT NULL,

DEGREE VARCHAR2(1) )

 

1. INSERT INTO TBL VALUES(1, 100)

2. INSERT INTO TBL(ID, AMT, DEGREE) VALUES(2, 200, 'AB')

3. INSERT INTO TBL(ID, DEGREE) VALUES(4, 'X')

4. INSERT INTO TBL(ID, AMT) VALUES(3, 300)

5. INSERT INTO TBL VALUES(5, 500, NULL)

 

= 답20. 삽입 칼럼을 명시하지 않았을 경우 모든 칼럼을 삽입해야 한다.

 

ㅁ 문22. 아래 데이터 모델과 같이 고객과 주문 테이블이 생성되어 있으며, 고객과 주문 테이블에 입력되어 있는 데이터는 아래 표와 같다. 이 때 FK_001이라는 제약 조건을 아래 SQL과 같이 설정하였다. 다음 중 오류 없이 정상적으로 수행되는 SQL을 2개 고르시오.

 

[고객]                                                                                         [주문]

고객ID: VARCHAR2(20) NOT NULL                                         주문번호: VARCHAR2(20) NOT NULL

-------------------------------------------------         -FK001-                 ----------------------------------------------------

고객명: VARCHAR2(20) NULL                                                고객ID: VARCHAR2(20) NOT NULL(FK)

가입일시: DATE NOT NULL                                                     주문일시: DATE NOT NULL

 

[표: 주문 데이터]                                                                     [표: 고객 데이터]

주문번호(PK)   고객ID(FK)       주문일시                고객ID(PK)          고객명             가입일시

-------------------------------------------------------              ------------------------------------------------------------

0001                 C001             2013-12-24                   C001               홍길동           2013-12-12
0002                 C001            2013-12-25                    C002               이순신           2013-12-13

0003                 C002            2013-12-26

0004                 C002            2013-12-27

 

[SQL]

ALTER TABLE 주문 ADD CONSTRAINT FK_001 FOREIGN KEY (고객ID) 

REFERENCES 고객 (고객ID) ON DELETE SET NULL;

 

(1) INSERT INTO 고객 VALUES ('C003', '강감찬', '2014-01-01');(2) INSERT INTO 주문 VALUES ('C005', 'C003', '2013-12-28'); - 고객 테이블에 존재하지 않는 고객 ID의 주문을 입력하려 하여 무결성 제약 오류 발생. (1) 이후에는 가능.(3) DELETE FROM 주문 WHERE 주문번호 IN ('0001', '0002'); 

 - 자식에서 삭제가 일어나도 부모 데이터에 영향을 안 줌. 반대로 자식데이터에서 데이터 추가시 오류가 발생할 수 있음.

(4) DELETE FROM 고객 WHERE 고객ID = 'C002'; - 고객 테이블의 고객ID 'C002'를 삭제하려고 할 때 SQL에 의해 추가된 CONSTRAINT에 따라 주문 테이블의 고객 ID를 NULL로 업데이트 하려고 DBMS에서 시도하지만, 주문 테이블 고객 ID 칼럼의 NOT NULL 제약조건에 의해 실패한다.

 

= PK-FK 관계에서, 부모 테이블 PK에 값 추가하는건 가능. = PK-FK 관계에서, 자식이 딸린 부모는 못지우지만 여기서는 DELETE 조건덕에 가능.= 딜리트니까 테이블의 데이터를 지우는거. 행별로 다 삭제. 해당값이 NULL로 바뀌는게 아니고(그건 부모테이블).

 

ㅁ 문23. 모든 삭제 데이터에 대한 로그를 남기는 것이 원칙. 테이블의 데이터를 삭제하는 가장 좋은 방법은?

 

(1) DELETE FROM STADIUM;         (2) DELETE * FROM STADIUM;(3) TRUNCATE TABLE STADIUM;(4) DROP TABLE STADIUM; - DROP TABLE도 로그 안 남김. TRUNCATE TABLE도 로그 안 남기고.

 

ㅁ 문24. 아래의 고객지역 테이블을 대상으로 질의 결과와 같이 거주지와 근무지를 출력하고자 한다. (ㄱ)은?

 

[고객지역]                                                     [질의 결과]고객ID(PK)    거주지   근무지                거주지               근무지---------------------------------------                --------------------------------C001              서울     서울                         서울           서울C002              서울     서울                         울산          서울C003              울산     서울                         부산          부산C004              울산     서울                           ...             ...C005              부산     부산...                      ...          ...

 

[SQL]

SELECT (ㄱ) 거주지, 근무지

FROM 고객지역;

 

= 답 24. DISTINCT. 

= 'SELECT 거주지, 근무지 FROM 고객지역 GROUP BY 거주지, 근무지;' 도 가능

 

ㅁ 문25. 아래 상황에 쓸 수 있는 SQL 명령어는?

 

우리가 관리하는 데이터베이스의 "매출" 테이블이 너무나 많은 디스크 용량을 차지하여 "매출" 테이블에서 필요한 데이터만을 추출하여 별도의 테이블로 옮겨 놓았다. 이후 "매출" 원본 테이블의 데이터를 모두 삭제함과 동시에, 디스크 사용량도 초기화 하고자 한다.(단, "매출" 테이블의 스키마 정의는 유지한다.)

 

(1) TRUNCATE TABLE 매출;

(2) DELETE FROM 매출;

- 테이블의 데이터를 모두 삭제하지만, 디스크 사용량을 초기화 하지는 않는다. 

(3) DROP TABLE 매출;

- 테이블의 데이터를 모두 삭제하고, 디스크 사용량도 없앨(초기화) 수 있지만, 테이블의 스키마 정의도 함께 삭제됨.

(4) DELETE TABLE FROM 매출;

- 이런 명령어는 없음.

 

= 스키마란? 데이터의 구조.

데이터베이스를 구성하는 레코드의 크기, 키(key)의 정의, 레코드와 레코드의 관계, 검색 방법 등을 정의한 것.

 

ㅁ 문26. 다음 중 DELETE와 TRUNCATE, DROP 명령어에 대해 비교한 설명으로 가장 부적절한 것 2개는?

 

(1) 특정 테이블에 대하여 WHERE 조건절이 없는 DELETE 명령을 수행하면 DROP TABLE 명령을 수행했을 때와 똑같은 결과를 얻을 수 있다.

(2) DROP 명령어는 테이블 정의 자체를 삭제하고, TRUNCATE 명령어는 테이블을 초기 상태로 만든다.

- TRUNCATE TABLE은 테이블을 최초 생성된 초기 상태로 만듬. DELETE는 데이터만 삭제.

- TRUNCATE TABLE은 해당 테이블에 들어있던 모든 행들이 제거되고, 저장 공간을 재사용 가능하도록 해제한다.

(3) TRUNCATE 명령어는 UNDO를 위한 데이터를 생성하지 않기 때문에 동일 데이터량 삭제시 DELETE보다 빠르다.

(4) DROP은 AUTO COMMIT이 되고, DELETE와 TRUNCATE는 사용자 COMMIT으로 수행된다. 

- TRUNCATE도 DDL(일부 DML 성격)이어서 AUTO COMMIT이다. ROLLBACK 불가능. 

 

ㅁ 문28. 데이터베이스 트랜잭션에 대한 격리성이 낮은 경우 발생할 수 있는 문제점으로 가장 부적절한 2가지는?

 

(1) Dirty Read: 다른 트랜잭션에 의해 수정되었고 이미 커밋된 데이터를 읽는 것을 말한다.

- Dirty Read는 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 데이터를 읽는 것을 말한다. 

(2) Non-Repeatable Read: 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상을 말한다.

(3) Phantom Read: 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫번째 쿼리에서 없던 유령 레코드가 두번째 쿼리에서 나타나는 현상을 말한다.

(4) isolation: 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다.

- (4)은 데이터베이스 트랜잭션의 4가지 특성으로 문제점이 아니라 목표다.

 

= 답28. (1), (4).

 

- 트랜잭션(TRANS-ACTION)이란, 데이터베이스의 논리적 연산단위로서 밀접히 관련되어 분리될 수 없는 한 개 이상의 데이터 베이스 조작이다.

 

 

ㅁ 문29. 테이블 A에 대해 아래와 같은 SQL을 수행했을 때 테이블 A의 ID '001'에 해당하는 최종 VAL의 값이 ORACLE에서는 200, SQL Server에서는 100이 되었다. 다음 설명 중 가장 부적절한 것은?(단, auto commit은 FALSE로 설정되어 있다.)

 

[테이블 A]

ID(PK)        VAL

---------------------

001             100

002             200

 

[SQL]

UPDATE A SET VAL = 200 WHERE ID = '001';

CREATE TABLE B (ID CHAR(3) PRIMARY KEY);

ROLLBACK;

 

(1) ORACLE에서는 CREATE TABLE 문장을 수행한 후, 묵시적으로 COMMIT이 수행되어 VAL 값은 200이 되었다.

- ORACLE에서는 DDL 문장 수행 후 자동으로 COMMIT을 수행한다. (DML은 수동으로 써줘야 하지만)

- UPDATE는 됐지만 COMMIT은 안된 상태인데 DDL인 CREATE가 나와서 COMMIT 된거임.

(2) SQL Server에서는 ROLLBACK 문장에 의해 UPDATE가 취소되어 VAL 값은 100이 되었다. 

- SQL Server에서는 DDL 문장 수행 후 자동으로 COMMIT을 수행하지 않는다.

(3) ORACLE에서는 CREATE TABLE 문장 수행에 의해 VAL 값은 200이 되었지만, ROLLBACK 실행으로 인하여 최종적으로 B 테이블은 생성되지 않았다.

- ORACLE에서 DDL 문장의 수행은 내부적으로 트랜잭션을 종료시키므로 B 테이블은 생성된다.

(4) SQL Server에서는 ROLLBACK 실행으로 인하여 UPDATE가 취소되었으며, 최종적으로 B테이블은 생성되지 않았다. 

- SQL Server에서는 CREATE TABLE 문장도 TRANSACTION의 범주에  포함된다. 그러므로 ROLLBACK 문장에 의해서 최종적으로 B 테이블은 생성되지 않는다.

 

= 오라클. DDL은 항상 AUTO COMMIT.  DML은 수동 커밋.

SQL Server. DDL과 DML 모두 AUTO COMMIT. 수동커밋으로 전환하면 DDL, DML 다 롤백 가능. 

 

= 오라클에서 AUTO COMMIT FALSE 옵션은 DML에만 적용된다. 

= SQL Server에서 AUTO COMMIT은 DEFAULT가 TRUE이고 DDL, DML에 적용된다. 

 

= 트랜잭션의 대상은 DML(SELECT, INSERT, UPDATE, DELETE)이다. 

= AUTO COMMIT은 SQL Server의 기본 방식이다. DML, DDL을 수행할 때마다 자동으로 DBMS가 명령어가 성공적으로 수행되면 COMMIT을, 오류나면 ROLLBACK을 수행한다.

 

ㅁ 문31. 아래와 같은 테이블에 SQL 구문이 실행되었을 경우 최종 출력 값은?

 

[품목]

품목 ID    단가

--------------------

001       1000

002       2000

003       1000

004       2000

 

[SQL 구문]

BEGIN TRANSACTION 

INSERT INTO 품목(품목ID, 단가) VALUES('005', 2000) COMMIT

BEGIN TRANSACTION 

DELETE 품목 WHERE 품목ID = '002'

BEGIN TRANSACTION

UPDATE 품목 SET 단가=2000 WHERE 단가=1000 

ROLLBACK

SELECT COUNT(품목ID) FROM 품목 WHERE 단가=2000

 

= 답 31. 3. 'COMMIT' 전까지로 돌림.

 

ㅁ 문32. 아래의 상품 테이블의 데이터에 대하여 관리자가 아래와 같이 SQL 문장을 실행하여 데이터를 변경하였다. 데이터 변경 후의 상품ID '001'의 최종 상품명을 작성하시오.

 

[테이블: 상품]

상품ID     상품명

----------------------

001           TV

 

[SQL]

BEGIN TRANSACTION;

SAVE TRANSACTION SP1;

UPDATE 상품 SET 상품명 = 'LCD-TV' WHERE 상품ID = '001';

SAVE TRANSACTION SP2;

UPDATE 상품 SET 상품명 = '평면-TV' WHERE 상품ID = '001';

ROLLBACK TRANSACTION SP2;

COMMIT;

 

= 답32. LCD-TV

 

ㅁ 문33. 아래의 (ㄱ)에 들어갈 내용은?

 

SQL 을 사용하여 데이터베이스에서 데이터를 조회할 때 원하는 데이터만을 검색하기 위해서 SELECT, FROM 절과 함께 (ㄱ)을 이용하여 조회되는 데이터의 조건을 설정하여 데이터를 제한할 수 있다. 

 

= 답33. WHERE

 

ㅁ 문36. 다음 SQL 문장 중 COLUMN1의 값이 NULL이 아닌 경우를 찾아내는 문장으로 가장 적절한 것은?

 

= 답36. SELECT * FROM MYTABLE WHERE COLUMN1 IS NOT NULL

= NULL과의 비교연산은 IS NULL, IS NOT NULL만 쓸 수 있다. 그냥 NOT NULL 안됨.

 

ㅁ 문37. 아래와 같은 DDL 문장으로 테이블 생성하고, SQL들을 수행했을 때 다음 설명 중 옳은 것은?

 

CREATE TABLE 서비스(

서비스번호 VARCHAR2(10) PRIMARY KEY,

서비스명 VARCHAR2(100) NULL,

개시일자 DATE NOT NULL );

 

[SQL]

(ㄱ) SELECT * FROM 서비스 WHERE 서비스번호 =1;

(ㄴ) INSERT INTO 서비스 VALUES ('999', '', '2015-11-11');

(ㄷ) SELECT * FROM 서비스 WHERE 서비스명 = '';

(ㄹ) SELECT * FROM 서비스 WHERE 서비스명 IS NULL;

 

(1) 서비스번호 칼럼에 모든 레코드 중에서 '001'과 같은 숫자형식으로 하나의 레코드만이라도 입력되어 (ㄱ)은 오류 없이 실행된다.

= 모든 레코드가 '001'과 같은 숫자형식으로 입력되어 있어야 한다.

- aa1이면 안됨. varchar에 숫자도 가능한데 서비스번호를 숫자로 변환해서 비교하게됨. 이때 숫자 아닌게 있으면 오류.

(2) ORACLE에서 (ㄴ)과 같이 데이터를 입력하였을 때, 서비스명 칼럼에 공백문자 데이터가 입력된다.

- Oracle에서는 null로 입력된다.

(3) ORACLE에서 (ㄴ)과 같이 데이터를 입력하고, (ㄷ)과 같이 조회하였을 때, 데이터는 조회된다.

- Oracle에서는 (ㄹ)과 같이 조회해야 한다.

(4) SQL Server에서 (ㄴ)과 같이 데이터를 입력하고, (ㄹ)과 같이 조회하였을 때, 데이터는 조회되지 않는다.

- SQL Server에서는 (ㄷ)과 같이 조회해야 한다.

 

- null과 ''과 ' '(공백. 자리수1)은 다 다름.

- 공백은 cnt에 포함됨.

- 오라클은 ''을 null로 간주. mysql은 ''과 null이 다름. ''를 그대로 입력함. 그래서 is null로 조회가 안됨.

 

'SQLD > SQLD 오답노트' 카테고리의 다른 글

오답노트 (문39 ~ 문64) (2-1 과목 [하])  (1) 2023.11.14
오답노트 (문1 ~ 문52) (1과목)  (1) 2023.11.12