포스트

제 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]

CD
11
21

[R]

AB
11
22

[S]

BC
11
21

① (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 칼럼은 무조건 포함해야 한다.


참고 자료


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.