제 3장 관리 구문
Q. 데이터베이스를 정의하고 접근하기 위해서는 데이터베이스 관리 시스템과의 통신수단이 필요한데 이를 데이터 언어(Data Language) 라고 하며, 그 기능과 사용 목적에 따라 데이터 정의어(DDL), 데이터 조작어(DML), 데이터 제어어(DCL) 로 구분된다. 다음 중 데이터 언어와 SQL 명령어에 대한 설명으로 가장 부적절한 것은?
①
① 비절차적 데이터 조작어(DML)는 사용자가 무슨 데이터를 원하며, 어떻게 그것을 접근해야 되는지를 명세하는 언어이다.
② DML은 데이터베이스 사용자가 응용 프로그램이나 질의어를 통하여 저장된 데이터베이스를 실질적으로 접근하는데 사용되며 SELECT, INSERT, DELETE, UPDATE 등이 있다. ③ DDL은 스키마, 도메인, 테이블, 뷰, 인덱스를 정의하거나 변경 또는 제거할 때 사용되며 CREATE, ALTER, DROP, RENAME 등이 있다. ④ 호스트 프로그램 속에 삽입되어 사용되는 DML 명령어들을 데이터 부속어라고 한다.
- 사용자가 데이터에 어떻게 접근해야 되는지를 명세하는 언어는 절차적 언어이며, JAVA, PL-SQL(오라클), T-SQL(SQL Server)가 있다.
- 절차적 언어는 특정 조건에 어떻게 접근할 것인지를 개발자가 원하는 대로 명세할 수 있다.
- DML(SELECT, INSERT, DELETE, UPDATE)는 사용자가 무슨 데이터를 원하는지 결과만 보는 비절차적 언어이다.
- 데이터베이스는 완전한 프로그래밍 언어가 아니다. 파이썬이나 자바와 같은 언어에 포함되어 사용하기도 하기에 데이터 부속어라고 한다.
Q. 다음 중 아래의 데이터 모델과 같은 테이블 및 PK 제약조건을 생성하는 DDL 문장으로 올바른 것은? (DBMS는 오라클을 기준으로 한다.)
④
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
①
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);
②
CREATE TABLE PRODUCT(
PROD_ID VARCHAR2(10),
PROD_NM VARCHAR2(100),
REG_DT DATE,
REGR_NO NUMBER(10)
);
ALTER TABLE PRODUCT ADD CONSTRAINT PRODUCT_ PK PRIMARY KEY (PROD_ID);
③
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));
④
CREATE TABLE PRODUCT(
PROD_ID VARCHAR2(10) NOT NULL,
PROD_NM VARCHAR2(100) NOT NULL,
REG_DT DATE NOT NULL,
REGR_NO NUMBER(10),
CONSTRAINT PRODUCT_PK PRIMARY KEY (PROD_ID));
- ①, ②는 테이블을 생성한 후 제약조건을 추가(ALTER), ③,④는 테이블을 생성하면서 PK 제약조건을 동시에 적용시키는 구문이다.
- ① ALTER TABLE PRODUCT ADD CONSTRAINT PRODUCT_ PK PRIMARY KEY (PROD_ID)
- ② NULL, NOT NULL 제약조건 추가
- ③ ADD 불필요, PK명 기입
Q. 아래와 같이 데이터가 들어있지 않은 왼쪽의 기관분류 테이블 (가)를 오른쪽 기관분류 테이블 (나)처럼 변경하고자 할 때 다음 중 올바른 SQL 문장은? (단, DBMS는 SQL Server로 가정한다.)
④
1
2
3
4
5
6
7
8
9
① ALTER TABLE 기관분류 ALTER COLUMN(분류명 VARCHAR(30), 등록일자 DATE NOT NULL);
② ALTER TABLE 기관분류 ALTER COLUMN(분류명 VARCHAR(30) NOT NULL, 등록일자 DATE NOT NULL);
③ ALTER TABLE 기관분류 ALTER COLUMN 분류명 VARCHAR(30);
ALTER TABLE 기관분류 ALTER COLUMN 등록일자 DATE NOT NULL;
④ ALTER TABLE 기관분류 ALTER COLUMN 분류명 VARCHAR(30) NOT NULL;
ALTER TABLE 기관분류 ALTER COLUMN 등록일자 DATE NOT NULL;
- 여러 칼럼을 동시에 변경 불가능, 괄호 사용하지 않음
Q. 다음 중 NULL의 설명으로 가장 부적절한 것은?
③
① 모르는 값을 의미한다.
② 값의 부재를 의미한다.
③ 공백 문자 혹은 숫자 0을 의미한다.
④ NULL 과의 모든 비교(IS NULL 제외)는 알 수 없음(Unknown)을 반환한다.
- NULL 값이 데이터에 포함되어 있을 때 NULL로 인해서 결과값이 달라질 수 있기 때문에 항상 고려해서 비교할 수 있도록 해야한다.
Q. 아래 테이블 T, S, R의 각각 다음과 같이 선언되었다. 다음 중 DELETE FROM T; 를 수행한 후에 테이블 R에 남아있는 데이터로 가장 적절한 것은?
② (1, NULL)과 (2, NULL)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 DELETE SET NULL
);
- 현재 테이블 T, S, R의 상태는 다음과 같다.
[T]
C | D |
---|---|
1 | 1 |
2 | 1 |
[R]
A | B |
---|---|
1 | 1 |
2 | 2 |
[S]
B | C |
---|---|
1 | 1 |
2 | 1 |
① (1, NULL)과 (2, 2)
② (1, NULL)과 (2, NULL)
③ (2, 2)
④ (1, 1)
- T 테이블의 데이터가 삭제되었으므로 참조하고 있는 S 테이블의 데이터도 삭제된다.
- S 테이블 B 데이터 값이 삭제되었으므로 참조하고 있는 R 테이블의 B는 NULL 값으로 세팅된다.
Q. 다음 중 테이블 생성 시 컬럼별 생성할 수 있는 제약조건(Constraints)에 대한 설명으로 가장 부적절한 것은?
①
① UNIQUE : 테이블 내에서 중복되는 값이 없으며 NULL 입력이 불가능하다.
② PK : 주키로 테이블당 1개만 생성이 가능하다.
③ FK : 외래키로 테이블당 여러 개 생성이 가능하다.
④ NOT NULL : 명시적으로 NULL 입력을 방지한다.
- UNIQUE는 NULL 입력이 가능하며, PK는 NULL 입력이 불가능하며, 중복되는 값을 허용하지 않는다.
- FK의 행 값들은 여러 개가 중복이 되어도 상관없으며, 테이블당 여러 개 생성이 가능하다.
Q. 다음 중 물리적 테이블 명으로 가장 적절한 것은?
① SQL_10
① SQL_10
② 100-SQL
③ SQL-100
④ 100_ SQL
- 테이블 생성의 주의사항
- 테이블명은 객체를 의미할 수 있는 적절한 이름을 사용한다. 가능한 단수형을 권고한다.
- 테이블 명은 다른 테이블의 이름과 중복되지 않아야 한다.
- 한 테이블 내에서는 칼럼명이 중복되게 지정될 수 없다.
- 테이블 이름을 지정하고 각 칼럼들은 괄호
()
로 묶어 지정한다. - 각 칼럼들은 콤마
,
로 구분되고, 테이블 생성문의 끝은 항상 세미콜론;
으로 끝난다. - 칼럼에 대해서는 다른 테이블까지 고려하여 데이터베이스 내에서는 일관성 있게 사용하는 것이 좋다.(데이터 표준화 관점)
- 칼럼 뒤에 데이터 유형은 꼭 지정되어야 한다.
- 테이블명과 칼럼명은 반드시 문자로 시작해야 하고, 벤더별로 길이에 대한 한계가 있다.
- 벤더에서 사전에 정의한 예약어(Reserved word)는 쓸 수 없다.
- A-Z, a-z, 0-9, _, $, # 문자만 허용된다.
Q. 아래와 같은 테이블 구조를 정의하려고 한다. 이때 아직 부서가 정의되지 않은 사원은 기본부서(코드: ‘0000’)로 배치하고, 입사일자(JOIN_DATE) 기준으로 많은 조회가 발생하므로 입사일자 Index를 생성하려고 한다. 다음 중 올바른 SQL 문장을 2개 고르시오.
①, ③
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
①
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);
②
CREATE TABLE EMP (
EMP_NO VARCHAR2(10) PRIMARY KEY,
EMP_NM VARCHAR2(30) NOT NULL,
DEPT_CODE VARCHAR2(4) DEFAULT '0000',
JOIN_DATE DATE NOT NULL,
REGIST_DATE DATE
);
CREATE INDEX IDX_EMP_01 ON EMP (JOIN_DATE);
③
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 DATE
);
ALTER TABLE EMP ADD CONSTRAINT EMP_PK PRIMARY KEY(EMP_NO);
CREATE INDEX IDX_EMP_01 ON EMP (JOIN_DATE);
④
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);
- DEPT_CODE가 정의되지 않은 사원에 대해서 DEFAULT 값 설정
- ① PRIMARY KEY는 NOT NULL이 DEFAULT이므로 NOT NULL을 지정하지 않아도 된다.
- ② DEPT_CODE의 NOT NULL을 지정하지 않았다.
- ③ ALTER TABLE로 PK 지정 - 제약조건 추가
- ④ PK를 이미 지정했는데 ALTER로 재지정할 필요 없다.(오류 발생)
- 인덱스는 데이터베이스의 검색 속도를 빠르게 도와주는 역할을 한다.(성능 측면)
Q. 다음 중 아래와 같은 문장으로 학생 테이블을 생성한 후, 유효한 튜플(Tuple)들을 삽입하였다. SQL1, SQL2 문장의 실행 결과로 가장 적절한 것은?
③
1
2
3
4
5
6
7
CREATE TABLE 학생 (
학번 CHAR(8) PRIMARY KEY,
장학금 INTEGER
);
SQL1: SELECT COUNT(*) FROM 학생
SQL2: SELECT COUNT(학번) FROM 학생
① SQL1, SQL2 문장의 실행 결과는 다를 수 있으며, 그 이유는 장학금 속성(Attribute)에 널(Nul)값이 존재할 수 있기 때문이다.
② SQL1, SQL2 문장의 실행 결과는 항상 다르다.
③ SQL1, SQL2 문장의 실행 결과는 항상 같다.
④ SQL1, SQL2 문장의 실행 결과는 다를 수 있으며, 그 이유는 학번 속성(Attribute)에 널(Null)값이 존재할 수 있기 때문이다.
- COUNT(*)의 경우 NULL 값 관계 없이 학생 테이블의 모든 행의 수를 반환
- COUNT(특정 칼럼)의 경우 특정 칼럼에 NULL 값이 존재할 경우 그 NULL 값은 제외하고 COUNT를 한다.
- 학번 칼럼은 PK이므로 NULL 값을 허용하지 않는다.
Q. 다음 중 외래키에 대한 설명으로 가장 부적절한 것을 2개 고르시오.
②, ③
① 테이블 생성시 설정할 수 있다.
② 외래키 값은 널 값을 가질 수 없다.
③ 한 테이블에 하나만 존재해야 한다.
④ 외래키 값은 참조 무결성 제약을 받을 수 있다.
- FK는 테이블 B를 생성할 때 설정할 수 있다.
- PK와 다르게 외래키는 NULL 값을 허용한다.
- PK는 한 테이블에 하나만 존재해야 하지만, FK는 여러 개 존재할 수 있다.
- FK는 PK 칼럼을 참조하고 있기 때문에 PK에 존재하지 않는 값은 FK로 가질 수 없다.
Q. 다음 중 데이터베이스 테이블의 제약조건(Constraint)에 대한 설명으로 가장 부적절한 것은?
③
① Check 제약조건(Constraint)은 데이터베이스에서 데이터의 무결성을 유지하기 위하여 테이블의 특정 컬럼(Column)에 설정하는 제약이다.
② 기본키(Primary Key)는 반드시 테이블 당 하나의 제약만을 정의할 수 있다.
③ 고유키(Unique Key)로 지정된 모든 컬럼들은 Null 값을 가질 수 없다.
④ 외래키(Foreign Key)는 테이블간의 관계를 정의하기 위해 기본 키(Primary Key)를 다른 테이블의 외래키가 참조하도록 생성한다.
- Age가 18 이상인 값들만 넣는다.
- PK와 UNIQUE KEY의 가장 큰 차이점은 NULL 값의 허용이다.
- 외래키는 기본키의 어떤 특정 컬럼을 참조하여 부모 자식 간의 관계를 가질 수 있다.
Q. 4개의 칼럼으로 이루어진 EMP 테이블에서 COMM 컬럼을 삭제하고자 할 때, 아래 SQL 문장의 ㉠, ㉡ 안에 들어갈 내용을 기술하시오.
ALTER, DROP
㉠ TABLE EMP
㉡ COMMIT;
- 테이블의 구조 변경: ALTER
- DDL: ALTER, CREATE, DROP, RENAME
Q. 아래 7개의 SOL 문장이 성공적으로 수행되었다고 할 때, A, B, C 세 개의 SOL 문장을 차례대로 실행하면 A와 C의 SELECT 문장 수행결과는 각각 무엇인가?
② 3, 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE 부서(
부서번호 CHAR(10),
부서명 CHAR(10),
PRIMARY KEY(부서번호)
);
CREATE TABLE 직원(
직원번호 CHAR(10),
소속부서 CHAR(10),
PRIMARY KEY(직원번호),
FOREIGN KEY(소속부서) REFERENCES 부서(부서번호) ON DELETE CASCADE
);
INSERT INTO 부서 VALUES('10', '영업과');
INSERT INTO 부서 VALUES('20', '기획과');
INSERT INTO 직원 VALUES('1000', '10');
INSERT INTO 직원 VALUES('2000', '20');
INSERT INTO 직원 VALUES('3000', '20');
COMMIT;
1
2
3
4
A. SELECT COUNT(직원번호) FROM 직원
B. DELETE FROM 부서 WHERE 부서번호 = '20';
C. SELECT COUNT(직원번호) FROM 직원
COMMIT;
① 3, null
② 3, 1
③ 3, 2
④ 3, 3
- 직원번호는 PK이므로 COUNT 결과는 직원 테이블의 전체 행 수와 동일하다.
Q. STADIUM 테이블의 이름을 STADIUM_JSC로 변경하는 SQL을 작성하시오.(ANSI 표준 기준)
1
RENAME STADIUM TO STADIUM_JSC;
Q. 표준 SQL(SQL:1999)에서 테이블 생성시 참조관계를 정의하기 위해 외래키(Foreign Key)를 선언한다. 관계형 데이터베이스에서 Child Table의 FK 데이터 생성시 Parent Table PK가 없는 경우, Child Table 데이 터 입력을 허용하지 않는 참조동작(Referential Action)인 것은?
④ DEPENDENT
① CASCADE
② RESTRICT
③ AUTOMATIC
④ DEPENDENT
- DEPENDENT: 부모 테이블에 50이라는 데이터가 없기 때문에 자식 테이블에 먼저 들어올 수 없다. 즉, 의존하고 있다.
- CASCADE: DELETE 시 action, 마스터 삭제 시 차일드도 같이 삭제
- RESTRICT: DELETE 시 action, 차일드 테이블에 PK 값이 없는 경우에만 마스터 삭제를 허용(참조하고 있는데 사라지면 안 되므로 제한함)
- AUTOMATIC: INSERT 시 action, 마스터 테이블의 PK가 없는 경우 마스터 PK의 값을 생성해주는 역할 - 50을 부모 테이블에 만들고, 자식 테이블에도 50을 넣어줌
Q. 아래와 같은 SQL문에 대해 삽입이 성공하는 SQL 문은?
④, ⑤
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE TEL(
ID NUMBER PRIMARY KEY,
AMT NUMBER NOT NULL,
DEGREE VARCHAR2(1)
);
① INSERT INTO TBL VALUES(1, 100)
② INSERT INTO TBL(ID, AMT, DEGREE) VALUES(2, 200, 'AB')
③ INSERT INTO TBL(ID, DEGREE) VALUES(4, 'X')
④ INSERT INTO TBL(ID, AMT) VALUES(3, 300)
⑤ INSERT INTO TBL VALUES(5, 500, NULL)
- 테이블 명만을 명시할 경우, 테이블에 존재하는 모든 칼럼의 값을 VALUES 내에 넣어줘야 정상적으로 들어간다.
- ‘AB’는 VARCHAR2(2)
- 특정 칼럼 지정 시 NOT NULL 칼럼은 무조건 포함해야 한다.
참고 자료