SQL1: DDL/DML/DCL/Procedure VS Non-procedure
이 글에서는 University Database가 사용된다.
관계대수가 관계형 데이터베이스의 language라면 SQL은 사용자와 DB간의 의사소통을 할 때 사용하는 language라고 할 수 있다. 다른말로는, 사용자가 DBMS에 명령을 내리는 방식으로 생각할 수 있다.
SQL은 기능적 관점에서 3가지로 나눌 수 있다.
- DDL(Data Definition Language): 스키마를 만든다.
- DML(Data Manipulation Language): 데이터베이스 테이블 조직에 대한 부분
- DCL(Data Control Language): 트랜잭션, 세션, 보안, 권한 등의 약속
그리고 database language는 절차적(procedure)언어와, 비절차적(non-procedure)언어로 나눌 수 있다. 비절차적 언어는 다른말로 선언적(Declarative)언어라고 부른다.
Data Defenition Language(DDL)
스키마의 생성, 조작과 관련된 언어이다. 예시로 professor라는 스키마를 정의하는 것을 알아보자.
CREATE table professor(
pID char(5),
name varchar(20),
deptName varchar(20),
salary numeric(8, 2));
professor라는 스키마를 정의하고 있고, 각 속성이름과 속성 값과 타입을 입력된 것을 볼 수 있다.
DDL은 도메인은 표현한다고도 할 수 있다.
실세계의 제약을 표현할 수 있다.
'column값이 null이 되면 안된다.'등의 정보를 표현할 수 있다. DDL 컴파일러가 컴파일링, 문법 검사, 테이블 생성을 통해 스키마의 정보를 Data Dictionary에 저장한다.
Data Manipulation Language(DML)
데이터베이스 인스턴스를 조작하는 언어이다.
데이터 검색(select), 삽입(Insert), 삭제(delete), 갱신(update)에 해당한다.
DML에 해당하는 언어를 질의어 라고한다.
Data Control Language(DCL)
데이터베이스 시스템의 스키마와 인스턴스를 제외한 다른 객체를 조작하는 데이터베이스 언어가 DCL이다. 컨트롤에 관련된 명령어, 약속이 들어가 있다.
- 여러개의 트랜잭션이 내부에서 처리된다.
- user가 여러개의 질의처리를 요구하는 경우 DBMS가 Session을 생성해 여러개의 트랜잭션을 수행해준다.
- failure시 복구해준다.
- 테이블을 생성하면 권한을 가진다. 권한을 또다른 유저에게 전달하거나 회수해준다(grant/revoke)
절차적(Procedural) vs 비절차적(선언적, Declarative)
Procedural
procedural 은 사용자가 데이터베이스 시스템에 조건을 주고 조건에 맞는 데이터를 검색하라 하였을 때, 데이터베이스에 맞는 질의를 작성한다.(관계대수, C, C++, Java, etc.) 명령어에 대한 어떤 데이터(what data)에 대한 정보 뿐만 아니라 그 데이터를 어떻게 얻는지 (how to get)에 대한 정보도 제공한다.
Non-procedural
SQL, Prolog, Lisp등이 여기에 해당하며, 데이터를 어떻게 얻는지에 대한 how라는 정보가 필요 없고, what data에 대한 정보만 필요로 한다.
사용자는 what 이라는 정보만 담은 query를 전달하고, DBMS는 이 데이터를 다루기 위해서 how 라는 정보를 필요로 한다. 따라서 내부에서 훨씬 복잡한 관계대수가 사용되어 what 뿐만 아니라 how 에 대한 내용도 표현한다.