[데이터베이스] SQL 기본문법과 자료형

SQL?

SQL은 relation database 를 관리하기 위해 만들어진 언어이다. SQL은 다음과 같은 두 가지 sublanguage 를 포함하고 있다.

  1. Data-Defining sublanguage(DDL): 데이터베이스 schema를 선언하기 위한 언어
  2. Data-Manipulation sunlanguage(DML): 데이터베이스를 수정하기위한 언어이고, 데이터베이스의 수정을 위해 데이터베이스에게 요청하는 과정을 querying 이라고 한다.

Relations in SQL

SQL은 세 종류의 relation을 만들 수 있다.

  1. Table: 일반적으로 우리가 말하는 relation의 형태를 띄는 종류이다. 데이터들이 tuple로 묶여서 relation 안으로 들어가고 query를 통해서 수정되고 추가될 수 있다.
  2. View: 연산의 결과로 만들어지는 relation이다. 실제 물리적으로는 저장되어있지 않지만 가상의 테이블을 만들어 연산을 돕는 기능이다.
  3. Temporary table: query를 통해 데이터베이스가 수정될 때 임시적으로 만들어지는 relation이다. 오로지 연산을 위해서만 사용되고 사용이 끝나면 곧바로 버려진다.

Data Types in SQL

SQL 은 대부분의 primitive datatype을 지원한다.

String

String 은 고정되거나 변위하는 char형의 배열로 만들어진다

CHAR(n) -- 고정된 길이 n 만큼의 문자열
VARCHAR(n) -- 고정된 길이 n 만큼의 문자열

CHAR vs. VARCHAR

두 자료형이 별로 차이가 없어보인다. 두 자료형의 차이는 빈공간을 어떻게 채우는지에 따라 다르다. 만약에 CHAR(4) 안에 길이가 2인 ‘AB’ 를 넣고 AB 뒤에 공백 두개가 더 추가된 ‘AB ’ 와 비교하면 두 문자열은 같다는 결과가 나올 것이다. 왜냐하면 CHAR는 입력되는 문자열의 길이와 상관없이 초기에 지정한 길이를 반드시 채우기 때문이다. 따라서 실제로 사용자는 ‘AB’ 를 넣었지만 변수 안에는 ‘AB ’ 이렇게 공백까지 들어가있는 셈이 된다. 하지만 VARCHAR는 공백도 문자로 취급한다. 따라서 VARCHAR(4) 안에 ‘AB ’ 를 넣고 ‘AB ’ 와 비교하면 VARCHAR에는 공백이 하나밖에 없기 때문에 둘은 다르다는 결과를 얻게 될 것이다. 따라서 일반적으로 길이가 항상 고정되어 있는 데이터를 다룰 때에는 CHAR, 길이가 변할 수 있는 데이터를 다룰 때에는 VARCHAR를 사용한다.

Bit

단순히 비트들도 연속성 있게 표현할 수 있는데, 이떄 역시 고정 크기인 BIT로 표현하거나 가변크기인 BIT VARYING 으로 표현할 수 있다.

BIT(n)
BIT VARYING(n)

Boolean

우리가 잘 아는 TRUE/FALSE 를 가지는 자료형이다. SQL은 특이하게 TRUE/FALSE 와 함께 UNKNOWN 값이 존재한다. UNKNOWN은 null이라고 생각하자.

BOOLEAN
FALSE
TRUE
NULL -- UNKNOWN

Integer

정수는 INT 혹은 INTEGER로 나타낸다. 더 작은 크기의 정수를 나타내기 위한 SHORTINT 도 있다.

INT
INTEGER -- INT와 같은 의미이다.
SHORTINT

Floating Point

실수는 다양한 방법으로 나타낼 수 있다.

FLOAT
REAL -- FLOAT과 같은 의미이다.

DOUBLE PRECISION -- 더 긴 소수점 자리수를 표현할 때
DECIMAL(n, d) -- n 은 소수를 포함한 총 자리수, d는 소수점의 자리수
NUMERIC -- DECIMAL과 같은 의미이다.

Data and Time

다른 프로그래밍 언어와 조금 다르게 시간과 날짜에 대한 자료형이 있다.

DATE
TIME

Let’s Dive into SQL!

기본적인 SQL에 대한 지식은 보았으니, SQL로 데이터베이스를 조작해보자.

Table Declaration

먼저, 테이블을 만들어보자. relation schema는 CREATE TABLE 이라는 명령어를 통해 만들 수 있다. 테이블을 만들면서 attribute 와 domain 까지 지정할 수 있는데 다음 과 같이 만들면 된다.

CREATE TABLE Department(
    Dep.Name    CHAR(100),
    Num.Stu     INT,
    Num.prof    INT,
    Num.alum    INT
);

이렇게 하면 Department라는 이름의, attribute를 네 개 가지고 있는 테이블이 만들어진다.

Modifying Relation

Remove table

만약에 만들어진 테이블을 지우고 싶다면 어떻게 해야할까. DROP 키워드를 사용해서 삭제해보자.

DROP TABLE Department

이렇게 명령어를 입력하면 Department 라는 이름을 가진 테이블이 데이터베이스에서 삭제된다.

Modify table

사실 테이블 잔체를 삭제하는 경우는 잘 없다. 삭제나 수정은 보통 부분적으로 일어나는 경우가 많은데 다음과 같은 명령어로 처리하게 된다.

ALTER TABLE Departmet ADD Foundyear -- Department 테이블에 Foundyear라는 attribute 를 추가한다.
ALTER TABLE Department DROP Foundyear -- Department 테이블에 Foundyear라는 attribute 를 삭제한다.

위의 두 명령어를 사용하면 relation 안에 들어있는 attribute들을 삭제하거나 추가할 수 있다.

Default Value

우리는 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이 되도록 할 수 있다.

Declaring Keys

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를 지정해주는 것도 가능하다.


Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.