Chapter 3. SQL문 접하기

목차
CREATE
ALTER
DROP
INSERT
UPDATE
DELETE
SELECT

기본적인 SQL문에서는 7가지종류의 SQL문이 있다. 그 종류를 살펴보면 다음과 같다.

Table 3-1. SQL의 종류

데이터베이스 구축 데이터 구축 사용자 쿼리
CREATE, ALTER, DROP INSERT, UPDATE, DELETE SELECT

위의 표에서 보는 바와 같이 우선 데이터베이스를 구축하는데 쓰이는 명령어, 데이터 구축시 쓰이는 명령어, 사용자 쿼리시 쓰이는 명령어 각각 3개, 3개, 1개 하여 모두 일곱 종류의 명령어를 알면 왠만한 SQL쿼리는 모두 다룰 수 있다. 그렇다면 각각의 SQL문에 대해 자세히 살펴 보도록 하자.

CREATE

CREATE는 데이터베이스 내에 틀을 만들 때 사용되는 명령어로써 CREATE뒤에 TABLE, VIEW, DATABASE, FUNCTION, INDEX, TRIGGER등이 따라 올 수 있으며 각각의 뒤에 붙는 명령어에 따라 테이블을 만들기도 하고, 뷰를 만들기도 하며, 함수를 만들기도 하며, 인덱스를 만들기도 한다. 우리가 알아 볼 것은 우선 테이블을 생성하는 것을 알아보도록 하겠다.

		
CREATE [ TEMPORARY | TEMP ] TABLE table (
    column type
    [ NULL | NOT NULL ] [ UNIQUE ] [ DEFAULT value ]
    [column_constraint_clause | PRIMARY KEY } [ ... ] ]
    [, ... ]
    [, PRIMARY KEY ( column [, ...] ) ]
    [, CHECK ( condition ) ]
    [, table_constraint_clause ]
    ) [ INHERITS ( inherited_table [, ...] ) ]
		

CREATE TABLE 명령어는 테이블 생성시 사용되는 명령어로써 뒤에 인자로 위와 같은 것들이 온다. 자세한 것은 PostgreSQL의 매뉴얼을 참조하기로 하고 몇가지만 찍어서 설명하도록 하겠다.

table 테이블의 이름 column type 각 컬럼의 타입이 온다. PostgreSQL에서 지원하는 타입은 \dT명령어를 넣으면 알 수 있다. 주로 많이 쓰이는 타입은 int, varchar, char, text, date, time, datetime 등이 있다. [NULL | NOT NULL] NOT NULL로 지정하면 그 컬럼에는 NULL이 올 수 없다. 기본으로는 NULL을 허용하고 있다. [UNIQUE] UNIQUE를 지정하면 그 테이블에서 입력한 값은 하나의 레코드에만 존재할 수 있다. [DEFAULT value] 임의의 값을 입력하지 않을 경우 DEFAULT뒤에 오는 값을 넣어 준다. PRIMARY KEY 테이블에서 Primary key로 지정한다. Primary key로 지정된 컬럼은 기본적으로 NOT NULL이며 UNIQUE하며 테이블을 생성함과 동시에 <tablename>_pkey라는 인덱스가 자동으로 생성된다. CHECK 들어갈 값의 범위를 임의적으로 지정하여 준다. 범위에서 어긋날 경우 입력이 되지 않는다.

몇가지를 제외하고 모두 설명하였는데 감이 오지 않을 것이다. 그러므로 예제를 통해서 알아 보도록 하겠다.

예제 3-1. 기본적인 CREATE TABLE예제

지난시간에 했던 student 테이블을 여기서 다시 만들어 보도록 하겠다.

CREATE TABLE student (
std_id CHAR(8), 
std_name VARCHAR(15), 
std_addr VARCHAR(50),
std_tel VARCHAR(15),
std_handphone VARCHAR(15),
std_birthday DATE
);
			

student라는 테이블을 만들기 위해 위와 같은 명령어를 입력하게 되면 테이블이 생성되게 된다. 생성된 테이블은 \d를 입력하여 확인할 수 있다.

그림 3-1. \d를 입력하여 생성된 테이블을 확인하자.

위에서도 언급했듯이 테이블의 구조를 살펴보려면 \d뒤에 테이블명을 넣어주면 그 테이블의 구조까지 나타나게 된다.

그림 3-2. \d를 이용해 테이블내의 필드정보들을 볼 수 있다.

이렇게 간단하게 테이블을 만들 수 있었다. 이번에는 좀 더 변형을 주어서 테이블을 만들어 보도록 하겠다.

예제 3-2. 조금 어려운 테이블 만들기

CREATE TABLE student2(
std_id CHAR(8) PRIMARY KEY, 
std_sex CHAR(1) DEFAULT 'M' CHECK (std_sex = 'M' OR std_sex = 'F'),
std_name VARCHAR(15) NOT NULL, 
std_addr VARCHAR(50) NOT NULL,
std_tel VARCHAR(15),
std_handphone VARCHAR(15),
std_birthday DATE NOT NULL
);
			

그림 3-3. student2 테이블을 만들자.

이번에는 방금 만들었던 테이블에서 약간 변형된 형태의 테이블인 student2라는 테이블이다. 아까의 것과 거의 비슷하나 std_sex라는 컬럼이 추가가 되었으며, 각 컬럼의 속성들이 더해졌다. std_id라는 컬럼은 PK(Primary key)로 지정되었고(위에서도 언급했듯이 PK로 지정을 하게되면 인덱스가 생성되며, 기본적으로 NOT NULL에 UNIQUE가 된다고 했었다.) std_sex컬럼은 들어갈 수 있는 값에 M과 F로 제한을 두었다. std_name, std_addr, std_birthday는 필수 항목으로 지정하여 NOT NULL이라고 지정해 두었다.

이렇게 생겨진 student테이블과 student2라는 테이블이 어떻게 다른지 다음의 쿼리를 넣어서 비교해 보도록 하자.

예제 3-3. 비교를 위한 쿼리예제

INSERT INTO student (std_id, std_name) VALUES ('9744043', '김윤한');
INSERT INTO student (std_id, std_name) VALUES ('9744043', '김윤한');
INSERT INTO student (std_id, std_name, std_addr, std_tel, std_handphone, std_birthday) 
VALUES ('9744043', '김윤한', '서울시 금천구 독산본동', '02-852-XXXX','011-9015-XXXX', '1978-11-07');
INSERT INTO student (std_name) VALUES ('김윤한');
			

그림 3-4. student 테이블에 데이터를 입력하자.

위와 같이 입력을 하게 되면 결과는 다음과 같다.

4개의 쿼리가 모두 같은 사람인데도 불구하고 모두 들어갔다. 심지어는 학번을 입력하지 않은 사람인데도 모두 들어간다. 이렇게 각각의 레코드를 구분할 수 있는 컬럼이 존재하지 않게 된다면 이후 하나의 레코드만 수정하는 것이 불가능하게 된다. 이래서 생기게 된 것이 바로 Primary Key의 개념이다. PK는 각 레코드간의 구분을 지을 수 있는 역할을 하게 되는 것이다.

두번째로 student2테이블에 값을 한번 넣어 보도록 하자.

예제 3-4. 입력될 값들 예제

INSERT INTO student2 (std_id, std_name) VALUES ('9744043', '김윤한');
INSERT INTO student2(std_id, std_name, std_addr, std_tel, std_handphone, std_birthday)
VALUES ('9744043', '김윤한', '서울시 금천구 독산본동', '02-852-XXXX',
'011-9015-XXXX', '1978-11-07');
INSERT INTO student2(std_id, std_name, std_sex, std_addr, std_birthday)
VALUES ('9744077', '모르는넘', 'M', '노숙', '1960-01-02');
INSERT INTO student2(std_id, std_name, std_sex, std_addr, std_birthday)
VALUES ('9744079', '게이', 'G', '게이빠', '1980-03-03');
			

그림 3-5. student2 테이블에 데이터를 입력하자.

위의 결과는 다음과 같다.

첫번째 쿼리는 에러가 나고 있다. std_addr컬럼에 값을 넣지 않아 NULL이 들어갔기 때문에 에러가 나게 된 것이다. 두번째 테이블은 std_sex컬럼을 제외한 모든 필드의 값을 넣어 주었더니 정상적으로 입력이 되었다. 이렇게 넣지 않은 std_sex 컬럼에는 기본값으로 지정하였던 'M'값이 들어가게 된다. 세번째 쿼리도 성공적으로 수행하였다. 네번째 컬럼의 경우 std_sex에 'G'값을 넣으려고 하자 에러가 발생하였다. 우리가 처음에 지정하였던 'M'과 'F'의 값을 벗어 나기 때문이다.

그러면 실제 두개의 테이블에 어떠한 값들이 들어가 있는지 비교해 보도록 하자.

그림 3-6. 두개의 테이블에 들어있는 값들을 비교해보자.

student테이블에는 같은 사람이 4개의 레코드에 걸쳐서 입력이 되어 있고, student2테이블에서는 쿼리를 제대로 수행한 두 사람만이 입력되어 있음을 알 수 있다.

지금까지 CREATE TABLE에 대해서 살펴보았다. 그외에도 많은 CREATE시킬 수 있는 것들이 존재하지만 여기에서는 다루지 않겠다. 이후 CREATE VIEW만 조금 더 살펴보도록 하겠다.