Part I. Tutorial

목차

1. 시작하기
1.1. 설치
1.2. 아키텍 기초
1.3. 데이터베이스 생성
1.4. 데이터베이스에 액세스
2. SQL 언어
2.1. 소개
2.2. 개념
2.3. 새 테이블 만들기
2.4. 행으로 테이블 채우기
2.5. 테이블 쿼리
2.6. 테이블 간 조인
2.7. 집계 함수
2.8. 업데이트
2.9. 삭제
3. 고급 기능
3.1. 소개
3.2. 뷰
3.3. 외래 키
3.4. 트랜잭션
3.5. Window 함수
3.6. 계층
3.7. 결론 

 

1. 시작하기

1.1. 아키텍처

 PostgreSQL은 클라이언트/서버 모델을 사용합니다. PostgreSQL 세션 은 다음과 같은 프로세스(프로그램)로 구성됩니다.

  • 데이터베이스 서버 프로그램  : 데이터베이스 파일을 관리하는 서버 프로세스는 클라이언트의 연결을 수락하고 데이터베이스 작업을 수행합니다. 
  • 데이터베이스 작업을 수행하려는 사용자의 클라이언트(프런트엔드) 애플리케이션 : 클라이언트는 텍스트 도구, 그래픽 애플리케이션, 웹 페이지를 표시하기 위해 데이터베이스에 액세스하는 웹 서버 또는 데이터베이스 유지.관리 도구입니다.

일반적인 클라이언트/서버 응용 프로그램과 마찬가지로 클라이언트와 서버는 TCP/IP 네트워크 연결을 통해 통신합니다. 

PostgreSQL 서버 는 클라이언트의 여러 동시 연결을 처리할 수 있습니다. 이를 위해 각 연결에 대해 새로운 프로세스를 시작( "fork" )합니다. 그 시점부터 클라이언트와 fork된 서버 프로세스는 원래 postgres프로세스의 개입 없이 통신합니다.

1.2. 설치

https://www.postgresql.org/download/ 에서 설치 환경(OS, Windows, MacOS, Linux, Solaris 등) 에 맞는 설치파일을 다운로드 한 후 설치한다.

윈도우에 설치 시 아래 4개 컴포넌트가 설치된다.

  • PostgreSQL Server : PostgreSQL Database Server
  • pgAdmin : PostgreSQL database 관리와 작업을 위한 GUI 툴
  • Stack Builder : 추가 툴이나 driver 그리고 Application 등을 다운로드를 위한 
  • Command Line Tools : DB접속을 위한 Cli 툴

윈도우에 설치 시 superuser(posgres)에 대한 패스워드, DB Port, Locale 입력화면이 나오면 원하는 값 입력한다. 

Linux나 MacOS 에 설치는 https://www.postgresql.org/download  페이지를 참고한다.

1.3. DB 접속

1) psql 로 접속

Database가 설치된 서버에서 접속 시에는 host를 생략할 수 있고, default port를 사용하는 경우에는 port 생략 가능

$ psql -h {host} -p {port} -U {user} -d {database}

2) SQL Shell을 이용한 접속

Windows 에 설치된 "SQL Shell(psql)" 을 실행시킨 후 DB 접속을 위한 정보를 차례로 입력한다.

 

3) client 툴로 접속

클라이언트 툴(TablePlus, Psequel, PgAdmin, Postico, Azure Data Studio, DBeaver, Command Line Tool 등)을 이용하여 DB에 접속한다. 본 문서에서는 TablePlus로 접속하는 방법을 설명한다.

 

- TablePlus 실행 화면에서 마우스 오른쪽 버튼을 클릭한 다음 "[New] - PostgreSQL" 선택한다

 

- 아래와 같이 DB 접속을 위한 화면에 DB 정보를 입력한다.

-

  • Name : 임의의 별칭(Alias) 입력
  • Host : DB서버의 IP나 hostname, endpoint 등을 입력. 본 문서에서는 PC에 설치했으므로 localhost 입력
  • Port : 설치 시 입력했던 Port 입력(Default Port는 5432)
  • User : postgress 입력
  • Password : 설치 시 입력했던 password 입력
  • Database : 기본적으로 postgres database 가 설치되므로 postgresql을 입력해도 되고 공란으로 유지해 된다.

입력이 완료되면 [Test] 를 수행한 후 정상 접속이 확인되면 [Save] 버튼을 클릭하여 저장한다.

 

4) java, python 등의 프로그램으로 접속

 

1.3. 데이터베이스 생성

mydb 데이터베이스 생성:

CREATE DATABASE mydb;

 

 

salesspace 테이블스페이스를 사용하여 사용자 salesapp이 소유한 데이터베이스 sales 생성

CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;

 

1.4. 도메인 생성

postgreSQL의 자료형에는 Domain Types이 있습니.

도메인은 선택적 제약 조건(허용되는 값 집합에 대한 제한 사항)이 있는 데이터 유형입니다. 도메인을 정의하는 사용자가 도메인의 소유자가 됩니다. 

 

DOMAIN 생성 문법

CREATE DOMAIN name [ AS ] data_type
    [ COLLATE collation ]
    [ DEFAULT expression ]
    [ constraint [ ... ] ]

where constraint is:

[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | CHECK (expression) }
  • name: 사용자 정의 데이터 유형의 이름
  • data_type: 데이터 유형
  • COLLATE : 도메인에 대한 데이터 정렬입니다. 데이터 정렬이 지정되지 않은 경우 도메인은 기본 데이터 유형과 동일한 데이터 정렬 동작을 합니다. 
  • DEFAULT default_value: 기본값 (선택 사항)
  • CONSTRAINT constraint_name: 제약 조건의 이름 (선택 사항)
  • NOT NULL: NULL 값을 허용하지 않음 (선택 사항)
  • CHECK (expression): 값 유효성 검사를 위한 표현식 (선택 사항)

Domain Examples

이 예에서는 us_postal_code 데이터 유형을 생성한 다음 테이블 정의에 해당 유형을 사용합니다. 정규식 테스트는 값이 유효한 미국 우편번호인지 확인하는 데 사용됩니다. 아래 도메인 제약은 5자리 정수 입력 허용과 5자리-4자리 정수 입력만을 허용하는 규칙입니다.

CREATE DOMAIN us_postal_code AS TEXT
CHECK(
   VALUE ~ '^\d{5}$'
OR VALUE ~ '^\d{5}-\d{4}$'
);

CREATE TABLE us_snail_addy (
  address_id SERIAL PRIMARY KEY,
  city TEXT NOT NULL,
  postal us_postal_code NOT NULL
);

 

INSERT INTO us_snail_addy(city, postal) VALUES('LOS ANGELES', '12345-1234');  /* 입력성공 */
INSERT INTO us_snail_addy(city, postal) VALUES('LOS ANGELES', '12345-12345'); /* 입력실패 */

INSERT INTO us_snail_addy(city, postal) VALUES('LOS ANGELES', 'a2345-1234'); /* 입력실패 */

 

현재 접속한 Database 확인

현재 접속한 데이터베이스를 확인한다.

SELECT CURRENT_DATABASE();

 

현재 접속한 User 확인

현재 접속한 user 를 확인한다.

SELECT CURRENT_USER;

 

1.5. 스키마(Schema) 생성

CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ]
CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification

where role_specification can be:

    user_name
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

현재 데이터베이스에 새 스키마를 생성합니다.

스키마 이름은 현재 데이터베이스에 있는 기존 스키마의 이름과 달라야 합니다.

스키마는 본질적으로 네임스페이스입니다. 

AUTHORIZATION절이 사용되는 경우 생성된 모든 객체가 해당 사용자의 소유라는 점을 제외하면 스키마를 생성한 후 실행되는 별도의 명령과 기본적으로 동일하게 처리됩니다 .

--  스키마 경로 설정
set search_path To postgres, public;

 

위와 같은 설정에서 테이블 명칭만 입력하면 DBMS 가 해당 테이블을 찾을 때
postgres ➔ public 순으로 찾게 됩니다.

 

PostgreSQL에서는 모든 연결이 하나의 데이터베이스에서만 작동합니다. 따라서 데이터베이스를 변경하려면 다른 데이터베이스를 지정하여 다시 연결해야 합니다. MySQL 에 존재하는 'use dbname' 명령어가 없습니다.

 

 

1.6. 계정(User) 생성

CREATE USER name [ [ WITH ] option [ ... ] ]

where option can be:
    
      SYSID uid 
    | CREATEDB | NOCREATEDB
    | CREATEUSER | NOCREATEUSER
    | IN GROUP groupname [, ...]
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'abstime'

 

name : 계정명

SYSID : SYSID 절을 사용하여 새 사용자의 PostgreSQL 사용자 ID를 선택할 수 있습니다. 일반적으로 필요하지 않지만 고아 개체( orphaned object)의 소유자를 다시 만들어야 하는 경우 유용할 수 있습니다.
이를 지정하지 않으면 할당된 가장 높은 사용자 ID에 1을 더한 값(최소 100)이 기본값으로 사용됩니다.

CREATEDB | NOCREATEDB : 

데이터베이스 생성 권한을 정의합니다. default는 NOCREATEDB입니다.

 

CREATEUSER | NOCREATEUSER

데이터베이스 생성 권한을 정의합니다. default는 NOCREATEUSER 입니다.

 

IN GROUP groupname

사용자의 그룹 이름입니다. 여러 그룹 이름이 나열될 수 있습니다.

 

PASSWORD

사용자의 비밀번호를 설정합니다. 비밀번호 인증을 사용할 계획이 없다면 이 옵션을 생략할 수 있지만, 비밀번호 인증으로 전환하기로 결정하면 사용자는 연결할 수 없습니다. 비밀번호는 나중에 ALTER USER를 사용하여 설정하거나 변경할 수 있습니다.

 

ENCRYPTED | UNENCRYPTED

비밀번호가 시스템 카탈로그에 암호화되어 저장되는지 여부를 제어합니다. (두 가지 모두 지정되지 않은 경우 매개변수 password_encryption에 의해 결정됩니다.) 제시된 비밀번호 문자열이 이미 MD5 암호화 형식인 경우 ENCRYPTED 또는 UNENCRYPTED가 지정되었는지 여부에 관계없이 있는 그대로 암호화되어 저장됩니다. 시스템은 지정된 암호화된 비밀번호 문자열을 해독할 수 없습니다). 이를 통해 덤프/복원 중에 암호화된 비밀번호를 다시 로드할 수 있습니다.

 

VALID UNTIL : 비밀번호가 더 이상 유효하지 않게 되는 시간을 설정합니다. 생략하면 비밀번호는 항상 유효합니다.

 

--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;

 

 

1.7. 권한 부여

schema에 읽기 권한 주기

GRANT USAGE ON SCHEMA public TO <계정명>;

 

schema의 모든 table에 읽기 권한 주기

GRANT SELECT ON ALL TABLES IN SCHEMA schema_name TO username;

 

 

 

 

2. SQL 언어

 

2.1. 소개

 

2.2. 개념

 

2.3. 새 테이블 만들기

 

2.4. 행으로 테이블 채우기

 

2.5. 테이블 쿼리

 

2.6. 테이블 간 조인

 

2.7. 집계 함수

 

2.8. 업데이트

 

2.9. 삭제

 

3. 고급 기능

 

3.1. 소개

 

3.2. 뷰

 

3.3. 외래 키

 

3.4. 트랜잭션

 

3.5. Window 함수

 

3.6. 계층

 

3.7. 결론 

 

 

 

 

 

 

 

+ Recent posts