예제를 통한통한 postgresql에서의 postgresql에서의...

43
예제를 예제를 예제를 예제를 통한 통한 통한 통한 PostgreSQL PostgreSQL PostgreSQL PostgreSQL 에서의 에서의 에서의 에서의 간단한 간단한 간단한 간단한 SQL SQL SQL SQL 문법의 문법의 문법의 문법의 이해 이해 이해 이해: PostgreSQL : PostgreSQL : PostgreSQL : PostgreSQL 입문 입문 입문 입문 Chapter 1. Chapter 1. Chapter 1. Chapter 1. 들어가기에 들어가기에 들어가기에 들어가기에 앞서 앞서 앞서 앞서 우리는 지난시간까지 데이터베이스의 기초적인 이론과 그에 바탕하는 간단한 기능들을 배웠다. 이번 시간에는 그런 배경을 바탕으로 하여 좀 더 어려운 SQL 구문을 접해보도록 하겠다. 우리가 실습할 환경은 PostgreSQL 6.5.2 이다. 이는 공개된 데이터베이스중에서 가장 많은 기능을 제공하고 있다. 기본적으로 SQL 문의 표준이라고 할 수 있는 SQL92 를 충실히 따르려고 노력하고 있으며, 그외에도 성능 향상을 위한 자체 제정한 SQL 구문도 제공하고 있다. 대부분의 기능이 제공되고 있지만 가장 문제가 되는 부분은 Foreign Key 의 지원을 하지 못하고 있다는 점이다. 이는 트리거와 내부함수를 이용하여 해결할 수 있기도 하지만 7.0 버전에서는 자체적으로 Foreign Key 를 지원한다고 하니 기다려 보도록 하자. (현재시점에는 7.0 버전이 출시되어 있다.) Chapter 2. P Chapter 2. P Chapter 2. P Chapter 2. PostgreSQL ostgreSQL ostgreSQL ostgreSQL 의 시작 시작 시작 시작 실습을 위해 리눅스서버에 접속한 psql 이라는 커맨드를 넣으면 앞으로 자주 보게 PostgreSQL 의 시작화면이 나타나게 된다. 그림 그림 그림 그림 2 2 2 2-1. PostgreSQL 1. PostgreSQL 1. PostgreSQL 1. PostgreSQL 의 실행화면 실행화면 실행화면 실행화면 psql 은 postgreSQL 의 사용을 위한 클라이언트 프로그램이다. 위에서도 나오듯이 interactive sql monitor 이며 이는 실제적으로 SQL 서버인 postmaster 에 접속하는 것을 의미한다. psql 실행할때는 옵션으로 다른 데이터베이스로의 접근을 지정할 수 있는데 특별히 지정하지 않는다면

Upload: others

Post on 24-Apr-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

예제를예제를예제를예제를 통한통한통한통한 PostgreSQL PostgreSQL PostgreSQL PostgreSQL 에서의에서의에서의에서의 간단한간단한간단한간단한 SQL SQL SQL SQL 문법의문법의문법의문법의 이해이해이해이해: PostgreSQL : PostgreSQL : PostgreSQL : PostgreSQL 입문입문입문입문

Chapter 1. Chapter 1. Chapter 1. Chapter 1. 들어가기에들어가기에들어가기에들어가기에 앞서앞서앞서앞서

우리는 지난시간까지 데이터베이스의 기초적인 이론과 그에 바탕하는 간단한 기능들을 배웠다. 이번

시간에는 그런 배경을 바탕으로 하여 좀 더 어려운 SQL 구문을 접해보도록 하겠다.

우리가 실습할 환경은 PostgreSQL 6.5.2 이다. 이는 공개된 데이터베이스중에서 가장 많은 기능을

제공하고 있다. 기본적으로 SQL 문의 표준이라고 할 수 있는 SQL92 를 충실히 따르려고 노력하고

있으며, 그외에도 성능 향상을 위한 자체 제정한 SQL 구문도 제공하고 있다. 대부분의 기능이

제공되고 있지만 가장 문제가 되는 부분은 Foreign Key 의 지원을 하지 못하고 있다는 점이다. 이는

트리거와 내부함수를 이용하여 해결할 수 있기도 하지만 7.0 버전에서는 자체적으로 Foreign Key 를

지원한다고 하니 기다려 보도록 하자. (현재시점에는 7.0 버전이 출시되어 있다.)

Chapter 2. PChapter 2. PChapter 2. PChapter 2. PostgreSQLostgreSQLostgreSQLostgreSQL 의의의의 시작시작시작시작

실습을 위해 리눅스서버에 접속한 후 psql 이라는 커맨드를 넣으면 앞으로 자주 보게 될

PostgreSQL 의 시작화면이 나타나게 된다.

그림그림그림그림 2 2 2 2----1. PostgreSQL1. PostgreSQL1. PostgreSQL1. PostgreSQL 의의의의 실행화면실행화면실행화면실행화면

psql 은 postgreSQL 의 사용을 위한 클라이언트 프로그램이다. 위에서도 나오듯이 interactive sql

monitor 이며 이는 실제적으로 SQL 서버인 postmaster 에 접속하는 것을 의미한다. psql 을

실행할때는 옵션으로 다른 데이터베이스로의 접근을 지정할 수 있는데 특별히 지정하지 않는다면

Page 2: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

자신의 유닉스 계정과 동일한 이름의 데이터베이스에 접속하게 된다. 현재 위의 화면에서 나는

spbear 라는 계정으로 로긴하였으므로 psql 을 수행하면 spbear 라는 이름의 데이터베이스에 접속하게

된다.

PostgreSQLPostgreSQLPostgreSQLPostgreSQL 의의의의 프롬프트프롬프트프롬프트프롬프트

spbear=> 라고 나타나는 것은 spbear 라는 데이터베이스에 성공적으로 접속했음을 의미하며 쿼리를

받아서 수행할 준비가 되었다는 것을 나타낸다. SQL 구문은 한 줄에 모두 쓰지 않고 여러줄에 나눠

쓸 수 있으며 여러 줄에 나누어서 쓸 때는 =>로 나타나던 프롬프트가 변하게 된다. 가령, 첫 줄에

create table 이라고 넣고, 엔터를 치게 되면 ->로 바뀌게 된다. 이는 현재 여러줄로 나누어서

SQL 문이 입력되고 있음을 의미하며 마지막 ; (세미콜론)이 나타날 때 까지 입력을 계속 받게 된다.

그림그림그림그림 2 2 2 2----2. 2. 2. 2. 입력을입력을입력을입력을 받는받는받는받는 화면화면화면화면

그외에 '나 "를 입력 받을 때는 서로 대칭이 되기 전까지 프롬프트가 변해 있게 된다. 예를 들어 '가

나왔다면 다음 '가 나타날때까지 프롬프트는 '>의 형태로 남아 있게 된다. 이는 엔터가 들어간

스트링도 엔터를 포함하여 모두 스트링에 들어감을 의미한다. 이렇게 들어간 스트링을 이후

SELECT 를 해올 때도 엔터문자까지 모두 SELECT 가 되어진다.

그림그림그림그림 2 2 2 2----3. '3. '3. '3. '를를를를 입력했을때입력했을때입력했을때입력했을때 프롬프트의프롬프트의프롬프트의프롬프트의 변화변화변화변화

Page 3: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

PostgreSQLPostgreSQLPostgreSQLPostgreSQL 의의의의 커맨드커맨드커맨드커맨드

PostgreSQL 에서는 SQL 구문외에도 여러가지 상태를 볼 수 있는 커맨드를 제공하고 있다. 커맨드를

알고 싶으면 \?를 입력하면 다음과 같이 자세한 설명을 볼 수 있다.

그림그림그림그림 2 2 2 2----4. 4. 4. 4. \\\\????를를를를 입력하여입력하여입력하여입력하여 알아보는알아보는알아보는알아보는 커맨드들커맨드들커맨드들커맨드들

PostgreSQLPostgreSQLPostgreSQLPostgreSQL 의의의의 커맨드커맨드커맨드커맨드

PostgreSQL 에서는 SQL 구문외에도 여러가지 상태를 볼 수 있는 커맨드를 제공하고 있다. 커맨드를

알고 싶으면 \?를 입력하면 다음과 같이 자세한 설명을 볼 수 있다.

그림그림그림그림 2 2 2 2----4. 4. 4. 4. \\\\????를를를를 입력하여입력하여입력하여입력하여 알아보는알아보는알아보는알아보는 커맨드들커맨드들커맨드들커맨드들

Page 4: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

꽤나 많은 커맨드들이 나옴을 알 수 있다. 이것을 모두 쓸 수는 없겠지만 그 중에서도 많이 쓰이는

커맨드 몇가지를 정리해 보도록 하겠다.

Table 2Table 2Table 2Table 2----1. PostgreSQL1. PostgreSQL1. PostgreSQL1. PostgreSQL 에서에서에서에서 쓰이는쓰이는쓰이는쓰이는 커맨드중커맨드중커맨드중커맨드중 필요한필요한필요한필요한 것만것만것만것만 요약요약요약요약

\\\\qqqq postgresql monitorpostgresql monitorpostgresql monitorpostgresql monitor 를를를를 빠져빠져빠져빠져 나간다나간다나간다나간다. . . . 종료할종료할종료할종료할 때때때때 쓰이는쓰이는쓰이는쓰이는 커맨드커맨드커맨드커맨드

\d 데이터베이스내의 어떠한 테이블, 인덱스들이 존재하는지 표시해 준다. 테이블 구조를

보고 싶다면 \d 뒤에 테이블 명을 주면 테이블 구조가 나타난다.

\dt 데이터베이스내의 테이블의 리스트만 표시해 준다.

\e vi 에디터상에서 현재 버퍼의 내용을 편집한다. vi 에디터를 종료했을 경우 편집하고 있던

SQL 구문을 수행해 준다.

\h

<명령어>

\h 뒤에 자신이 알고 싶은 SQL 구문을 넣으면 SQL 구문에 대한 간략한 설명이

나타난다.

여기까지 대강의 postgresql monitor 의 사용법을 알아보았다. 이제 PostgreSQL 에 SQL 질의를

입력하여 데이터베이스를 구축하고 데이터를 조작하고 데이터를 가져오는 것에 대해서 배워 보도록

하겠다.

그림그림그림그림 2 2 2 2----5. 5. 5. 5. \\\\qqqq 를를를를 입력하여입력하여입력하여입력하여 PostgreSQL PostgreSQL PostgreSQL PostgreSQL 의의의의 종료종료종료종료

Page 5: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

꽤나 많은 커맨드들이 나옴을 알 수 있다. 이것을 모두 쓸 수는 없겠지만 그 중에서도 많이 쓰이는

커맨드 몇가지를 정리해 보도록 하겠다.

Table 2Table 2Table 2Table 2----1. PostgreSQL1. PostgreSQL1. PostgreSQL1. PostgreSQL 에서에서에서에서 쓰이는쓰이는쓰이는쓰이는 커맨드중커맨드중커맨드중커맨드중 필요한필요한필요한필요한 것만것만것만것만 요약요약요약요약

\\\\qqqq postgresql monipostgresql monipostgresql monipostgresql monitortortortor 를를를를 빠져빠져빠져빠져 나간다나간다나간다나간다. . . . 종료할종료할종료할종료할 때때때때 쓰이는쓰이는쓰이는쓰이는 커맨드커맨드커맨드커맨드

\d 데이터베이스내의 어떠한 테이블, 인덱스들이 존재하는지 표시해 준다. 테이블 구조를

보고 싶다면 \d 뒤에 테이블 명을 주면 테이블 구조가 나타난다.

\dt 데이터베이스내의 테이블의 리스트만 표시해 준다.

\e vi 에디터상에서 현재 버퍼의 내용을 편집한다. vi 에디터를 종료했을 경우 편집하고 있던

SQL 구문을 수행해 준다.

\h

<명령어>

\h 뒤에 자신이 알고 싶은 SQL 구문을 넣으면 SQL 구문에 대한 간략한 설명이

나타난다.

여기까지 대강의 postgresql monitor 의 사용법을 알아보았다. 이제 PostgreSQL 에 SQL 질의를

입력하여 데이터베이스를 구축하고 데이터를 조작하고 데이터를 가져오는 것에 대해서 배워 보도록

하겠다.

그림그림그림그림 2 2 2 2----5. 5. 5. 5. \\\\qqqq 를를를를 입력하여입력하여입력하여입력하여 PostgreSQL PostgreSQL PostgreSQL PostgreSQL 의의의의 종료종료종료종료

Page 6: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

Chapter 3. SQLChapter 3. SQLChapter 3. SQLChapter 3. SQL 문문문문 접하기접하기접하기접하기

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

Table 3Table 3Table 3Table 3----1. SQL1. SQL1. SQL1. SQL 의의의의 종류종류종류종류

데이터베이스데이터베이스데이터베이스데이터베이스 구축구축구축구축 데이터데이터데이터데이터 구축구축구축구축 사용자사용자사용자사용자 쿼리쿼리쿼리쿼리

CREATE, ALTER, DROP INSERT, UPDATE, DELETE SELECT

위의 표에서 보는 바와 같이 우선 데이터베이스를 구축하는데 쓰이는 명령어, 데이터 구축시 쓰이는

명령어, 사용자 쿼리시 쓰이는 명령어 각각 3 개, 3 개, 1 개 하여 모두 일곱 종류의 명령어를 알면

왠만한 SQL 쿼리는 모두 다룰 수 있다. 그렇다면 각각의 SQL 문에 대해 자세히 살펴 보도록 하자.

CREATECREATECREATECREATE

CREATE 는 데이터베이스 내에 틀을 만들 때 사용되는 명령어로써 CREATE 뒤에 TABLE, VIEW,

DATABASE, FUNCTION, INDEX, TRIGGER 등이 따라 올 수 있으며 각각의 뒤에 붙는 명령어에 따라

테이블을 만들기도 하고, 뷰를 만들기도 하며, 함수를 만들기도 하며, 인덱스를 만들기도 한다.

우리가 알아 볼 것은 우선 테이블을 생성하는 것을 알아보도록 하겠다.

CREATE [ TEMPORARY | TEMP ] TABLE table (

column type

Page 7: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

[ 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 3 3 3----1. 1. 1. 1. 기본적인기본적인기본적인기본적인 CREATE TABLE CREATE TABLE CREATE TABLE 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

);

Page 8: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

student 라는 테이블을 만들기 위해 위와 같은 명령어를 입력하게 되면 테이블이 생성되게 된다.

생성된 테이블은 \d 를 입력하여 확인할 수 있다.

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

위에서도 언급했듯이 테이블의 구조를 살펴보려면 \d 뒤에 테이블명을 넣어주면 그 테이블의

구조까지 나타나게 된다.

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

Page 9: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

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

하겠다.

예제예제예제예제 3 3 3 3----2. 2. 2. 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 3 3----3. student2 3. student2 3. student2 3. student2 테이블을테이블을테이블을테이블을 만들자만들자만들자만들자....

Page 10: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

이번에는 방금 만들었던 테이블에서 약간 변형된 형태의 테이블인 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 3 3----3. 3. 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 3 3 3----4. student 4. student 4. student 4. student 테이블에테이블에테이블에테이블에 데이터를데이터를데이터를데이터를 입력하자입력하자입력하자입력하자....

Page 11: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

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

4 개의 쿼리가 모두 같은 사람인데도 불구하고 모두 들어갔다. 심지어는 학번을 입력하지 않은

사람인데도 모두 들어간다. 이렇게 각각의 레코드를 구분할 수 있는 컬럼이 존재하지 않게 된다면

이후 하나의 레코드만 수정하는 것이 불가능하게 된다. 이래서 생기게 된 것이 바로 Primary Key 의

개념이다. PK 는 각 레코드간의 구분을 지을 수 있는 역할을 하게 되는 것이다.

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

예제예제예제예제 3 3 3 3----4. 4. 4. 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 3 3 3----5. student2 5. student2 5. student2 5. student2 테이블에테이블에테이블에테이블에 데이터를데이터를데이터를데이터를 입력하자입력하자입력하자입력하자....

Page 12: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

위의 결과는 다음과 같다.

첫번째 쿼리는 에러가 나고 있다. std_addr 컬럼에 값을 넣지 않아 NULL 이 들어갔기 때문에 에러가

나게 된 것이다. 두번째 테이블은 std_sex 컬럼을 제외한 모든 필드의 값을 넣어 주었더니 정상적으로

입력이 되었다. 이렇게 넣지 않은 std_sex 컬럼에는 기본값으로 지정하였던 'M'값이 들어가게 된다.

세번째 쿼리도 성공적으로 수행하였다. 네번째 컬럼의 경우 std_sex 에 'G'값을 넣으려고 하자 에러가

발생하였다. 우리가 처음에 지정하였던 'M'과 'F'의 값을 벗어 나기 때문이다.

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

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

Page 13: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

student 테이블에는 같은 사람이 4 개의 레코드에 걸쳐서 입력이 되어 있고, student2 테이블에서는

쿼리를 제대로 수행한 두 사람만이 입력되어 있음을 알 수 있다.

지금까지 CREATE TABLE 에 대해서 살펴보았다. 그외에도 많은 CREATE 시킬 수 있는 것들이

존재하지만 여기에서는 다루지 않겠다. 이후 CREATE VIEW 만 조금 더 살펴보도록 하겠다.

ALTERALTERALTERALTER

ALTER 는 데이터베이스 구조를 바꾸는데 사용된다. PostgreSQL 에서 지원하는 ALTER 는 ALTER

TABLE 과 ALTER USER 가 있다. 이곳에서는 ALTER TABLE 만 간단히 살펴보도록 하겠다.

ALTER TABLE table

[ * ] ADD [ COLUMN ] column type

ALTER TABLE table

[ * ] RENAME [ COLUMN ] column TO newcolumn

ALTER TABLE table

RENAME TO newtable

ALTER 테이블로 할 수 있는 것은 3 가지가 있다. 컬럼 추가하기, 컬럼이름 바꾸기, 테이블이름

바꾸기이다. 이외에 컬럼 삭제하기는 지원하지 않는다. (이 경우 새로운 테이블을 만든 후

SQL 조작으로 데이터를 옮기는 것으로는 가능하다.)

Page 14: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

역시 백견이 불여일타! 예제를 보도록 하자.

예제예제예제예제 3 3 3 3----5. 5. 5. 5. 컬럼컬럼컬럼컬럼 추가하기추가하기추가하기추가하기 예제예제예제예제

ALTER TABLE student ADD COLUMN std_sex CHAR(1);

그림그림그림그림 3 3 3 3----7. student 7. student 7. student 7. student 테이블에테이블에테이블에테이블에 std_sex std_sex std_sex std_sex 라는라는라는라는 필드를필드를필드를필드를 추가한다추가한다추가한다추가한다....

위에서 보듯이 추가가 됨을 알 수 있다. 하지만 이렇게 추가된 컬럼은 테이블 구조상 제일 아래

위치하므로 그점을 주의하도록 하자. 그리고 ALTER TABLE 로 컬럼을 추가할 경우 DEFAULT 나 NOT

NULL 등이 적용되지 않으므로 이 점 주의하자. (기존의 값들은 모두 NULL 로 들어간다.)

예제예제예제예제 3 3 3 3----6. 6. 6. 6. 컬럼이름컬럼이름컬럼이름컬럼이름 바꾸기바꾸기바꾸기바꾸기 예제예제예제예제

ALTER TABLE student RENAME std_sex TO std_sex2;

그림그림그림그림 3 3 3 3----8. std_sex8. std_sex8. std_sex8. std_sex 필드의필드의필드의필드의 이름을이름을이름을이름을 std_sex2 std_sex2 std_sex2 std_sex2 로로로로 바꾸었다바꾸었다바꾸었다바꾸었다....

Page 15: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

간단하게 컬럼 이름이 바뀌었다. 다시 원상복귀 하자.

예제예제예제예제 3 3 3 3----7. 7. 7. 7. 필드명필드명필드명필드명 바꾸기바꾸기바꾸기바꾸기 예제예제예제예제

ALTER TABLE student RENAME std_sex2 TO std_sex;

예제예제예제예제 3 3 3 3----8. 8. 8. 8. 테이블명바꾸기테이블명바꾸기테이블명바꾸기테이블명바꾸기 예제예제예제예제

ALTER TABLE student2 RENAME TO student_new;

그림그림그림그림 3 3 3 3----9. student2 9. student2 9. student2 9. student2 테이블의테이블의테이블의테이블의 이름을이름을이름을이름을 student_new student_new student_new student_new 로로로로 바꾸었다바꾸었다바꾸었다바꾸었다....

Page 16: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

테이블명이 바뀌었음을 알 수 있다. 단, INDEX 명은 바꾸지 않는다.

DROPDROPDROPDROP

DROP 은 데이터베이스에서 테이블등을 날려버릴 때 사용하는 SQL 구문이다. 테이블 외에도

CREATE 시 만들었던 VIEW, TABLE, INDEX, FUNCTION 등도 날려버릴 수 있다.

DROP TABLE name [, ...]

간단한 예제를 보면 쉽게 알 수 있다.

예제예제예제예제 3 3 3 3----9. 9. 9. 9. 테이블테이블테이블테이블 날리기날리기날리기날리기 예제예제예제예제

DROP TABLE student;

그림그림그림그림 3 3 3 3----10. student 10. student 10. student 10. student 테이블을테이블을테이블을테이블을 날려버렸다날려버렸다날려버렸다날려버렸다....

Page 17: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

테이블을 드롭할경우는 주의하여야 한다. 그 안에 존재하는 데이터까지 모두 날아가게 되므로

데이터가 필요없을 경우에 드롭을 하도록 한다.

여기까지 CREATE, ALTER, DROP 에 대해서 알아보았다. 이제는 만들어진 틀에 어떤 방법으로

데이터를 입력, 수정, 삭제할지에 대해 알아보겠다.

INSERTINSERTINSERTINSERT

INSERT 는 테이블내에 레코드를 입력할 때 사용한다.

INSERT INTO table [ ( column [, ...] ) ]

{ VALUES ( expression [, ...] ) | SELECT query }

앞서도 INSERT 문은 사용했으므로 기본적인 사용방법은 낯설지는 않으리라 생각된다. 하지만 여기서

짚고 넘어가고, 또 좀 더 심화된 쿼리를 연습해 보도록 하겠다. 모두 예제를 통해서 살펴보자.

예제예제예제예제 3 3 3 3----10. 10. 10. 10. 기본적인기본적인기본적인기본적인 I I I INSERTNSERTNSERTNSERT 문문문문 예제예제예제예제

INSERT INTO student_new (std_id, std_sex, std_name, std_addr, std_tel, std_handphone,

std_birthday)

VALUES ('9744290', 'F', '진혜영', '서울시가 다 내꺼', '02-XXX-XXXX', '011-XXXX-XXXX', '1979-

05-14');

Page 18: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

그림그림그림그림 3 3 3 3----11. INSERT11. INSERT11. INSERT11. INSERT 를를를를 이용해서이용해서이용해서이용해서 데이터를데이터를데이터를데이터를 입력해보자입력해보자입력해보자입력해보자....

이전에 만들었던 student_new 라는 테이블에 데이터를 입력하는 쿼리이다. INSERT INTO 뒤에 테이블

명이 따라 오며 뒤에 괄호로 구분하고 입력할 컬럼명을 일일히 기술한 뒤에 괄호 닫고 VALUES 라는

키워드 따라오고 다시 괄호 열고 값들을 순차적으로 기술하고 난 후에 마지막으로 괄호 닫는 것으로

마감하고 있다.

이러한 구조는 앞에 컬럼을 일일히 기술해주지 않아도 테이블의 구조에 따라 들어가게 할 수 도 있다.

예를 들어 다음을 보도록 하자.

예제예제예제예제 3 3 3 3----11. 11. 11. 11. 조금조금조금조금 다른다른다른다른 INSERT INSERT INSERT INSERT 문문문문 예제예제예제예제

INSERT INTO student_new VALUES ('9944000', 'M', '쏘가리', '노숙', '없어', '없어', '1979-01-

01');

그림그림그림그림 3 3 3 3----12. INSERT12. INSERT12. INSERT12. INSERT 를를를를 이용해서이용해서이용해서이용해서 데이터를데이터를데이터를데이터를 입입입입력해보자력해보자력해보자력해보자....

Page 19: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

위와 같이 컬럼명을 기술 하지 않으면 테이블의 구조에 따라 차곡차곡 순서대로 필드가 대응되어서

들어가게 된다.

그렇다면 응용하는 방법으로 넣어야 하는 필드만 따로 콕 집어서 넣을 수 도 있겠다. 다음과 같이

해보자.

예제예제예제예제 3333----12. 12. 12. 12. 원하는원하는원하는원하는 필드에만필드에만필드에만필드에만 데이터를데이터를데이터를데이터를 입력하는입력하는입력하는입력하는 예제예제예제예제

INSERT INTO student_new (std_id,std_name, std_addr, std_birthday)

VALUES ('9644021', '누구지', '서울시 동작구 상도동', date(now()));

그림그림그림그림 3 3 3 3----13. INSERT13. INSERT13. INSERT13. INSERT 를를를를 이용해서이용해서이용해서이용해서 데이터를데이터를데이터를데이터를 입력해보자입력해보자입력해보자입력해보자....

Page 20: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

잘~ 들어갔다. 위의 테이블 구조에서 NOT NULL 인 항목만 콕 집어서 입력을 한 것이다. 나머지

컬럼은 default 값을 설정했다면 default 값이 들어갔을 테고, default 값을 설정하지 않은 컬럼은

NULL 이 들어가게 된다.

위의 예제에서 처음보는 것이 등장했을 것이다. 바로 date(now()) 인데, 이것은 SQL 에서 지원하는

함수이다. \df 하면 SQL 에서 지원하는 함수가 주욱 나타나게 되는데 그중에서 하나로써 now()는

현재 시간을 반환해주며 date()는 date 형으로 형변환(type cast)를 해주는 것이다. 여기서는 적절한

예제가 될 수 없지만 (생일이 현재 시간이 되는 경우는 드물다.) 매번 입력할 때 현재 시간을 넣어야

한다면 위와 같이 입력을 해주면 되겠다. 아니면 아예 DEFAULT 로 위의 함수를 호출하도록 만들

수도 있겠다.

예제예제예제예제 3 3 3 3----13. INSERT13. INSERT13. INSERT13. INSERT 와와와와 SELECT SELECT SELECT SELECT 의의의의 조합을조합을조합을조합을 위한위한위한위한 데이터데이터데이터데이터 입력입력입력입력 예제예제예제예제

우선 실습에 사용될 테이블 생성을 위해 다음의 쿼리를 주자.

create table a (c1 int, c2 varchar(10));

create table b (num int, description varchar(30), category varchar(10));

insert into b values (1, '메롱', '놀림');

insert into b values (2, 'C8', '욕');

insert into b values (3, '비행기', '명사');

insert into b values (4, '돼지', '동물');

insert into b values (5, '피자', '먹을것');

Page 21: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

그림그림그림그림 3 3 3 3----14. 14. 14. 14. 실습을실습을실습을실습을 위한위한위한위한 데이터를데이터를데이터를데이터를 입력하자입력하자입력하자입력하자....

열심히 쿼리를 넣어서 b 테이블에 값들을 집어 넣었다. 그러면 b 에 넣은 값들을 a 테이블에 넣을 수

없을까? 그 해답 바로 INSERT 와 SELECT 를 같이 쓰는 것이다. 다음과 같은 쿼리를 넣어보도록 하자.

예제예제예제예제 3 3 3 3----14. INSERT14. INSERT14. INSERT14. INSERT 와와와와 SELECT SELECT SELECT SELECT 의의의의 조합조합조합조합 예제예제예제예제

INSERT INTO a SELECT num, description FROM b;

그림그림그림그림 3 3 3 3----15. INSERT15. INSERT15. INSERT15. INSERT 와와와와 SELECT SELECT SELECT SELECT 의의의의 조합조합조합조합....

Page 22: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

위에서 보이는 것과 같이 b 테이블에 있던 값들이 a 테이블에 무사히 넘어갔다. 다음과 같은 쿼리를

다시 한번 줘 보도록 하자.

예제예제예제예제 3 3 3 3----15. INSERT15. INSERT15. INSERT15. INSERT 와와와와 SELECT SELECT SELECT SELECT 의의의의 조합조합조합조합 예제예제예제예제 변형변형변형변형

INSERT INTO a (c1, c2) SELECT num+5, category FROM b;

그림그림그림그림 3 3 3 3----16. INSERT16. INSERT16. INSERT16. INSERT 와와와와 SELECT SELECT SELECT SELECT 의의의의 조합조합조합조합 변형변형변형변형....

Page 23: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

이번에는 b 테이블에 있던 category 컬럼이 a 테이블에 들어갔다. 단, num 를 가져왔을 때 5 씩을

더해서 a 테이블에서는 중복이 일어나지 않게 했다.

UPDATEUPDATEUPDATEUPDATE

UPDATE 는 입력되어 있는 테이블내의 레코드를 수정할 때 사용한다.

UPDATE table SET column = expression [, ...]

[ FROM fromlist ]

[ WHERE condition ]

UPDATE 는 WHERE 절과 연계하여 사용한다. WHERE 절은 UPDATE 뿐만이 아니라 DELETE 와

SELECT 에서도 쓰이니 여기서 자세히 짚고 넘어가도록 하겠다.

WHERE 절에 condition 이라고 오는 부분은 =, <, <=, >, >=, <>와 같은 오퍼레이터나 ALL, ANY, IN,

LIKE 와 같은 오퍼레이터, AND, OR, NOT 과 같은 논리 오퍼레이터를 이용하여 수식(expression)을

기술하고 있다. 이러한 수식은 참과 거짓을 따지게 되며 수식의 결과가 참인 레코드에만 영향을

미치게 된다. 그러면 예제를 보도록 하겠다.

예제예제예제예제 3 3 3 3----16. UPDATE 16. UPDATE 16. UPDATE 16. UPDATE 예제예제예제예제

UPDATE a SET c2='빈대떡' WHERE c2='피자';

Page 24: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

그림그림그림그림 3333----17. UPDATE17. UPDATE17. UPDATE17. UPDATE 를를를를 해보자해보자해보자해보자....

c2 컬럼에서 값이 '피자'인 레코드를 찾아서 그 값을 '빈대떡'으로 바꾸는 쿼리였다. 수행후의 결과는

다음과 같다.

위에서 보는 바와 같이 UPDATE 를 하게 되면 가장 마지막행에 들어가게 된다. 이번에는 하나의

레코드만이 아니라 여러 레코드를 변경시켜보도록 하자.

예제예제예제예제 3 3 3 3----17. 17. 17. 17. 여러여러여러여러 레코드의레코드의레코드의레코드의 변경변경변경변경 예제예제예제예제

UPDATE a SET c1=c1+1;

그림그림그림그림 3 3 3 3----18. UPDATE18. UPDATE18. UPDATE18. UPDATE 를를를를 해보자해보자해보자해보자....

Page 25: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

WHERE 절을 주지 않으면 모든 레코드에 적용이 된다. 위의 쿼리는 모든 레코드에서 c1 을 1 씩

더하도록 한 쿼리이다.

이번에는 WHERE 절을 좀 더 응용하여 보자.

예제예제예제예제 3 3 3 3----18. WHERE18. WHERE18. WHERE18. WHERE 절의절의절의절의 응용통한응용통한응용통한응용통한 변경변경변경변경

UPDATE a SET c1=c1+10, c2='바보' WHERE c1>9;

그림그림그림그림 3 3 3 3----19. UPDATE19. UPDATE19. UPDATE19. UPDATE 를를를를 해보자해보자해보자해보자....

Page 26: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

이번에는 c1 이 9 보다 큰 레코드를 찾아서 각 레코드의 c1 컬럼에 10 씩 더해주고 c2 의 값을

'바보'로 수정하였다. 위에서 보듯이 수정하고자 하는 컬럼이 여러 개이라면 각 컬럼값 사이를 ,

(콜론)으로 구분지어 놓는다. 여기서는 2 개의 컬럼을 수정하고 있다.

이번에는 WHERE 절에 여러가지 조건을 혼합하여 넣어보도록 하겠다.

예제예제예제예제 3 3 3 3----19. 19. 19. 19. 조건의조건의조건의조건의 혼합혼합혼합혼합

UPDATE a SET c1=c1+20, c2='쓰레기' WHERE c2 LIKE '명%' OR c1<3;

그림그림그림그림 3 3 3 3----20. UPDATE20. UPDATE20. UPDATE20. UPDATE 를를를를 해보자해보자해보자해보자....

Page 27: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

위의 쿼리는 c2 필드가 명자로 시작하는 레코드나 c1 의 값이 3 보다 작은 값을 가지는 레코드를

찾아서 c1 에 20 씩 더해주고 c2 를 '쓰레기'라는 값으로 수정하라는 쿼리이다. 이와 같이 각각의

조건들은 논리 연산을 통해서 서로 조합이 가능하다.

DELETEDELETEDELETEDELETE

테이블에서부터 특정 레코드를 삭제할 때 사용한다.

DELETE FROM table [ WHERE condition ]

말 그대로 레코드를 삭제할 때 사용한다. WHERE 절의 사용은 위의 UPDATE 항목에서 조목조목

살펴보았으므로 생략하고 몇가지 예제를 통해서 살펴보고 넘어가도록 하겠다.

예제예제예제예제 3 3 3 3----20. 20. 20. 20. 간단한간단한간단한간단한 DELETE DELETE DELETE DELETE 예제예제예제예제

DELETE FROM a WHERE c1 = 20;

그림그림그림그림 3 3 3 3----21. 21. 21. 21. 레코드를레코드를레코드를레코드를 삭제해보자삭제해보자삭제해보자삭제해보자....

Page 28: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

특정 레코드 하나만 지우고 있다. 이와 같이 하나의 레코드만을 지우게 하고 싶다면 PK 를 기준으로

WHERE 조건을 걸어서 지우는 것이 좋다.

WHEREWHEREWHEREWHERE 조건을조건을조건을조건을 꼭꼭꼭꼭 주자주자주자주자....

WHERE 절을 사용하지 않으면 테이블내의 내용이 송두리째 날아가게 된다. 그것은 UPDATE 도

마찬가지이지만 UPDATE 의 경우 데이터의 일부만 유실될 수 있는데 반해서 DELETE 는 테이블내

모든 데이터가 날아갈 수 있으므로 사용할 때 항상 주의해야 한다.

그림그림그림그림 3 3 3 3----22. WHERE22. WHERE22. WHERE22. WHERE 절절절절 입력을입력을입력을입력을 하지하지하지하지 않으면않으면않으면않으면 데이터가데이터가데이터가데이터가 다다다다 날아간다날아간다날아간다날아간다....

Page 29: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

SELECTSELECTSELECTSELECT

지금까지 데이터를 구축했다면 그 데이터들을 어떻게 효율적으로 뽑아내느냐 하는 것은 SELECT 문을

어떻게 쓰느냐에 관건이 걸려 있다. SELECT 는 테이블뿐만이 아니라 VIEW 에서도 할 수 있다. 그 점

유념하고 VIEW 의 개념에 대해서는 조금 뒤에 다시 설명하도록 하겠다.

SELECT [ALL|DISTINCT [ON column] ]

expression [ AS name ] [, ...]

[ INTO [TEMP] [TABLE] new_table ]

[ FROM table

[alias ] [, ...] ]

[ WHERE condition ]

[ GROUP BY column [, ...] ]

[ HAVING condition [, ...] ]

[ { UNION [ALL] | INTERSECT | EXCEPT } select ]

[ ORDER BY column [ ASC | DESC ] [, ...] ]

[ FOR UPDATE [OF class_name...]]

[ LIMIT count [OFFSET|, count]]

역시 굉장히 복잡한 구조를 가지고 있다. 하나 하나 순서대로 설명하도록 하겠다.

Page 30: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

WHERE

SELECT 는 하나 또는 여러개의 테이블에서 레코드를 리턴하게 되며 이는 WHERE 절에서 정의한

조건을 만족하는 레코드만 가져오도록 되어 있으며 만약 WHERE 절을 생략했을 경우 모든 레코드를

다 가져오게 된다.

예제예제예제예제 3 3 3 3----21. SELECT... WHERE 21. SELECT... WHERE 21. SELECT... WHERE 21. SELECT... WHERE 예제예제예제예제

SELECT * FROM b;

SELECT * FROM b WHERE num > 3;

그림그림그림그림 3 3 3 3----23. SELECT... WHERE 23. SELECT... WHERE 23. SELECT... WHERE 23. SELECT... WHERE 실습실습실습실습....

Expression

expression 이 오는 자리는 SELECT 한 레코드의 컬럼 이름이 올 수 있으며, 수식등이 올 수 있다.

컬럼이 오는 곳에 SQL 구문에서 지원하는 함수등을 사용할 수도 있다. 대표적으로 쓰이는 함수는

max(), min(), sum(), avg(), count()등이 있다. 만약 모든 컬럼을 다 출력하고 싶을 경우는 *를

사용하면 된다. 그리고 셀렉션 된 컬럼의 이름을 변경하고 싶다면 AS 를 사용하면 변경 시킬 수 있다.

예제를 보도록 하자.

예제예제예제예제 3 3 3 3----22. Expression22. Expression22. Expression22. Expression 의의의의 여러여러여러여러 예제예제예제예제

Page 31: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

SELECT num FROM b;

SELECT 3+5;

SELECT 3+5 AS result;

그림그림그림그림 3 3 3 3----24. Expression 24. Expression 24. Expression 24. Expression 실습실습실습실습....

아래 결과에서 보면 알 수 있겠지만 3+5 한 결과는 ?column?이라는 이상한 이름의 컬럼으로

리턴되고 있다. 이러한 것을 막기 위해 AS 를 사용하여 컬럼명을 명확하게 해주는 것이다.

예제예제예제예제 3 3 3 3----23. 23. 23. 23. 또또또또 다른다른다른다른 예제예제예제예제

SELECT num AS id, num+50 FROM b;

SELECT count(num), sum(num), avg(num), max(num), min(num) FROM b;

그림그림그림그림 3 3 3 3----25. Expression 25. Expression 25. Expression 25. Expression 실습실습실습실습....

Page 32: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

DISTINCT

DISTINCT 는 SELECT 된 레코드중에서 중복되는 레코드를 제거해 준다. 반대로 ALL 은 중복에

관계없이 모든 레코드를 다 가져온다. DISTICT 나 ALL 을 사용하지 않으면 기본적으로 ALL 을

적용시킨다. DISTINCT ON 은 특정 컬럼에 대해서만 DISTINCT 를 적용하는 것이다. 예제를 보도록

하자.

우선 DISTINCT 예제를 적용시킬 수 있도록 다음의 쿼리를 주어 임의의 중복값을 만들자.

예제예제예제예제 3 3 3 3----24. DISTINCT24. DISTINCT24. DISTINCT24. DISTINCT 의의의의 예제를예제를예제를예제를 위한위한위한위한 중복값중복값중복값중복값 생성생성생성생성

INSERT INTO b VALUES(6, '피자', '먹을것');

INSERT INTO b VALUES(4, '돼지', '동물');

그림그림그림그림 3 3 3 3----26. 26. 26. 26. 실습을실습을실습을실습을 위한위한위한위한 임의중복임의중복임의중복임의중복 레코드레코드레코드레코드 만들기만들기만들기만들기....

Page 33: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

위와 같이 SELECT 를 그냥 사용하면 SELECT ALL 과 동일한 결과를 얻을 수 있기 때문에 모든

레코드를 출력한다. 이제 DISTINCT 를 적용해 보도록 하자.

예제예제예제예제 3 3 3 3----25. DISTINCT25. DISTINCT25. DISTINCT25. DISTINCT 를를를를 적적적적용한용한용한용한 SELECT SELECT SELECT SELECT 쿼리쿼리쿼리쿼리

SELECT DISTINCT * FROM b;

그림그림그림그림 3 3 3 3----27. DISTINCT27. DISTINCT27. DISTINCT27. DISTINCT 의의의의 실습실습실습실습....

Page 34: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

결과에서 볼 수 있듯이 이번에는 6 개의 레코드만이 출력되었다. 선택하는 모든 컬럼이 중복되는 (4,

돼지, 동물)의 항목이 하나만 선택된 것이다. 이번에는 DISTINCT ON 을 적용해 보도록 하자.

예제예제예제예제 3 3 3 3----26. 26. 26. 26. 하나의하나의하나의하나의 항목에만항목에만항목에만항목에만 DISTINCT DISTINCT DISTINCT DISTINCT 를를를를 적용시킨적용시킨적용시킨적용시킨 쿼리쿼리쿼리쿼리

SELECT DISTINCT ON description * FROM b;

그림그림그림그림 3 3 3 3----28. DISTINCT28. DISTINCT28. DISTINCT28. DISTINCT 의의의의 실습실습실습실습....

Page 35: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

이번에는 5 개의 레코드만이 선택되었음을 알 수 있다. 이번에는 description 이 중복되는 (6, 피자,

먹을것) 항목이 제거된 채로 선택된 것이다.

GROUP BY

GROUP BY 는 유저로 하여금 테이블에 그룹을 나누는 것이다. 예제를 통해 확인 하자. 이때 선택되는

항목은 반드시 GROUP 으로 묶은 컬럼이거나 그렇지 않은 컬럼의 경우는 aggregation 된 컬럼이어야

한다. 여기서 잠깐 aggregation 된 컬럼이란 무엇인가 짚고 넘어가자. 우리가 예전에 SELECT

sum(num) FROM b;와 같은 쿼리를 준 적이 있을 것이다. 결과는 b 라는 테이블에서 num 을 가져와서

모두 더한 결과값만이 출력될 것이다. 이와 같이 실제로는 여러개의 레코드이지만 그 레코드를

하나로 묶어놓은 컬럼을 aggregation 된 컬럼이라고 한다. 이것 역시 예제로 공부해 보자.

예제예제예제예제 3 3 3 3----27. GROUP BY27. GROUP BY27. GROUP BY27. GROUP BY 를를를를 이용한이용한이용한이용한 예제예제예제예제

SELECT * FROM b GROUP BY category;

SELECT num, category FROM b GROUP BY category;

SELECT category FROM b GROUP BY category;

SELECT count(*), sum(num), category FROM b GROUP BY category;

그림그림그림그림 3 3 3 3----29. GROUP BY29. GROUP BY29. GROUP BY29. GROUP BY 의의의의 실습실습실습실습....

Page 36: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

아래 결과를 보면 알 수 있지만 위의 두개의 문장은 에러를 출력한다. *나 num 는 aggregation 된

컬럼이 아니기 때문에 에러를 발생시키지만, 세번째 쿼리는 정상적으로 동작한다. 이 결과만 보면

DISTINCT 하는 것과 동일하겠지만 네번째 쿼리를 보면 어째서 DISTINCT 를 쓰지 않고 GROUP BY 를

쓰는지 이해할 수 있을 것이다. count(*)를 넣음으로써 GROUP 으로 선택된 레코드가 몇개인지 알 수

있고, GROUP 으로 묶여진 레코드간의 num 를 서로 더하는 것이 가능하다.

좀 더 색다른 예제를 위해 다음의 쿼리를 주고 비교해 보도록 하자.

예제예제예제예제 3 3 3 3----28. GROUP BY28. GROUP BY28. GROUP BY28. GROUP BY 의의의의 또또또또 다른다른다른다른 예제예제예제예제

INSERT INTO b VALUES (7, '소', '동물');

SELECT description, category FROM b GROUP BY category, description;

이번에는 두개의 컬럼을 서로 그룹을 지었기 때문에 두개의 컬럼이 서로 다른 경우에만 선택이 된다.

HAVING

HAVING 절은 GROUP BY 절에서의 WHERE 라고 생각하면 이해가 쉽다. 어떠한 그룹을 출력하게 될

것인지 정하게 되는데 이때 조건에 오는 표현식 역시 aggregation 양식으로 표현되어야 한다. 예제를

보도록 하자.

예제예제예제예제 3 3 3 3----29. HAVING29. HAVING29. HAVING29. HAVING 절의절의절의절의 예제쿼리예제쿼리예제쿼리예제쿼리

Page 37: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

SELECT description, category FROM b GROUP BY category, description;

SELECT description, category FROM b GROUP BY category, description HAVING count(*)=2;

위의 두개의 쿼리를 비교해 보도록 하자. 첫번째 쿼리는 그룹으로 묶은 모든 컬럼을 가져 오도록

하고 있고, 두번째 쿼리는 그룹내에 두개의 항목이 존재할때 출력하도록 하고 있다.

ORDER BY

ORDER BY 절은 선택되어진 결과값에서 특정컬럼을 기준으로 소팅을 하여서 출력하여 준다. ORDER

BY 는 뒤에 DESC 나 ASC 가 올 수 있는데 ASC 는 오름차순, DESC 는 내림차순으로 정렬을 하도록

하는 것이다. 아무것도 지정하지 않는다면 기본적으로 ASC 가 적용된다. 예제를 보도록 하자.

예제예제예제예제 3 3 3 3----30. ORDER BY30. ORDER BY30. ORDER BY30. ORDER BY 의의의의 예제예제예제예제

SELECT * FROM b ORDER BY num;

SELECT * FROM b ORDER BY num DESC;

첫번째 쿼리는 num 를 기준으로 오름차순으로 정렬해 주며, 두번째 쿼리는 num 컬럼을 기준으로

내림차순으로 정렬해 준다. 첫번째 쿼리는 SELECT * FROM b ORDER BY num ASC; 와 동일하다.

예제예제예제예제 3 3 3 3----31. ORDER BY31. ORDER BY31. ORDER BY31. ORDER BY 에서에서에서에서 여러개의여러개의여러개의여러개의 정렬기준정렬기준정렬기준정렬기준 항목항목항목항목 설정설정설정설정

SELECT * FROM b ORDER BY description, category DESC;

이와 같은 쿼리를 줄 수도 있는데, 위와 같은 쿼리는 일단 description 에 대해서 정렬을 한 후 만약

descirption 이 같은 레코드에 대해서는 category 컬럼을 기준으로 내림차순으로 정렬하라는 쿼리이다.

결과는 다음과 같다. (일부서버에서는 한글 인코딩 문제로 한글의 경우 소팅이 제대로 되지 않는

문제가 발생한다. PostgreSQL 을 업그레이드 하거나 패치를 해주어야 한다.)

UNION, INTERSECT, EXCEPT

UNION, INTERSECT, EXCEPT 는 합집합, 교집합, 차집합과 관련된 쿼리이다. 다음의 예제를 통해

알아보자.

예제예제예제예제 3 3 3 3----32. 32. 32. 32. 예제를예제를예제를예제를 위한위한위한위한 데이터데이터데이터데이터 작성작성작성작성

우선 예제 적용을 위해 기존에 만들었던 a 테이블에 데이터를 입력하자.

INSERT INTO a VALUES (3,'피자');

INSERT INTO a VALUES (4,'오징어볶음');

Page 38: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

INSERT INTO a VALUES (5,'보신탕');

INSERT INTO a VALUES (7,'소');

이런 후 각각 UNION, INTERSECT, EXCEPT 예를 보도록 하겠다.

우선 UNION 부터 살펴보자. UNION 은 두 테이블간의 서로 합집합을 만들어 주도록 되어 있다. 이때

두개의 SELECT 문장을 UNION 시킬때 두개의 SELECT 문장에서 선택하는 컬럼의 구조는 동일하여야

한다. 이는 UNION 만이 아니라 INTERSECT, EXCEPT 도 마찬가지이다.

예제예제예제예제 3 3 3 3----33. UNION33. UNION33. UNION33. UNION 의의의의 예제예제예제예제

SELECT num, description FROM b UNION SELECT c1, c2, FROM a;

위에서 보는 바와 같이 두개의 테이블이 서로 합집합이 되었다.

이번에는 INTERSECT 이다. INTERSECT 는 위에서 언급한대로 교집합의 관계이다.

예제예제예제예제 3 3 3 3----34. INTERSECT34. INTERSECT34. INTERSECT34. INTERSECT 의의의의 예제예제예제예제

SELECT num, description FROM b INTERSECT SELECT c1, c2 FROM a;

마지막으로 EXCEPT 는 차집합의 관계이다.

예제예제예제예제 3 3 3 3----35. EXCEPT35. EXCEPT35. EXCEPT35. EXCEPT 의의의의 예제예제예제예제

SELECT num, description FROM b EXCEPT SELECT c1, c2 FROM a;

이로써 간략하게 SELECT 문장에 대해서 살펴 보았다.

Chapter 4. JoinChapter 4. JoinChapter 4. JoinChapter 4. Join

이번에는 두개의 테이블을 조인(Join)하는 방법에 대해서 알아 보겠다. 실제 관계형 데이터베이스에서

제일 많이 쓰이는 기법이 바로 이 조인이다. 일단 조인 예제를 실습하기 위해 두개의 테이블을

만들고 그 값을 넣기위해 다음의 쿼리를 줘보도록 하자.

예제예제예제예제 4 4 4 4----1. 1. 1. 1. 예제를예제를예제를예제를 위한위한위한위한 테이블생성테이블생성테이블생성테이블생성 쿼리쿼리쿼리쿼리

CREATE TABLE product (

prod_num SERIAL PRIMARY KEY,

prod_name VARCHAR(20) NOT NULL,

Page 39: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

prod_cost INT

);

CREATE TABLE sale (

sale_num SERIAL PRIMARY KEY,

prod_num INT NOT NULL,

sale_amount INT NOT NULL,

sale_time DATETIME DEFAULT now()

);

위와 같이 설계를 했다고 하자.

여기서 못보던 SERIAL 이라는 타입이 나왔다. SERIAL 타입은 따로 지정하지 않으면 레코드를 입력할

때마다 1 씩 증가하여 넣어주는 타입이다.

각각의 테이블을 설명하면 product 는 제품을 관리하는 테이블로써 제품번호, 제품명, 제품단가를

각각 필드로 가지고 있다. sell 테이블은 판매번호, 제품번호, 판매수량, 판매시간을 각 필드로 가지고

있다. 이제 데이터를 입력해 보도록 하자.

예제예제예제예제 4 4 4 4----2. 2. 2. 2. 데이터데이터데이터데이터 입력을입력을입력을입력을 위한위한위한위한 쿼리쿼리쿼리쿼리

INSERT INTO product (prod_name, prod_cost) VALUES ('초코파이', '200');

INSERT INTO product (prod_name, prod_cost) VALUES ('신라면', '350');

INSERT INTO product (prod_name, prod_cost) VALUES ('진라면', '300');

INSERT INTO product (prod_name, prod_cost) VALUES ('초코바', '500');

INSERT INTO product (prod_name, prod_cost) VALUES ('핑클빵', '500');

INSERT INTO sale (prod_num, sale_amount, sale_time) VALUES(2, 3, '2000-04-12');

INSERT INTO sale (prod_num, sale_amount, sale_time) VALUES(1, 5, '2000-04-12');

INSERT INTO sale (prod_num, sale_amount, sale_time) VALUES(5, 2, '2000-04-12');

INSERT INTO sale (prod_num, sale_amount, sale_time) VALUES(2, 3, '2000-04-12');

INSERT INTO sale (prod_num, sale_amount, sale_time) VALUES(2, 3, '2000-04-12');

INSERT INTO sale (prod_num, sale_amount, sale_time) VALUES(1, 10, '2000-04-13');

INSERT INTO sale (prod_num, sale_amount, sale_time) VALUES(2, 2, '2000-04-13');

INSERT INTO sale (prod_num, sale_amount, sale_time) VALUES(4, 3, '2000-04-13');

이제 위와 같이 구성한 데이터베이스에서 다음과 같은 쿼리를 주어보도록 하자.

예제예제예제예제 4 4 4 4----3. 3. 3. 3. 조인조인조인조인(join)(join)(join)(join)을을을을 위한위한위한위한 쿼리쿼리쿼리쿼리 예제예제예제예제

Page 40: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

SELECT sale.sale_num, product.prod_name, product.prod_cost, sale.sale_amount,

product.prod_cost * sale.sale_amount AS sale_cost, date(sale.sale_time) AS sale_date FROM

product, sale WHERE product.prod_num = sale.prod_num ORDER BY sale.sale_num;

위의 쿼리는 product 테이블과 sale 테이블 두개의 테이블간의 관계를 따져서 서로 조인한 결과이다.

product 테이블에서 제품명과 제품가격을 가져오고 sale 테이블에서 판매수량과 판매날짜를 가져와서

서로 곱한 결과를 나타낸 것이다. sale 테이블에서 각 레코드는 판매한 제품의 제품번호를 가지고

있기 때문에 그 제품번호만 참조하면 제품명과 제품가격을 알 수 있다. 이러한 키를 원래 FOREIGN

KEY 라고 한다. 이것을 테이블에 Primary key 처럼 제약조건으로 걸어줄 수도 있지만 PorstgreSQL

6.X 버젼대에서는 FK 를 지원하지 않는다. (트리거로 이것이 구현가능하기는 하다.) 다만 위와 같이

관계를 표현함으로써 서로 조인은 할 수 있다.

위와 같이 테이블을 서로 조인하지 않고 하나의 테이블로 설계할 수도 있다. 제품가격, 제품명,

판매수량, 판매일자등을 하나의 테이블로 구성할 수도 있지만 그렇게 테이블을 구성했을 경우

제품명과 제품가격의 경우 데이터의 중복이 각 레코드에서 일어나게 된다. 이는 낭비이며 데이터를

효율적으로 관리하기 힘들어진다. 그래서 테이블을 분리한 후 필요할때만 서로 조인하게 되는 것이다.

데이터베이스 모델링이론에서 반복되는 속성은 따로 테이블로 빼는 것이 정규화의 방법중에 하나이다.

하지만 매번 위와 같은 결과를 출력하기 위해서 저 기나긴 조인 문장을 타이핑하는 것은 일종의

낭비이다. 그래서 만든 것이 바로 VIEW 라는 것이다. 다음과 같은 쿼리를 줘보도록 하자. 아까의

쿼리에 앞부분에 CREATE VIEW product_sale AS 가 더 붙고, ORDER BY 가 빠졌다. (VIEW 에서의

ORDER BY 는 아직 구현이 되지 않았다.)

예제예제예제예제 4 4 4 4----4. VIEW4. VIEW4. VIEW4. VIEW 생성생성생성생성 예제예제예제예제

CREATE VIEW product_sale AS SELECT sale.sale_num, product.prod_name, product.prod_cost,

sale.sale_amount, product.prod_cost * sale.sale_amount AS sale_cost, date(sale.sale_time) AS

sale_date FROM product, sale WHERE product.prod_num = sale.prod_num;

이렇게 만들어진 뷰는 \d 명령어를 쳐보면 view 로 나타나게 된다. 이를 어떻게 활용할 지 살펴

보도록 하겠다.

우선 뷰는 SELECT 시 테이블과 동일하게 사용할 수 있다. 다만, INSERT 나 DELETE 가 동작한다고

하지만 시도하지 않는 것이 좋다. (어떠한 결과가 나타나게 될지 모른다.) 다음과 같은 쿼리를 줘

보도록 하자.

예제예제예제예제 4 4 4 4----5. 5. 5. 5. 생성한생성한생성한생성한 View View View View 에서에서에서에서 데이터를데이터를데이터를데이터를 추출하는추출하는추출하는추출하는 쿼리쿼리쿼리쿼리

SELECT * FROM product_sale ORDER BY sale_num;

Page 41: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

아까와 동일한 결과를 아주 손쉽게 얻어낼 수 있었다. 이렇게 만들어진 뷰는 물리적인 저장공간을

사용하지 않는다. 각 테이블을 참조해서 그 결과를 조인해서 사용하게 된다. 단, 일반적으로 매번

조인 문장을 사용하는 것보다는 뷰를 사용하는게 성능 측면에서는 효과적이다. 그 이유는 버퍼의

사용여부와 SQL 문장 파싱에 있다. 매번 조인 문장을 사용한다면 조인 문장을 사용할때 마다

SQL 서버 내부적으로 문장을 파싱한 후에 수행하는데 그 때문에 한번 수행했던 결과가 버퍼에

저장되지 않는다. 그러나 뷰로 만들었을 경우는 파싱을 수행하지 않고 게다가 한번 수행한 결과는

계속 버퍼상에 존재하므로 그만큼 효율적인 결과를 얻어낼 수 있다.

Appendix A. Appendix A. Appendix A. Appendix A. 연습문제연습문제연습문제연습문제

숙제 1) 위의 product, sale 테이블 외에 customer 라는 테이블을 만들고 3 개의 테이블을 서로

조인하여 출력하는 뷰를 다시 만들어라. (sale 테이블도 바뀌어야 한다.) customer 테이블에 들어가는

필드 : 고객번호, 고객명, 고객전화번호

그림그림그림그림 A A A A----1. 1. 1. 1. 숙제숙제숙제숙제 1 1 1 1 의의의의 쿼리쿼리쿼리쿼리 결과결과결과결과

숙제 2) 각 품목의 판매실적을 계산해 내어라.

그림그림그림그림 A A A A----2. 2. 2. 2. 숙제숙제숙제숙제 2 2 2 2 의의의의 쿼리쿼리쿼리쿼리 결과결과결과결과

Page 42: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의

숙제 3) 각 고객의 판매실적을 계산해 내어라.

그림그림그림그림 A A A A----3. 3. 3. 3. 숙제숙제숙제숙제 3 3 3 3 의의의의 쿼리쿼리쿼리쿼리 결과결과결과결과

이상입니다.

Page 43: 예제를 통한통한 PostgreSQL에서의 PostgreSQL에서의 …cfs3.tistory.com/upload_control/download.blog?fhandle... · 2015-01-21 · 예제를 통한통한 PostgreSQL에서의