General

\c[onnect] [DBNAME|- [USER]]
connect to new database (currently "movie")
\cd [DIR] change the current working directory
\copyright show PostgreSQL usage and distribution terms
\encoding [ENCODING]
show or set client encoding
\h [NAME] help on syntax of SQL commands, * for all commands
\q quit psql
\set [NAME [VALUE]]
set internal variable, or list all if no parameters
\timing toggle timing of commands (currently off)
\unset NAME unset (delete) internal variable
\! [COMMAND] execute command in shell or start interactive shell

Query Buffer
\e [FILE] edit the query buffer (or file) with external editor
\g [FILE] send query buffer to server (and results to file or |p
\p show the contents of the query buffer
\r reset (clear) the query buffer
\w FILE write query buffer to file

Input/Output
\echo [STRING] write string to standard output
\i FILE execute commands from file
\o [FILE] send all query results to file or |pipe
\qecho [STRING]
write string to query output stream (see \o)

Informational
\d [NAME] describe table, index, sequence, or view
\d{t|i|s|v|S} [PATTERN] (add "+" for more detail)
list tables/indexes/sequences/views/system tables
\da [PATTERN] list aggregate functions
\db [PATTERN] list tablespaces (add "+" for more detail)
\dc [PATTERN] list conversions
\dC list casts
\dd [PATTERN] show comment for object
\dD [PATTERN] list domains
\df [PATTERN] list functions (add "+" for more detail)
\dg [PATTERN] list groups
\dn [PATTERN] list schemas (add "+" for more detail)
\do [NAME] list operators
\dl list large objects, same as \lo_list
\dp [PATTERN] list table, view, and sequence access privileges
\dT [PATTERN] list data types (add "+" for more detail)
\du [PATTERN] list users
\l list all databases (add "+" for more detail)
\z [PATTERN] list table, view, and sequence access privileges (same

Formatting
\a toggle between unaligned and aligned output mode
\C [STRING] set table title, or unset if none
\f [STRING] show or set field separator for unaligned query output
\H toggle HTML output mode (currently off)
\pset NAME [VALUE]
set table output option
(NAME := {format|border|expanded|fieldsep|footer|null|
recordsep|tuples_only|title|tableattr|pager})
\t show only rows (currently off)
\T [STRING] set HTML <table> tag attributes, or unset if none
\x toggle expanded output (currently off)

Copy, Large Object
\copy ... perform SQL COPY with data stream to the client host
\lo_export LOBOID FILE
\lo_import FILE [COMMENT]
\lo_list
\lo_unlink LOBOID large object operations

movie-#

'PostgreSQL' 카테고리의 다른 글

공개용 데이터베이스 서버 PostgreSQL (2)  (0) 2009.06.30
PostgreSql 명령어  (0) 2008.07.17
Postgresql 프로그래밍  (0) 2008.04.23
UNION, INTERSECT, EXCEPT  (0) 2007.09.19
Postgresql JDBC 드라이버 설치하기  (0) 2007.06.13
, .

1절. Postgresql 에 대한 소개

Postgresql(이하 Psql)은 Mysql 과 함께 공개진영에서 가장 사랑받고 있는 대표적인 RDBMS 이다. 상당히 오래된 역사를 가지고 있으며, 완성도 역시 상당히 높다. 속도를 중요시해서 몇가지 표준적인 기능을 제외시킨 MySql 과는달리, Psql 은 SQL92 의 모든 표준을 지키고 있다.

그런이유로 중규모서 대규모 사이의 데이타를 유지하고 관리하는데 유용하게 쓰일수 있다.

또한 공개이면서도 SQL92 표준을 준수하며, 비교적 쉽게 접근가능하다는 이유때문에 교육용으로써의 용도로도 훌륭하게 사용할수 있으며, 그런이유로 필자의 경우 SQL 을 배우기 위한툴(교육용)로 mysql 보다는 Psql 을 추천한다. psql 에 대한 자세한 내용은 PostGreSQL 사이트DB 사랑넷 을 참고하기 바란다.


2절. Postgresql 프로그래밍

2.1절. Postgresql 설치하기

보통 필자의 기사는 프로그래밍 자체에 촛점을 맞추고, 그 환경을 만드는 것에 대해서는 다루고 있지 않지만, 특별히 Pgsql 에 대해서는 설치하는것과 환경만드는 것까지 다룰것이다. 이유는 개인적으로 Pgsql 을 무척 좋아하기 때문이다.


2.1.1절. 다운받기

이 글에서는 source 파일을 이용한 설치방법에 대해서 다룰것이다. 먼제 http://www.ca.postgresql.org/ftpsite 에서 최신버젼의 psql 을 다운받도록 한다. 최신버젼인 postgresql-7.2.2.tar.gz 를 다운받도록 하자.

다운받았다면 적당한 디렉토리로 옮겨서 압축을 풀도록 한다. Linux 에서는 관례적으로 쏘쓰파일의 컴파일은 /usr/src 에서 한다.

	[root@localhost src]# tar -xvzf postgresql-7.2.2.tar.gz........				


2.1.2절. 컴파일 하기

일반적인 ./configure 스크립트실행 -> make -> make install-> 를 따른다.

우선 ./configure 스크립트를 이용해서 자기 환경에 맞도록 Makefile 을 생성시켜줘야 한다. ./configure 를 실행할때 여러가지 옵션을 줌으로써 pgsql 의 환경에 변화를 줄수 있는데, 기본적으로 멀티바이트를 지원할수 있어야 하며, odbc 지원과, perl, python, c++ 등을 위한 프로그래밍 인테페이스를 지원하도록 만들것이다. 그러므로 대충 아래와 같은 스크립트 실행화면을 보여줄것이다.

[root@localhost src]# ./configure --enable-multibyte --enable-locale \> --enable-nls=ko --with-CXX --with-python --enable-odbc......				
이제 Makefile 이 만들어졌을것이다. 그럼 make 를 이용해서 쏘쓰를 컴파일 하도록 한다. 완료되었다면 make install 을 이용해서 설치를 종료한다.


2.1.3절. 환경설정

설치를 마쳤다면 pgsql 을 가동시키기 위한 몇가지 환경설정을 해주어야 한다.

RDBMS 서버를 root 로 실행시킬경우 여러가지 보안문제등을 일으킬수 있음으로, pgsql 은 이를 원천적으로 봉쇄하고 있다. 반드시 DB관리를 위환 일반유저를 하나 생성한다음에, 이 유저를 통해서 서버관리를 해야만 한다. 일반유저를 하나 만들도록 하자 이름은 관리자 마음인데, 필자는 postgres 이름으로 만들었다.

[root@localhost src]# adduser postgres[root@localhost src]# passwd postgresChanging password for user postgresNew UNIX password: ...				

유저 생성을 해주었다면 이제는 pgsql 이 데이타들을 관리할 (테이블과, 테이블내용들이 파일로 정리되는) 디렉토리를 만들어주고 이 디렉토리에 대한 권한 설정을 해주어야 한다.

우리는 pgsql 을 컴파일할적에 어디에 설치될지 디렉토리를 지정해 주지 않았다. 이럴경우에는 기본디렉토리로 설정되는데, 기본 디렉토리는 /usr/local/pgsql 이다. 그러니 데이타베이스 파일이 쌓이는 디렉토리는 /usr/local/pgsql/data 로 하도록 하겠다. 디렉토리를 만든다음에 소유자를 postgres 로 해주고, 보안을 위해서 권한을 700 으로 하도록 하자.

[root@localhost src]# mkdir /usr/local/pgsql/data[root@localhost src]# chown postgres.postgres /usr/local/pgsql/data[root@localhost src]# chmod 700 /usr/local/pgsql/data				

만들어진 postgres 유저로 변경한다음에, DB 관리자로써 필요한 환경설정을 하도록 하자.

우선은 실행파일 경로를 지정해줘야 한다. 실행파일은 /usr/local/pgsql/bin 이다. ".bash_profile" 을 편집해서 실행파일 찾기 경로, 라이브러리 찾기경로를 지정해 주어야 한다.

PATH=$PATH:/usr/local/pgsql/binLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/libexport LD_LIBRARY_PATH PATH				

.bash_profile 를 수정했다면, 다시 로그인을 하던지, source 명령을 이용해서 환경변수를 다시 등록시키도록 하자.

[root@localhost test]# source /root/.bash_profile				


2.1.4절. 서버실행

서버 실행을 위해서는 root 가 아닌 일반계정자로 변환해야 한다. DB 관리자를 위해서 postgres 를 만들어 두었으니 postgres 로 유저 변경하도록 한다.

[root@localhost src]# su - postgres				

스위칭 유저를 했다면 DB 초기화를 해야한다. DB 초기화라고 해서 머 거창하게 어려울것으로 생각할 필요 없다. 그냥 initdb 를 한번만 실행시켜주면 된다.

   [postgres@localhost src]$ initdb .......Success. You can now start the database server using:    /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/dataor    /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start[postgres@localhost src]$ postmaster -i&				
그다음에 postmaster 를 이용해서 서버를 띄우면 된다. 이때 인터넷 서비스를 가능하게 하고 싶다면 "-i" 옵션을 줘야 한다.


2.2절. 프로그램 제작

이제 psql 의 설치를 마쳤음으로 pgsql 에서 제공하는 c/c++ API 를 이용해서 프로그래밍을 해보기로 하자.


2.2.1절. 테스트용 DB 만들기

프로그램을 만들려면 무언가 엑세스가 가능한 자료가 있어야 할것이다.

이번 프로그램에서 사용될 DB정보는 우편번호로 하기로 하겠다. 우편번호 데이타는 Kylix3 를 이용한 어플리케이션제작 에서 이용해던데이타를 제사용하도록 하겠다.

먼제 createdb 를 이용해서 post 라는 이름의 데이타베이스를 만들도록 하자.

[postgres@localhost src]$ createdb post CREATE DATABASE				
그다음에 우편번호 데이타를 입력해야 할건데, 이것은 위의 kylix3 를 이용한 어플리케이션 제작의 문서를 참고하기 바란다.


2.2.2절. 어떤 프로그램을 만들것인가

만들 프로그램은 "Kylix3 를 이용한 어플리케이션 제작" 에서 만든 GUI 버젼의 프로그램을 pgsql 에서 제공하는 C API 를 이용해서 제작성한 프로그램으로, 단순히 리스트만 보여주는 데에서 탈피하여 사용자가 원하는 지역의 우편번호를 찾을수 있도록 인터페이스도 제공할것이다.

그렇지만 완벽한 프로그램을 만들지는 않을것이다. 단지 이런식으로 pgsql API 를 이용해서 프로그램제작이 가능하다 라는 정도만을 보여주는 수준으로 제작하게 될것이다.


2.2.3절. libpq (C library)

pgsql 은 C 프로그래밍 인터페이스를 위한 libpq C 라이브러리를 제공한다. 이 라이브러리의 위치는 /usr/local/pgsql/lib 에 위치하고 있다. 이번장에서는 libpq 에서 제공하는 기본적인 몇가지 함수에 대해서 알아볼 것이다.

그렇지만 모든 함수에 대해서 설명을하진 않을것이며, 단지 자주 사용되는 중요한 몇몇함수에 우선순위를 두고 설명할것이다. 다른 여러가지 함수들에 대해서 알고 싶다면 /usr/local/pgsql/doc/html 아래에 있는 html 문서들을 참고하기 바란다.


2.2.3.1절. DB 연결/해제관련

DB연결과 관련되어서는 다음과 같이 2가지의 중요한 함수들이 제공된다.

#include <libpq-fe.h>PGconn *PQsetdb(char *pghost, char *pgport, char *pgoptions, char *pgtty, char *dbName);PGconn *PQsetdbLogin(char *pghost, char *pgport, char *pgoptions,                      char *pgtty, char *dbName, char *login, char *pwd);					
2개 함수는 같은일을 한다. 다만 Login 이 붙은 함수의 경우 권한을 획득하기 위해서 로긴이름과 패스워드를 입력해야할 필요가 있을때 사용한다.

PQsetdb 의 경우는 권한획득이 필요 없을 경우 예를 들자면 모두에게 열린 db 나 혹은 postgres 와 같은 DB관리자 권한을 가지고 있을때 사용할수 있을 것이다.

리턴값은 DB 연결을 가르키는 PGconn 이라는 DB 연결 정보 객체이다.

아규먼트는 각각 접근하고자 하는 "호스트", "포트", "옵션", "디버깅용 tty", "데이타베이스 이름", "로기인 ID", "패스워드" 를 나타낸다. pgsql 은 포트로 5432 를 사용한다.

연결을 했다면 DB 연결을 끊어주는 함수도 있어야 할것이다.

PQfinish(conn);					
아규먼트로는 PQsetdb(혹은 PQsetdbLogin)을 통해서 얻은 PGconn 값을 넣어주면 된다.

libpq 는 각각의 함수실행에 대해서 그결과를 알수 있는 별도의 함수를 제공한다. 이경우에는 DB연결이 제대로 이루어졌는지, 제대로 이루어지지 않았다면 어떤 문제가 있는지를 알려주는 연결검사 함수를 제공한다.

ConnStatusType PQstatus(const PGconn *conn);					
예를들어서 연결에 문제가 있는지 확인해 보고 싶다면
if (PQstatus(conn) == CONNECTION_BAD){    fprintf(stderr, "%s", PQerrMessage(conn));    exit(0);}					
과 같은 방법으로 연결 체크를 할수가 있다.


2.2.3.2절. 쿼리실행 관련

여기에서는 Query 를 실행하고 그 값을 가져오는 함수들에 대해서 알아보도록 하겠다.

Query 를 실행하기 위한 가장 간단한 함수는 PQexec 이다.

PGresult *PQexec(PGconn *conn, const char *query); 					
사용방법은간단하다. PQsetdb 등의 함수를 통해 넘겨받은 연결정보를 첫번째 아규먼트로 하고, 2번째 아규먼트에 실행시키고자하는 쿼리를 입력 하면된다.

또한 PQresultStatus() 함수를 사용해서 쿼리를 실행한 결과에 대한 상태를 알아낼수 있다.

ExecStatusType PQresultStatus(const PGresult *res);					
다음과 같은 방법으로 알아낼수 있을것이다.
//쿼리를 성공적으로 수행해서 데이타 내용을 가져왔는지 if (PQresultStatus(res) != PGRES_TUPLE_OK){}// 비어있는 쿼리를 보냈을경우if (PQresultStatus(res) != PGRES_EMPTY_QUERY){}// 명령을 성공적으로 수행했을경우 // 단 이것은 데이타를 가져오는 쿼리가 아닌 명령들에 대한 결과를 알고 싶을때. if (PQresultStatus(res) != PGRES_COMMAND_OK){}// 치명적인 오류가 발생했을경우 // 쿼리를 잘못내렸거나, 없는 테이블로 부터 자료를 요청하는등 ..if (PQresultStatis(res) != PGRES_FATAL_ERROR){}					

또한 PQresultERRorMessage() 함수를 이용함으로써, 쿼리에 대해서 정확하게 어떠한 문제가 발생했는지를 알아낼수 있다.

if (PQresultStatis(res) != PGRES_FATAL_ERROR){    fprintf(stderr, "%s", PQresultErrorMessage(const PGresult *res));	}					

더이상 쿼리결과 발생한 데이타를 사용할일이 없다면, 반드시 PQclear() 함수를 이용해서 메모리 해제(free) 시켜줘야 한다. 만약 그렇지 않다면 메모리 누수가 일어날수도 있다.

void PQclear(PQresult *res); 					


2.2.3.3절. select 쿼리 결과 정보를 가져오기

select 쿼리를 이용해서 데이타를 가져왔을경우, 몇개의 데이타를 가져왔는지, 가져온 데이타는 몇개의 필드로 이루어져 있는지, 등을 알아내야 할것이다.

PQntuples 를 이용해서 우리가 내린 쿼리의 결과값이 몇개인지 알아낼수 있다.

int PQntuples(const PGresult *res);					

PQnfields 를 이용해서 가져온 데이타가 몇개의 필드로 이루어져 있는지 확인할수 있다.

int PQnfields(const PGresult *res);					

각 필드의 필드명을 가져올수 있다.

char *PQfname(const PGresult *res, int field_index);					

각필드가 몇바이트의 크기를 차지하고 있는지 알려준다. 즉 int 형이라면 4 를 되돌려줄것이다. 만약 필드가 variable 타입이라면 -1 을 되돌려줄것이다.

int PQfsize(const PGresult *res, int field_index);					


2.2.3.4절. select 결과 가져오기

이제 select 한 결과를 가져오기로 하자. PQgetvalue 를 이용해서 쿼리 결과에 대한 값을 가져올수 있다.

int PQgetvalue(const PGresult *res, int tup_num, int field_num); 					
아규먼트는 PGresult 객체와, 가져오고자 하는 tuple 의 인텍스 번호 그리고 가져오고자 하는 field 의 index 번호이다. 인덱스 번호는 배열과 마찬가지로 0번부터 시작한다.

그리고 PQgetisnull 를 이용해서 데이타가 있는지 없는지 확인할수 있다.

int PQgetisnull(const PGresut *res, int tup_num, int field_num);						
만약 tup_num 의 field_num 에 해당되는 데이타가 없다면 1을 반환할것이다. 이것은 필드의 값이 NULL 일경우 1 을 돌려주지 않는다는 점을 유의해야 한다. tup_num 이 field_num 자체가 없을경우, 즉 잘못된 tuple 인덱스번호 (tuple 최대 크기 번호를 초과했을경우) 등을 참조할경우 1 을 돌려준다. 이러한 특성을 사용해서 PQgetisnull 을 사용해서, 1이 될때까지 계속 증가시키면서 원하는 데이타를 가져올수 있을것이다.
int i = 0;...while(PQgetisnull(res, i, 0) != 1){    printf("%s\n", PQgetvalue(res, i, 0);    i++;}					
물론 이방법대신에 PQntuples() 함수를 이용해서 데이타를 가져올수도 있을것이다.

PQgetlength() 를 이용하면 가져온 데이타의 실제 길이를 byte 단위로 돌려준다.

 int PQgetlength(const PGresult *res, int tup_num, int field_num);					


2.2.3.5절. non select 결과 정보 가져오기

select 는 직접 데이타를 가져오는 쿼리지만 그렇지 않은 쿼리들도 있다. insert, update, delete 등이 이러한 쿼리들인데, 데이타를 가져오지 않는 대신에, insert 일경우라면 insert 가 제대로 되었는지, update 라면 몇개의 데이타가 update 되었는지 등의 정보가 중요할것이다.

만약 insert, update, delete 등의 명령을 사용했고, 몇개의 데이타가 이 쿼리에 의해서 적용이 되었는지 알고 싶다면 PQcmdTuples() 함수를 사용하면 된다.

char * PQcmdTuples(const PGrsult *res);					
함수가 좀 이상해 보일것이다. 언뜻 생각해보면 적용되는 데이타의(tuple)의 수를 넘겨주는 것이므로, 리턴값이 int 형이여야 할것같은데, char * 형이다. 왜 char * 로 했는지 필자로써도 알수는 없지만, 어쨋든 char * 형으로 넘어온다. 그래서 어쩔수 없이 atoi() 등의 함수사용도 해야 할것이다.

또한 PQcmdStatus() 함수를 이용해서 쿼리 상태를 검사할수도 있다.

char * PQcmdStatus(const PGresult *res);					


2.3절. 예제

다음은 간단한 예제이다. 매우 간단하지만 어떻게 연결하고 쿼리결과를 가져오며, 에러를 처리해야 하는지에 대한 기본적인 내용을 담고 있다.

예제 : zipcode_psql.c

// libpq-fe.h 를 만드시 추가시켜야 한다. #include <libpq-fe.h>#include <nistd.h>#include <stdlib.h>#include <stdio.h>int main(int argc, char **argv){    PGconn        *conn;    PGresult      *res;    int field_num;    int row_num;    int i;    char query[128] = "select * from zipcode";    char *pghost, *pgport, *pgoptions, *dbname,         *pguser, *pgpass;    pghost = "localhost";    pgport = "5432";    pgoptions = NULL;    dbname = "post";    pguser = "yundream";     pgpass = "1234";    // psql 데이타 베이스에 연결한다.    conn = PQsetdbLogin(pghost, pgport, pgoptions, NULL,                         dbname, pguser, pgpass);    // 만약 연결에 오류가 발생했다면     // 오류메시지를 출력한다음에 종료한다.     if (PQstatus(conn) == CONNECTION_BAD)    {        fprintf(stderr, "%s", PQerrorMessage(conn));        exit(0);    }    // 아규먼트가 있다면 sido 와 dong 이름으로 like 검색을 한다.    // 그렇지 않을경우 모든 우편번호 리스트를 출력한다.     if (argc == 2)        sprintf(query, "%s where sido like '%%%s%%' or dong like '%%%s%%'", query, argv[1], argv[1]);     // 쿼리를 발생시킨다.    res = PQexec(conn, query);    // 쿼리가 제대로 실행되었는지 확인한다.     // 제대로 실행되지 않았다면.     // res 를 clear 시키고 연결을 끊고 종료한다.     if (PQresultStatus(res) != PGRES_TUPLES_OK)    {        PQclear(res);        PQfinish(conn);        exit(0);    }    // 몇개의 tuple 를 얻어왔는지 검사한다.     row_num = PQntuples(res);    // 루프를 돌면서 값을 출력한다.     for (i = 0; i < row_num; i++)    {        printf("%s %s %-6s %-40s %s\n", PQgetvalue(res, i, 1),                                      PQgetvalue(res, i, 2),                                       PQgetvalue(res, i, 3),                                       PQgetvalue(res, i, 4),                                       PQgetvalue(res, i, 5));    }    // 쿼리 결과를 위한 res 객체를 free 시켜주고    // psql 서버와 연결을 끊은후 종료한다.     PQclear(res);    PQfinish(conn);    return 1;}			

컴파일 방법은 다음과 같다.

[root@localhost test]# gcc -o zipcode_psql zipcode_psql.c \> -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpq			

아규먼트를 주지 않을경우 전체 우편번호 리스트를 출력하며, 아규먼트가 주어질 경우 도시와 동 이름으로 일치하는 우편번호 리스트를 출력한다.

컴파일이 실행되었는데도 불구하고 에러가 발생한다면, psql 서버가 떠있지 않거나 libpq 를 찾기위한 패스 경로가 지정되어 있지 않기 때문일것이다. /etc/ld.so.conf 에 패스경로를 추가시키거나 혹은 LD_LIBRARY_PATH 에 lipq 경로를 추가하기 바란다. LD_LIBRARY 패스 추가 방법은 2.1.3절 를 참조하기 바란다.


출처: www.joinc.co.kr

'PostgreSQL' 카테고리의 다른 글

PostgreSql 명령어  (0) 2008.07.17
[PostgreSQL] \? for help width psql commands  (0) 2008.04.24
UNION, INTERSECT, EXCEPT  (0) 2007.09.19
Postgresql JDBC 드라이버 설치하기  (0) 2007.06.13
PostgreSQL 7.2 설치하기  (0) 2006.06.17
, .

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

INSERT INTO table [ ( column [, ...] ) ]    { VALUES ( expression [, ...] ) | SELECT query }    	

앞서도 INSERT문은 사용했으므로 기본적인 사용방법은 낯설지는 않으리라 생각된다. 하지만 여기서 짚고 넘어가고, 또 좀 더 심화된 쿼리를 연습해 보도록 하겠다. 모두 예제를 통해서 살펴보자.

예제 3-10. 기본적인 INSERT문 예제

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');			

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

이전에 만들었던 student_new라는 테이블에 데이터를 입력하는 쿼리이다. INSERT INTO 뒤에 테이블 명이 따라 오며 뒤에 괄호로 구분하고 입력할 컬럼명을 일일히 기술한 뒤에 괄호 닫고 VALUES라는 키워드 따라오고 다시 괄호 열고 값들을 순차적으로 기술하고 난 후에 마지막으로 괄호 닫는 것으로 마감하고 있다.

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

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

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

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

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

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

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

INSERT INTO student_new (std_id,std_name, std_addr, std_birthday) VALUES ('9644021', '누구지', '서울시 동작구 상도동', date(now()));			

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

잘~ 들어갔다. 위의 테이블 구조에서 NOT NULL인 항목만 콕 집어서 입력을 한 것이다. 나머지 컬럼은 default값을 설정했다면 default값이 들어갔을 테고, default값을 설정하지 않은 컬럼은 NULL이 들어가게 된다.

위의 예제에서 처음보는 것이 등장했을 것이다. 바로 date(now()) 인데, 이것은 SQL에서 지원하는 함수이다. \df하면 SQL에서 지원하는 함수가 주욱 나타나게 되는데 그중에서 하나로써 now()는 현재 시간을 반환해주며 date()는 date형으로 형변환(type cast)를 해주는 것이다. 여기서는 적절한 예제가 될 수 없지만 (생일이 현재 시간이 되는 경우는 드물다.) 매번 입력할 때 현재 시간을 넣어야 한다면 위와 같이 입력을 해주면 되겠다. 아니면 아예 DEFAULT로 위의 함수를 호출하도록 만들 수도 있겠다.

예제 3-13. INSERT와 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, '피자', '먹을것');			

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

열심히 쿼리를 넣어서 b테이블에 값들을 집어 넣었다. 그러면 b에 넣은 값들을 a테이블에 넣을 수 없을까? 그 해답 바로 INSERT와 SELECT를 같이 쓰는 것이다. 다음과 같은 쿼리를 넣어보도록 하자.

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

INSERT INTO a SELECT num, description FROM b;			

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

위에서 보이는 것과 같이 b 테이블에 있던 값들이 a테이블에 무사히 넘어갔다. 다음과 같은 쿼리를 다시 한번 줘 보도록 하자.

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

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

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

[출처] INSERT|작성자 현엔둘

UNION, INTERSECT, EXCEPT

UNION, INTERSECT, EXCEPT는 합집합, 교집합, 차집합과 관련된 쿼리이다.

다음의 예제를 통해 알아보자.

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

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

INSERT INTO a VALUES (3,'피자');INSERT INTO a VALUES (4,'오징어볶음');INSERT INTO a VALUES (5,'보신탕');INSERT INTO a VALUES (7,'소');		

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

우선 UNION부터 살펴보자. UNION은 두 테이블간의 서로 합집합을 만들어

주도록 되어 있다.

이때 두개의 SELECT문장을 UNION시킬때 두개의 SELECT문장에서 선택하는

컬럼의 구조는 동일하여야 한다.

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

예제 3-33. UNION의 예제

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

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

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

예제 3-34. INTERSECT의 예제

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

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

예제 3-35. EXCEPT의 예제

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

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

'PostgreSQL' 카테고리의 다른 글

[PostgreSQL] \? for help width psql commands  (0) 2008.04.24
Postgresql 프로그래밍  (0) 2008.04.23
Postgresql JDBC 드라이버 설치하기  (0) 2007.06.13
PostgreSQL 7.2 설치하기  (0) 2006.06.17
PostgreSQL 설치  (0) 2006.06.11
, .

[초보] Postgresql Windows와 Linux에서 JDBC 드라이버 설치하기

출처 : http://blog.naver.com/mllmaster/120019169797

안녕하세요?

Postgresql 초보자입니다.

참으로 오랜 시간이 지난뒤 글을 올리는 군요....

오늘은 Postgresql을 이용한 JDBC 설치를 Linux와 Windows에서 어떻게 하는가에 대한 예기를 하고자 합니다.

여기서 Linux나 Windows 모두 DB는 Linux에 설치되어 있습니다.

(접근하는 파일만 Windows에 있느냐 Linux에 있느냐임.)

우선 Linux 부터 하려 합니다. 이 글은 원칙론 적인 것 보단 제 경험에 의한 것이니 잘못된 것이 있으면 지적 부탁 드립니다.

Linux의 경우

postgresql을 깔아야 겠지요? ^^; (설치법은 많이 나와 있으니 자세히 설명하지 않겠습니다.)

그 다음 http://www.postgresql.org에 가서 postgresql.jar를 다운 받습니다.(다운받지 않고 설치시에 생성되게 하는 경우도 있는데 제 경우는 초보자라 어렵더군요.Ant인가도 설치해야하는데 어떻게 해야 하는지도 모르겠구요.)

들어가 보시면 WWW mirror Site와 FTP mirror Site가 있습니다.

그곳에서 WWW mirror Site의 첫번째 미국국기를 클릭하시면 코끼리 그림이 그려진 postgresql 사이트가 나올겁니다.(다른걸 클릭하셔도 크게 다르진 않을듯.^^)

그곳 메뉴중에서 User's lounge라는 메뉴가 두번째 줄에 있군요. 그걸 클릭합니다.

그러면 General Info ,Specialized Postgresql Site, FAQs 등등의 메뉴들이 나올 것입니다. Specialized Postgresql Site에서 JDBC Drivers Website(링크) 를 클릭합니다.

그러면 Cyan 색의 홈페이지가 뜨는데요 맨 상단의 풀색 비슷한 메뉴에서 Downloads(링크)를 클릭합니다.

그러면 비로소 드라이버다운로드 페이지가 뜨는데요....

거기 써 있는데로 JDBC1 -> jdk1.1, JDBC2 ->jdk1.2 1.3, JDBC3->jdk1.4 등에서 동작하는 것이니 자신이 가지고 있는 jdk 버전을 확인하여

받아주시면 됩니다.(저는 여러가지 Driver(latest Stable Driver, 7.3 RC1 Drivers, Development Driver,Archived Driver.. )중 Latest Stable Driver를 받았던 걸로 기억하고 있습니다만..테스트 하다가 잘 안되시면 여러가지를 받아보심이..(--) 경험에 의한 거라 한계가 많네요)

받은 뒤에는 classpath 설정을 해야 겠지요....

PATH=$PATH:$HOME/bin:/usr/java/jdk1.3.1/bin:

unset USERNAME

export CLASSPATH=/usr/local/pgsql/lib/postgresql.jar:/usr/src/pgsql/postgresql-7.2.3/src/interfaces/jdbc/example:/home/postgres

제가 했던 설정은 위와 같구요.(/usr/local/pgsql/lib/postgresql.jar) postgres 홈 디렉토리의 .bashrc또는 .bash_profile 파일에 위와 같은 설정을 하시면 됩니다.

edit 방법은 $vi .bash_profile 또는 $vi .bashrc 가 되겠지요? $는 프롬프트 상태를 표시한 것이니 $를 빼고 치시면 됩니다.

이때 /usr/local/pgsql/lib/ 안에 postgresql.jar을 넣어야 하는 것...잊지 마시구요.

save(:wq)까지 하시면 $source .bashrc 또는 $source .bash_profile을 쳐서 입력 시키는 것 잊지 마시구요.

이다음은 basic.java 파일을 찾습니다. find . -name basic.java -print 명령어를(루트 디렉토리 에서 치기 바람) 통해서 찾아도 되고 직접 디렉토리 탐색을 통해서 찾을 수 도 있슴

직접 디렉토리를 찾아 들어가는 경우는 설치시에 어느 디렉토리를 선택하여 설치하느냐에 따라 다르므로 find 명령어를 사용하면 쉽게 파일들을 찾을 수 있습니다. 중요한것은 example 디렉토리 안에 있는 것이 찾고자 하는 basic.java 파일입니다.

javac basic.java (Enter)

java example.basic jdbc:postgresql:database user password (enter)

(예)

java basic jdbc:postgresql://218.49.168.122:5432/test postgres 1111 (enter)

쳐서 에러가 없으면 JDBC 설치가 끝난 것입니다. 여기서 port 번호는 5432입니다. 이번호 틀리면 에러 메시지를 냅니다.

(Note: basic.java uses or overrides a deprecates API

Note: Recompile with -deprecation for details)

위와 같은 메시지가 나와도 신경쓰지 않아도 됩니다.

만약 아래와 같은 에러 메시지를 내면 다음과 같이 설정을 해 주어야 합니다.

에러 메시지 시작

Connecting to Database URL = jdbc:postgresql://211.116.131.132:5432/gazetteer

Exception caught.

Something unusual has occured to cause the driver to fail. Please report this exception: Exception: java.sql.SQLException: FATAL 1: No pg_hba.conf entry for host 211.116.131.132, user postgres, database gazetteer

에러 메시지 끝

host all 211.110.000.000 255.255.255.192 trust (211.110.000.000 은 접속하고자 하는 pc(외부 컴퓨터)의 ip 번호입니다.)

data 라는 디렉토리에 있는 pg_hba.conf 파일을 수정하면 됩니다.

역시 pg_hba.conf 파일을 찾는 경우도 find . -name pg_hba.conf -print (Enter) 입니다.^^

아참 설정후 postmaster를 다시 가동 시켜 주셔야 합니다.

가동 방법..

kill -9 -1 (Enter) (모든 프로세스를 죽임..0-0;; 원하지 않으시면 ps 치신후 kill [pid] <= 해당 process번호를 치시면 됩니다)

postmaster -i& (Enter)

원본 : http://database.sarang.net/?inc=read&aid=4446&criteria=pgsql&subcrit=tutorials&id=&limit=20&keyword=&page=4

윈도우의 경우

기본적으로 postgresql.jar 파일을 classpath 에 추가시킨 후

basic.java를 컴파일 하기만 하면 됩니다.

postgresql.jar 파일 받는 법은 위와 동일하고 적당한 디렉토리에 postgresql.jar를 놓은 후

classpath에 아래와 같이 추가 합니다.

C:\javasource\postgresql.jar

postgresql.jar 앞의 경로는 임의로 선택한 디렉토리 경로입니다. (windows 2000의 경우 내컴퓨터를 오른쪽 클릭 하시고 등록정보 클릭 하시면 '고급'이라는 텝 이름이 나오는데, 그곳을 클릭하면 환경 변수 버튼이 있습니다. 클릭하시고 classpath 부분에 위와같은 형식으로 추가 해 주십시오.

basic.java 컴파일은 위의 리눅스의 경우와 동일합니다.

실행 시 에러 메시지를 내는 경우 postgresql DB가 깔려있는 리눅스로 접속해 trust 설정을 해 주시면 (host all 211.116.000.000 255.255.255.192 trust) 됩니다.

'PostgreSQL' 카테고리의 다른 글

[PostgreSQL] \? for help width psql commands  (0) 2008.04.24
Postgresql 프로그래밍  (0) 2008.04.23
UNION, INTERSECT, EXCEPT  (0) 2007.09.19
PostgreSQL 7.2 설치하기  (0) 2006.06.17
PostgreSQL 설치  (0) 2006.06.11
, .