1. 이론적 배경
SQL 은 (Structure Query Language) 의 약어로
관계형 데이터베이스 관리 시스템(DBMS) 에 있는 데이터를 쿼리하고 관리하기 위해 설계된 표준 언어이다.
RDBMS는 관계형 모델(데이터를 표현하는 의미론적 모델)을 기반으로 하는
데이터베이스 관리 시스템을 말한다.
관계형 모델은 두개의 수학적인 원리.
즉, 집합 이론(Set Theory) 과 술어논리 (Predicate Logic) 을 기반으로 하고 있다.
2. SQL 이란?
SQL은 RDBMS에 저장된 데이터를 쿼리하고 관리할 목적으로 설계된,
관계형 모델을 기반으로 하는 ANSI및 ISO 표준 언어이다.
SQL은 영어와 상당히 유사한 구조로 매우 논리적인 형태를 띄고 있다.
다른 많은 프로그램에서 명령 형식의 프로그래밍 다이어그램 방식을 사용하는 것과는 달리
SQL은 선언적 방식을 사용한다.
즉 SQL 에서 얻고자 하는 결과 형태만을 명시하며,
어떻게 이 결과를 얻어내는지에 대해서는 명시하지 않는다.
결과를 어떻게 얻어낼지판단하는 것은 요구사항을 처리하기 위한
물리적인 방법을 결정하는 RDBMS 의 역할이다.
SQL 은 데이터 정의언어 DDL(Data Definitin Language) ,
데이터 조작언어 DML(Data Manipulation Language),
데이터 제어언어 DCL(Data Control Language) 로 구성되어 있다.
또 넓은 범위로 봤을 때는 트랜잭션 조작언어 TCL (Transaction Control Language) 도 포함시킨다.
DDL은 개체를 정의하는 데 사용되며 CREATE, ALTER, DROP 과 같은 구문들이 이에 속한다.
DML은 데이터를 쿼리하고 변경하는 데 사용되며
SELECT, INSERT, UPDATE, DELETE, TRUNCATE, MERGE 등과 같은 구문들이 이에 속한다.
DML 을 데이터를 변경하는 언어로만 오해하기 쉬운데,
조회만을 하는 SELECT 역시 DML 에 포함된다.
또한 TRUNCATE 가 DML 이 아닌 DDL 이라고 오해하기도 하는데,
실질적으로 TRUNCATE 는 DML 구문에 속한다.(TRUNCATE 와 DROP이랑 비슷하게 보이므로.)
DCL 은 권한을 설정하는 데 사용되며 GRANT, REVOKE 등이 그 예에 속한다.
TCL 은 말 그대로 논리적인 작업의 단위를 묶어서
DML에 의해 조작된 결과를 작업단위(트랜잭션) 별로 제어하는 명령어 하나의 트랜잭션을가지고
이것을 DB에 반영(reflect)시킬지, 취소(cancel)할지
트랜잭션이 반영된 것을 롤백(rollback)할지를 다루는 것이다.
COMMIT, ROLLBACK, SAVEPOINT 가 TCL에 속한다.
3. 집합이론
"집합" 이란 한정된 대상 "전체"의 모임인 M을 말하며,
이 대상들은 "일반적인 사고나 인지를 통해" "명확히 구분되는" 개체 m
(이를 M에 대한 "원소" 라고한다.) <칸토어>
칸토어의 정의에서 나오는 "전체"라는 용어부터 살펴보자.
집합은 단일 "개체"여아 한다.
집합체를 구성하는 각 개별 개체들이 아닌, 개체들의 집합체에 사고의 초점을 맞춰야 한다.
이런 의미에서 "전체" 라는 의미는 집합론에서 전체집합(全體集合, universal set)
즉, 모든 대상을 (자기 자신까지도) 원소로 포함하는 집합이다.
"명확히 구분되는"(distinct)이라는 것은 집합의 모든 원소들은 반드시 고유해야 한다는 것을 의미한다.
데이터베이스에 있는 테이블로 생각해보면,
테이블의 각 행에 대한 고유성은키 제약조건으로 설정할 수 있다.
테이블에 키가 없다면 행을 고유하게 구분할 수 있는 방법이 없으며,
이로인해 이 테이블은 집합으로서의 자격을 잃게 되고
단순히 멀티셋 또는 저장소로서의 역할밖에 하지 못하게 된다.
"일반적인 사고나 인지를 통해" 라는 것은 집합의 정의가 주관적이라는 것을 의미한다.
교실을 생각해보자. 어떤 사람은 교실을 사람들의 집합체로 생각할 수도 있으며,
다른 사람들은 학생이나 선생님들의 집합체로 생각할 수 있다.
이와 같이, 집합은 자유롭게 정의될 수 있다.
데이터베이스의 데이터 모델을 설계할 때에는,
이 모델에 포함되는 엔티티들에 대한 적절한 정의들을 정하기 위해
애플리케이션에서 사용하게 될 주 용도를 주의 깊게 이해하는 것이 필요하다.
집합의 정의에서 사용되는 "개체"라는 용어는 자동차나 직원과 같이
물리적인 대상을 한정짓는 의미뿐만 아니라 행 번호와 같은 추상적인 대상과도 관련이 있다.
집합내에서 각 원소들이 위치하는 순서는 중요하지 않다.
집합 원소들을 표기할 때에는 다음과 같이 중괄호를 사용해서 표현한다
: {a,b,c} 순서에 상관없기 때문에 {b,a,c} ,{c,b,a} 모두 같은 표현이다.
릴레이션(SQL 에서는 테이블) 의 헤더를 구성하고 있는 특성의 집합들(SQL에서는 컬럼)을 생각해보면,
각 원소는 이름만으로 구분될 뿐이며 물리적인 컬럼의 순서로는 구분되지 않는다.
이와 비슷한 방식으로 릴레이션의 몸체를 구성하는 튜플(SQL 에서는 행이라 한다)을 생각해보자.
원소는 키 값으로 구분될 뿐이며, 저장된 위치로는 구분되지 않는다.
많은 개발자들이 테이블에 대한 쿼리를 작성할 때,
각 행 간에는 특별한 순서가 존재하지 않는다는 사실을 이해하는 데 어려움을 겪에 된다.
즉, 데이터를 조회해서 출력하고자 하는 목적으로 쿼리를 작성할 때,
명시적으로 데이터를 어떻게 정렬해서 출력할지 지정하지 않는다면
테이블에서 출력되는 행들은 무작위로 출력될 수 있다.
(쿼리에서 top(n) 을 쓸때 order by 를 붙여줘야하는 이유기도 함)
4. 술어논리
술어란, 가지고 있느냐 아니면 가지고 있지 않느냐를 나타내는 표현식 또는 특성이라 할 수 있다.
다시 말해, 참 또는 거짓으로 표현된다.
관계형 모델에서는 데이터의 논리적 무결성을 유지하고 그 구조를 정의할 때 이 술어논리를 이용한다.
예를들어, Employee 라는 테이블에 반드시 0원 이상의 급여를 받는 직원들의 데이터만 저장하도록
제약 조건을 설정한다고 생각해보자.
술어는 "0원 이상의 급여" (T-SQL 표현식으로는 salaly >= 0) 가 된다.
이러한 술어들은 부분 집합을 만들기 위해 데이터를 필터링 하는 경우에도 이용된다.
예를 들어 Employee 테이블에 대해 쿼리를 해서 판매 부서의 직원들에 해당하는 행들만 출력하고 할 경우
"부서가 판매 부서다" 와 같은 술어 조건을 쿼리의 필터로 설정하게 된다.
(T-SQL 표현식으로는 department = 'sales')
5. 관계형 모델
관계형 모델은 데이터를 관리하고 이용하기 위한 의미론적 모델이며
집합 이론과 술어 논리를 기반으로 하고 있다.
관계형 모델의 목적은 데이터의 완벽함을 유지하면서
데이터의 중복을 최소한으로 또는 완전히 배제시킨 상태로
데이터의 지속적인 표현을 가능하도록 하면서,
데이터 모델의 일부분으로 데이터 무결성(데이터 일관성을 강화된 형태)을 정의하기 위한 것이다.
RDBMS는 관계형 모델을 구현하기 위한 시스템으로,
데이터에 대한 저장이나 관리, 무결성 강화, 쿼리 등을 지원한다.
관계형 모델이 강력한 수학적인 토대 위에 만들어졌다는 사실은,
어떤(나중에 물리적인 데이터베이스로 구현될) 데이터 모델 인스턴스가 설계의 결함이 있을 때
직관적으로 이러한 문제점들을 판단하는 것이 아니라
명확한 수학적인 이론으로 이러한 문제점들을 확실히 밝힐 수 있다는 것을 의미하기도 한다.
6. 명제, 술어, 관계
일반적으로 "관계형"이라는 용어가 테이블들 간의 관계에서부터 시작되었다라고 생각하지만,
이는 잘못된 것이다. "관계형"이라는 용어는 수학의 릴레이션이라는 용어에서 나온 말이다.
집합 이론에서의 릴레이션이란, 집합을 말하는 것이다.
관계형 모델에서의 릴레이션은 관련이 있는 정보들의 집합이며,
SQL에서의 테이블에 대응된다.
관계형 모델의 핵심은 단일 릴레이션이 단일 집합으로 표현된다는 점이다.
또한 릴레이션 간의 연산(join 과 같은 연산) 또한 릴레이션이다.
데이터베이스의 데이터 모델을 설계할 때,
모든 데이터는 릴레이션(테이블) 로 표현된다.
우선, 데이터베이스에서 표현하기 위한 명제를 정하는 것부터 시작해야한다.
명제는 반드시 참 또는 거짓 둘 중 하나인 명확한 문장이어야 한다.
예를 들어 "임윤아라는 가수는 1990년 5월 30일에 태어났으며 현재 소녀시대 멤버이다."
라는 문장은 명제가 된다.
이 명제가 참이라면 적당한 테이블에 하나의 행으로 표현될 수 있다.
이 명제가 거짓이라면, 단순히 테이블에 행이 존재하지 않는다.
이러한 방식의 가정을 닫힌 세계 가정(Close World Assumption,CWA)이라 한다.
다음 단계는 명제에 대한 규칙을 정하는 것이다.
이 작업은 실제 데이터(릴레이션의 몸체)를 이용하여 구조(릴레이션의 헤더)를 정하는 방식으로 수행된다.
명제에 대한 술어를 정의하는 것이 이러한 예다.
매개 변수화된 명제 형식으로 술어를 만들 수도 있다.
릴레이션 헤더는 특성들의 집합으로 구성된다.
관계형 모델에서 특성들은 순서가 없으며 각각 고유한 형태다.
특성은 특성의 이름과 형식을 통해 구분된다.
예를 들어 EMPLOYEE 릴레이션의 해더는 위와같은 특성들로 구성될 수 있다.
(특성 이름과 형식을 쌍으로 표기하고 있다.)
형식은 릴레이션에서 가장 기본적인 구조 단위 중 하나다.
형식은 특성에서 사용할 수 있거나 유효하다고 판단되는 값들에 대한 집합을 한정한다.
예를들어 INT 형은 -2,147,483,648 ~ 2,147,483,647 까지의 모든 정수들에 대한 집합이다.
형식은 데이터베이스에서 가장 단순한 술어 형태중 하나다.
이 형식을 통해 특성들이 가질 수 있는 값들이 제한되기 때문이다.
만약 employeeid 에 1993-08-23 일이라는 데이터를 넣는다면,
데이터베이스에서는 받아들여지지 않는다.
(employeeid 의 형식을 int 로 제한했기 때문이다.)
'SQL Basic' 카테고리의 다른 글
[MSSQL] INNER JOIN (0) | 2022.05.13 |
---|---|
[MSSQL] CROSS JOIN (0) | 2022.05.12 |
[MSSQL] JOIN (0) | 2022.05.11 |
[MSSQL] STRING_SPLIT 함수 (0) | 2022.01.23 |
DDL,DCL,DML,TCL (0) | 2021.12.27 |