1. DDL 개요
01. DDL 대상
- DDL(Data Definition Language)은 '데이터를 정의하는 언어'이며, 이러한 그릇을 DBMS에서는 오브젝트라고 한다
- DDL을 통해 정의할 수 있는 대상, 오브젝트 유형은 다음과 같다

- DDL 조작 방법
- 오브젝트를 생성, 변경 그리고 제거하기 위해 다음과 같은 명령어를 사용

02. DDL 활용
- 데이터베이스에 구축하기 위해 스키마, 테이블, 도메인, 인덱스, 뷰와 같은 오브젝트에 대한 DDL 적용이 필요하다
- 테이블 생성
- 테이블 생성을 위한 DDL 사용 방법은 다음과 같이 두 종류로 분류할 수 있다

- 테이블 변경
- ALTER를 이용하여 테이블 구조를 변경하는 문법은 다음과 같다

- 테이블 삭제, 절단, 이름 변경
- 아래와 같은 명령문을 사용하여 테이블을 삭제, 절단, 이름 변경을 할 수 있다
- 테이블 및 테이블 내용을 삭제하기 위한 명령어의 사용 문법은 다음과 같다

03. 제약 조건 적용
- 제약 조건 유형 다음과 같은 제약 조건을 테이블 생성 과정에 적용할 수 있다

- 제약 조건 활용
- 테이블 생성을 위한 CREATE 문에 제약 조건을 명시하는 형태로 사용하며, ALTER를 통해 테이블의 제약 조건을 변경할 수 있다
2. DML 개요
- DML 의미 데이터를 조작하는 명령어를 DML(Data Manipulation Language)이라고 한다
- 여기서 조작은 데이터 관점에서 생명 주기를 제어하는 것을 의미 한다
01. DML 유형
- 데이터의 생명 주기 관리 및 활용을 위해 사용하는 DML 명령어는 다음과 같다

02. DML 명령문
- 데이터 삽입(INSERT)
- 데이터를 삽입하기 위한 명령어로 다음과 같이 두 가지의 형태의 명령문 형식을 제공한다
- 이때 데이터 삽입 결과로 하나의 레코드가 추가된다
- 따라서 삽입에 사용되는 정보는 하나의 레코드를 충분히 묘사해야 한다

- 데이터 조회(SELECT)
- 데이터 내용을 조회할 때 사용하는 명령어이다
- 가장 많이 사용되는 SQL 명령어로서, 다른 DML 명령어와 같이 사용되어 SQL의 활용을 풍부하게 한다
- SELECT 명령어의 기본 형식은 다음과 같다

- SELECT문에 사용되는 각 정보는 다음과 같다

- 데이터 수정(UPDATE)
- 데이터를 수정할 때 다음과 가튼 형태의 UPDATE 명령문을 사용한다

- UPDATE 명령문은 보통 WHERE절을 통해 어떤 조건이 만족할 경우에만 특정 컬럼의 값을 수정하는 용도로 많이 사용된다
- 데이터 삭제(DELETE)
- 레코드를 삭제할 때 다음과 같은 형태의 DELETE 명령문을 사용한다

- 조건절 없이 DELETE를 사용하는 경우 테이블 전체가 한 번에 삭제되는 위험이 있다
3. DCL 개요
01. DCL 유형
- 데이터 베이스에서 데이터 이외의 오브젝트에 대해 조작할 필요가 있다
- 이때 사용하는 SQL 명령을 DCL(Data Control Language)이라고 한다
- DCL의 조작 대상, 오브젝트 유형은 다음과 같다

- 트랜잭션 제어를 위한 명령어 TCL(Ttransaction Control Language)이 있다
- TCL과 DCL은 대상이 달라 서로 별개의 개념으로 분류할 수 있으나 제어 기능의 공톰점으로 DCL의 일부로 분류하기도 한다
- 각 유형별 DCL 명령어는 다음과 같다

02. DCL 활용
- 사용자 권한 부여 권한은 시스템 권한과 객체 권한으로 분류한다
- 각 권한을 부여하기 위한 명령어 사용법은 다음과 같다

- 시스템 권한과 객체 권한의 종류는 다음과 같다

- 사용자 권한 회수
- GRANT에 대응하는 권한 회수 명령은 REVOKE이며 권한 유형별 대응하는 명령어 구조는 다음과 같다

03. TCL 활용 방법
- 트랜잭션 개념 트랜잭션은 '일 철리 단위'를 의미한다
- 보다 다양한 관점에서 트랜잭션은 다음과 같은 모습을 가진다
- 트랜잭션은 논리적 연산 단위이다
- 한 개 이상의 데이터베이스 조작이다
- 즉, 하나 이상의 SQL 문장이 포함된다
- 트랜잭션은 '거래'다
- 이때 거래 결과가 모두 반영되거나 또는 모두 취소 되어야 한다
- 즉, 데이터베이스에서의 트랜잭션은 특별한, 엄격한 거래를 의미한다
- 분할할 수 없는 최소 단위이다
- 트랜잭션 제어 트랜잭션을 제어한다는 것은 흐름의 구조를 바꾼다는 것이 아니라 트랜잭션의 결과를 수용하거나 취소하는 것을 의미한다
- 이러한 작업을 수행하는 TCL 관련 명령어는 다음과 같다

4. 인덱스 개요
01. 인덱스의 개념
- 인덱스는 데이터를 빠르게 찾을 수 있는 수단으로서 테이블에 대한 조회 속도를 높여 주는 자료구조를 일컫는다
- 인덱스는 다음 그림과 같이 테이블의 특정 레코드 위치를 알려주는 용도롤 사용하는데, 이러한 인덱스는 자동으로 생성되지 않는다

- PK 컬럼은 PK를 생설할 때 자동으로 인덱스가 생성된다
- 즉, PK 컬럼은 PK를 생설할 때 자동으로 PK인덱스가 생성된다
- 인덱스 생성 문법은 다음과 같다

- 여기서 각각의 파라미터가 의미하는 내용은 다음과 같다

- 인덱스 삭제 명령 형식은 다음과 같다

- <index_name>은 생성된 인덱스 이름을 의미한다
- 인덱스 관련 명령어에 대한 SQL 표준이 없기에 제품별 DROP 명령문의 사용법은 약간씩 다르다
- 보통 인덱스를 테이블의 종속 구조로 생각하여 인덱스를 삭제하기 위해 테이블의 변경을 가하는 형식의 명령을 사용한다
- 즉, ALTER TABLE 명령 뒤에 DROP INDEX 명령이 추가되는 형태로 사용된다
- 인덱스에 대한 정의를 명령문 형식은 다음과 같다

- 한 번 생성된 인덱스에 대해 변경이 필요한 경우는 드물다
- 또 인덱스 관련 SQL문은 표준화가 안 되어있으므로 인덱스 변경에 대한 명령문 지원 여부 및 방법은 벤더별로 다르다
- 일부 제품은 인덱스에 대한 변경 SQL문이 없다
- 이 경우 기존 인덱스를 삭제하고 신규 인덱스를 생성하는 방식으로 사용이 권고되고 있다
5. View 개요
- 뷰는 논리 테이블로서 사용자에게(생성 관점 아닌 사용 관점에서) 테이블과 동일하다
- 아래 그림에서 '테이블 A'와 '테이블 B'는 물리 테이블을 의미하고 '뷰C'는 두 개의 테이블을 이용하여 생성한 뷰를 의미한다

- 뷰는 '테이블A'와 같은 하나의 물리 테이블로부터 생성 가능하며, 다수의 테이블 또는 다른 뷰를 이용해 만들 수 있다
- 위 그림의 뷰와 같은 결과를 만들기 위해 조인(Join) 기능을 활용할 수 있으나, 뷰가 만들어져 있다면 사용자는 조인 없이 하나의 테이블을 대상으로 하는 단순한 쿼리문을 사용할 수 있다
01. view 활용 상세
- 뷰 사용하는 주된 이유는 다음과 같은 단순한 쿼리문을 사용할 수 있기 때문이다

- 즉, FROM 절에 있는 하나의 <뷰>를 통해 뷰를 구성하는 복수의 <테이블>을 대처하는 단순성에 그 의의가 있다
- 또 이러한 기능을 통해 테이블의 중요 데이터 일부만들 제공할 수 있는 등 다음과 같은 장점이 있다

- 반면 다음과 같은 단점이 있다

- 뷰를 사용하기 위해서는 우선 뷰를 만들어야 한다
- 뷰의 단순한 사용은 생성 과정에 의존적이다
- 즉, 뷰를 어떻게 생성하였느냐에 따라 사용 방법이 달라진다
02. 뷰 생성 명령어
- 뷰 생성 명령어의 일반 형태는 다음과 같다

- 뷰 삭제 및 변경
- 뷰 정의 자체를 변경하는 것은 불가능하다
- 일단 뷰를 정의하면 뷰의 물리적 내용은 뷰의 이름과 데이터를 조회하기 위한 쿼리문뿐이다
- 이때 뷰의 이름이나 쿼리문을 변경하는 수단은 제공되지 않는다
- 이 경우 뷰의 삭제와 재생성을 통해 뷰에 대한 정의 변경이 가능하다
- 뷰를 삭제하는 쿼리문은 다음과 같다

- 뷰 내용 변경
- 뷰를 통해 접근 가능한 데이터에 대한 변경이 가능하다
- 하지만 모든 경우에 데이터의 변경이 가능한 것이 아니라 일부 제약이 존재한다
- 이러한 제약은 뷰 자체가 논리적 개념이기에 물리적 상황에 의존적임을 의미
- 예를 들어 PK에 해당하는 컬럼이 뷰에 정의되어 있지 않은 경우 INSERT는 당연히 불가능하다
6. 다중 테이블 검색 방법
- 관계형 데이터베이스는 데이터의 중복을 최소화하기 위해 데이터를 분해하여 저장하고 통합하여 사용한다
- 데이터를 분해하는 방법으로 정규화 기법이 사용되며, 통합하는 기법으로 다중 테이블에 대한 검색이 사용된다
- 다중 테이블을 이용하는 보다 세부적인 기법은 다음과 같다

7. 조인(JOIN)
01. 조인 개념
- 조인은 결합을 의미하며, 조인은 교집합 결과를 가지는 결합 방법을 의미한다
- 교집합이 되는 공통점은 다양한 관점에서 정의될 수 있다
- 여기서 그 관점을 정의하는 것이 바로 조인이 조건이 된다
- 조인은 두 테이블의 공통값을 이용하여 컬럼을 조합하는 수단이다
- 보통 PK와 FK 값을 결합하여 사용하는 것이 일반적이지만 보다 엄밀하게 말하자면 PK, FK와 관계없이 논리적인 값들의 연관을 사용한다
- 세 개 이상의 테이블에 대한 결합은 두 개의 테이블을 우선 결합하고 그 결과와 나머지 한 개의 테이블을 다시 결합한다
02. 조인 유형
- 조인은 관계형 데이터베이스의 가장 큰 장점이면서 대표적인 핵심 기능이라고 할 수 있다
- 조인은 크게 물리적 조인과 논리적 조인으로 구분할 수 있으며 물리적 조인은 데이터 베이스의 성능을 높이기 위한 튜닝 관점에서 다루는 주제이다

- 논리적 조인은 크게 내부 조인과 외부 조인으로 구분할 수 있으며 각각의 세부 유형은 다음과 같이 구분할 수 있다

8. 서브쿼리(Sub Query)
01. 서브쿼리 개념
- 서브쿼리는 다음 그림과 같이 SQL문 안에 포함된 또 다른 SQL문을 의미한다
- 서브 쿼리의 용도는 알려지지 않은 기준을 위한 검색을 위해 사용한다

- 메인 쿼리와 서브 쿼리 관계는 주종 관계로서, 서브쿼리에 사용되는 컬럼정보는 메인 쿼리의 컬럼 정보를 사용할 수 있으나 역으로는 성립하지 않는다
02. 서브쿼리의 유형
- 서브쿼리는 동작하는 방식이나 반환되는 데이터의 형태에 따라 분류할 수 있다
- 동작하는 방식에 따른 서브쿼리의 종류는 다음과 같다

- 반환되는 데이터 형태에 따른 서브쿼리의 종류는 다음과 같다

- 서브 쿼리 결과가 여러 컬럼으로 반환되는 서브 Mulitple Column(다중 컬럼)
- 메인쿼리의 조건절에 여러 컬럼을 동시에 비교할 때, 서브쿼리와 메인쿼리에서 비교하는 컬럼 개수와 위치가 동일해야함