March 17, 2020
SQL은 relation database 를 관리하기 위해 만들어진 언어이다. SQL은 다음과 같은 두 가지 sublanguage 를 포함하고 있다.
SQL은 세 종류의 relation을 만들 수 있다.
SQL 은 대부분의 primitive datatype을 지원한다.
String 은 고정되거나 변위하는 char형의 배열로 만들어진다
CHAR(n) -- 고정된 길이 n 만큼의 문자열
VARCHAR(n) -- 고정된 길이 n 만큼의 문자열두 자료형이 별로 차이가 없어보인다. 두 자료형의 차이는 빈공간을 어떻게 채우는지에 따라 다르다. 만약에 CHAR(4) 안에 길이가 2인 ‘AB’ 를 넣고 AB 뒤에 공백 두개가 더 추가된 ‘AB ’ 와 비교하면 두 문자열은 같다는 결과가 나올 것이다. 왜냐하면 CHAR는 입력되는 문자열의 길이와 상관없이 초기에 지정한 길이를 반드시 채우기 때문이다. 따라서 실제로 사용자는 ‘AB’ 를 넣었지만 변수 안에는 ‘AB ’ 이렇게 공백까지 들어가있는 셈이 된다. 하지만 VARCHAR는 공백도 문자로 취급한다. 따라서 VARCHAR(4) 안에 ‘AB ’ 를 넣고 ‘AB ’ 와 비교하면 VARCHAR에는 공백이 하나밖에 없기 때문에 둘은 다르다는 결과를 얻게 될 것이다. 따라서 일반적으로 길이가 항상 고정되어 있는 데이터를 다룰 때에는 CHAR, 길이가 변할 수 있는 데이터를 다룰 때에는 VARCHAR를 사용한다.
단순히 비트들도 연속성 있게 표현할 수 있는데, 이떄 역시 고정 크기인 BIT로 표현하거나 가변크기인 BIT VARYING 으로 표현할 수 있다.
BIT(n)
BIT VARYING(n)우리가 잘 아는 TRUE/FALSE 를 가지는 자료형이다. SQL은 특이하게 TRUE/FALSE 와 함께 UNKNOWN 값이 존재한다. UNKNOWN은 null이라고 생각하자.
BOOLEAN
FALSE
TRUE
NULL -- UNKNOWN정수는 INT 혹은 INTEGER로 나타낸다. 더 작은 크기의 정수를 나타내기 위한 SHORTINT 도 있다.
INT
INTEGER -- INT와 같은 의미이다.
SHORTINT실수는 다양한 방법으로 나타낼 수 있다.
FLOAT
REAL -- FLOAT과 같은 의미이다.
DOUBLE PRECISION -- 더 긴 소수점 자리수를 표현할 때
DECIMAL(n, d) -- n 은 소수를 포함한 총 자리수, d는 소수점의 자리수
NUMERIC -- DECIMAL과 같은 의미이다.다른 프로그래밍 언어와 조금 다르게 시간과 날짜에 대한 자료형이 있다.
DATE
TIME기본적인 SQL에 대한 지식은 보았으니, SQL로 데이터베이스를 조작해보자.
먼저, 테이블을 만들어보자. relation schema는 CREATE TABLE 이라는 명령어를 통해 만들 수 있다. 테이블을 만들면서 attribute 와 domain 까지 지정할 수 있는데 다음 과 같이 만들면 된다.
CREATE TABLE Department(
Dep.Name CHAR(100),
Num.Stu INT,
Num.prof INT,
Num.alum INT
);이렇게 하면 Department라는 이름의, attribute를 네 개 가지고 있는 테이블이 만들어진다.
만약에 만들어진 테이블을 지우고 싶다면 어떻게 해야할까. DROP 키워드를 사용해서 삭제해보자.
DROP TABLE Department이렇게 명령어를 입력하면 Department 라는 이름을 가진 테이블이 데이터베이스에서 삭제된다.
사실 테이블 잔체를 삭제하는 경우는 잘 없다. 삭제나 수정은 보통 부분적으로 일어나는 경우가 많은데 다음과 같은 명령어로 처리하게 된다.
ALTER TABLE Departmet ADD Foundyear -- Department 테이블에 Foundyear라는 attribute 를 추가한다.
ALTER TABLE Department DROP Foundyear -- Department 테이블에 Foundyear라는 attribute 를 삭제한다.위의 두 명령어를 사용하면 relation 안에 들어있는 attribute들을 삭제하거나 추가할 수 있다.
우리는 tuple에 있는 모든 component에 데이터를 넣을 수 있지만, 데이터를 방금 만들어서 집어넣거나 ADD 명령어를 통해서 새로운 attribute를 만들었을 때와 같은 경우에서는 component 안에 데이터가 없을 수도 있다. 기본적으로 사용자가 입력하지 않은 데이터들은 모두 NULL로 초기화가 된다. 하지만 특정한 attribute에 대해서 기본값을 정해줄 수 있는데, 그 키워드가 DEFAULT 이다.
Name CHAR(1) DEFAULT '?' -- Name attribute의 기본값을 ?로 설정Default와 table alter를 함께 사용해서 새로운 attribute를 생성하면서 동시에 기본값을 정의해주는 방법도 있다.
ALTER TABLE professor ADD phonenum CHAR(11) DEFAULT 'unknown'이렇게 하면 professor 라는 테이블에 phonenum이라는 attribute 를 추가하고 그 기본값이 unknown이 되도록 할 수 있다.
CREATE KEY 를 하면서 한 개 이상의 attribute를 key로 지정해주는 것이 가능하다. KEY를 지정할 때는 PRIMARY KEY, 혹은 UNIQUE를 사용해서 지정해주면 된다. PRIMARY KEY 와 UNIQUE의 차이점은 PRIMARY KEY로 설정된 attribute 안에서는 모든 component들이 NULL을 가질 수 없고, 동일한 값을 가질 수도 없다. 하지만 UNIQUE에서는 동일한 값은 역시 가질 수 없지만 여러개의 NULL을 component가 가지는 것은 허용한다.
CREATE TABLE Department(
Dep.Name CHAR(100) PRIMARY KEY,
Num.Stu INT,
Num.prof INT,
Num.alum INT
);이렇게도 가능하고
CREATE TABLE Department(
Dep.Name CHAR(100),
Num.Stu INT,
Num.prof INT,
Num.alum INT
PRIMARY KEY(Dep.Name)
);이렇게 attribute를 먼저 만들고 key를 지정해주는 것도 가능하다.