postgres 데이터베이스+서버 무결성

jadive study·2022년 10월 12일
0

-리눅스를 많이씀
실습을 해볼 운영체제 -리눅스
-os 유닉스 계열
인터페이스 - 사물과 사물 사물과 인간사이
-.컴퓨터 H/W

Docker

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다
컨테이너(Container)는 개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 말한다. 컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 메커니즘을 제공한다

컨테이너를 가상 머신(Virtual Machine)
가상 머신은 하드웨어 스택을 가상화
컨테이너는 이와 달리 운영체제 수준에서 가상화를 실시하 여 다수의 컨테이너를 OS 커널에서 직접 구동
컨테이너는 훨씬 가볍고 운영체제 커널을 공유
시작이 훨씬 빠르고 운영체제 전체 부팅보다 메모리를 훨씬 적게 차지

이미지(Image)
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다(Immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.

이미지 저장소
도커는 빌드한 이미지를 서버에 배포하기 위해 직접 파일을 복사하는 방법 대신 도커 레지스트리(Docker Registry)라는 이미지 저장소를 사용한다. 도커 명령어를 이용하여 이미지를 레지스트리에 푸시(push)하고 다른 서버에서 풀(pull)받아 사용하는 구조이다. (git과 유사)

네트워크 -클라이언트→(요청) 서버 ←(응답)

protocol-대화를 맞춰주는것 (통신에 대한 포맷을 맞춰줌)

TCP UDP HTTP FRP SMTP SSL SSH HTTP POP3

Restful API -RESTful API는 두 컴퓨터 시스템이 인터넷을 통해 정보를 안전하게 교환하기 위해 사용하는 인터페이스이다. 대부분의 비즈니스 애플리케이션은 다양한 태스크를 수행하기 위해 다른 내부 애플리케이션 및 서드 파티 애플리케이션과 통신해야 한다. RESTful API는 안전하고 신뢰할 수 있으며 효율적인 소프트웨어 통신 표준을 따르므로 이러한 정보 교환을 지원합니다.

URL-네트워크 상에서 지원이 어디 있는지 알려주기 위한 규약

IP Port
protocol domain Name port
클라이언트 → 서버 →데이터 저장소backend (접근 획득) DB
리눅스 WSL-따로 설치할 필요가 없음

22.04 LTS
wsl—install
wsl- -list-o[—online]
wsl—install-d Ubuntu20.04

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

출처:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

출처:

https://gaesae.com/161

[개새닷컴:티스토리]

wsl2 설치

hyper v

데이터 → 자체로 단순한 사실만을 나타내는것
데이터 베이스 -실시간 응답처리가 가능해야한다

지속적은 변화
sql 특수목적 프로그래밍 언어
DDL-데이터베이스 뷰 인덱스 함수
DML-데이터 갱신 삭제 추가
DCL-접근하거나 권한 부여

https://www.enterprisedb.com/postgresql-tutorial-resources-training?uuid=db55e32d-e9f0-4d7c-9aef-b17d01210704&campaignId=7012J000001NhszQAC

DBMS

-DATABASE1,2,3- table

\q 

postgres=# select * from develop_book ORDER BY book_id ASC;

오름차순

postgres=# \l
데이터베이스 목록
이름    |  소유주  | 인코딩 |     Collate      |      Ctype       |      액세스 권한
-----------+----------+--------+------------------+------------------+-----------------------
postgres  | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 |
template0 | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 | =c/postgres          +
|          |        |                  |                  | postgres=CTc/postgres
template1 | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 | =c/postgres          +
|          |        |                  |                  | postgres=CTc/postgres
(3개 행)
postgres=# dt
postgres-# \dt
릴레이션(relation) 목록
스키마 |     이름     |  종류  |  소유주
--------+--------------+--------+----------
public | develop_book | 테이블 | postgres
(1개 행)
postgres-# \c template1
접속정보: 데이터베이스="template1", 사용자="postgres".
template1-# \e
CREATE TABLE
template1=# CREATE TABLE test
template1-# {
template1-# ddd
template1-# dffi
template1-# \q
postgres=# CREATE TABLE test
postgres-# CREATE DATABASE book_store;
postgres=# \l
데이터베이스 목록
이름    |  소유주  | 인코딩 |     Collate      |      Ctype       |      액세스 권한
-----------+----------+--------+------------------+------------------+-----------------------
postgres  | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 |
template0 | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 | =c/postgres          +
|          |        |                  |                  | postgres=CTc/postgres
template1 | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 | =c/postgres          +
|          |        |                  |                  | postgres=CTc/postgres
(3개 행)
postgres=# \c postgres
접속정보: 데이터베이스="postgres", 사용자="postgres".
postgres=# CREATE DATABASE book_store
postgres-# \l
데이터베이스 목록
이름    |  소유주  | 인코딩 |     Collate      |      Ctype       |      액세스 권한
-----------+----------+--------+------------------+------------------+-----------------------
postgres  | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 |
template0 | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 | =c/postgres          +
|          |        |                  |                  | postgres=CTc/postgres
template1 | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 | =c/postgres          +
|          |        |                  |                  | postgres=CTc/postgres
(3개 행)
postgres-# CREATE DATABASE book_store
postgres-# \l
데이터베이스 목록
이름    |  소유주  | 인코딩 |     Collate      |      Ctype       |      액세스 권한
-----------+----------+--------+------------------+------------------+-----------------------
postgres  | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 |
template0 | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 | =c/postgres          +
|          |        |                  |                  | postgres=CTc/postgres
template1 | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 | =c/postgres          +
|          |        |                  |                  | postgres=CTc/postgres
(3개 행)
postgres=# CREATE DATABASE book_store;
CREATE DATABASE
postgres=# \l
데이터베이스 목록
이름    |  소유주  | 인코딩 |     Collate      |      Ctype       |      액세스 권한
------------+----------+--------+------------------+------------------+-----------------------
book_store | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 |
postgres   | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 |
template0  | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 | =c/postgres          +
|          |        |                  |                  | postgres=CTc/postgres
template1  | postgres | UTF8   | Korean_Korea.949 | Korean_Korea.949 | =c/postgres          +
|          |        |                  |                  | postgres=CTc/postgres
(4개 행)
postgres-# root@LAPTOP-JJPVHET9:~#
postgres-# \c template1
접속정보: 데이터베이스="template1", 사용자="postgres".
template1-# DROP DATABSE book_store

 root@LAPTOP-JJPVHET9:~# cp test test2

template1=#
template1=# \q

postgres=# \dt
릴레이션(relation) 목록
스키마 |     이름     |  종류  |  소유주
--------+--------------+--------+----------
public | develop_book | 테이블 | postgres
(1개 행)

postgres=# INSERT INTO develop_book VALUES(1, '2019-12-17',mongoDB');
postgres'# INSERT INTO develop_book VALUES(1, '2019-12-17','mongoDB');
postgres'# INSERT INTO develop_book VALUES(1, '2019-12-17','mongoDB');
postgres'# INSERT INTO develop_book VALUES(1, '2019-12-17','mongoDB');
postgres'# \q
마침은 Ctrl-C
postgres'# \q
postgres=#  INSERT INTO develop_book values(1, '2019-12-17', 'mongoDB');
INSERT 0 1

postgres=# SELECT * FROM develop_book;
book_id |    date    |  name
---------+------------+---------
1 | 2019-12-17 | mongoDB
(1개 행)
postgres=# INSERT INTO develop_book VALUES(2, '2019-12-25','"자바"');
INSERT 0 1
postgres=# INSERT INTO develop_book VALUES(2, '2019-12-25','"자바"');
INSERT 0 1
postgres=#  INTO develop_book VALUES(2, '2019-12-25',"'자바');
postgres"#  INTO develop_book VALUES(2, '2019-12-25',"'자바'");
postgres"# \q
마침은 Ctrl-C
postgres"# \q
postgres=# \e
INSERT 0 1
postgres=# SELECT * FROM develop_book;
book_id |    date    |   name
---------+------------+----------
1 | 2019-12-17 | mongoDB
2 | 2019-12-25 | "자바"
2 | 2019-12-25 | "자바"
3 | 2020-01-03 | HTML/CSS
3 | 2020-01-03 | HTML/CSS
(5개 행)
postgres=# INSERT INTO develop_book VALUES(5, '2020-01-24','');
INSERT 0 1
postgres=# INSERT INTO develop_book VALUES(6, '2020-02-04','c언어++');
INSERT 0 1
postgres=# INSERT INTO develop_book VALUES(6, '2020-02-04','c언어++');

postgres=# select * from develop_book LIMIT 5;
book_id |    date    |   name
---------+------------+----------
1 | 2019-12-17 | mongoDB
2 | 2019-12-25 | "자바"
2 | 2019-12-25 | "자바"
3 | 2020-01-03 | HTML/CSS
3 | 2020-01-03 | HTML/CSS
(5개 행)

postgres=# select * from develop_book LIMIT 6 OFFSET 1;
book_id |    date    |   name
---------+------------+----------
2 | 2019-12-25 | "자바"
2 | 2019-12-25 | "자바"
3 | 2020-01-03 | HTML/CSS
3 | 2020-01-03 | HTML/CSS
4 | 2020-01-24 | Python
5 | 2020-01-24 |
(6개 행)

postgres=# select * from develop_book ORDER BY book_id ASC;
book_id |    date    |   name
---------+------------+----------
1 | 2019-12-17 | mongoDB
2 | 2019-12-25 | "자바"
2 | 2019-12-25 | "자바"
3 | 2020-01-03 | HTML/CSS
3 | 2020-01-03 | HTML/CSS
4 | 2020-01-24 | Python
5 | 2020-01-24 |
6 | 2020-02-04 | c언어++
6 | 2020-02-04 | c언어++
(9개 행)

postgres=# select * from develop_book ORDER BY date,name;
book_id |    date    |   name
---------+------------+----------
1 | 2019-12-17 | mongoDB
2 | 2019-12-25 | "자바"
2 | 2019-12-25 | "자바"
3 | 2020-01-03 | HTML/CSS
3 | 2020-01-03 | HTML/CSS
5 | 2020-01-24 |
4 | 2020-01-24 | Python
6 | 2020-02-04 | c언어++
6 | 2020-02-04 | c언어++
(9개 행)
postgres=# SELECT * FROM develop_book WHERE book_id = 1;
book_id |    date    |  name
---------+------------+---------
1 | 2019-12-17 | mongoDB
(1개 행)

→ 식별자 조회

SELECT * FROM develop_book WHERE'2019-12-17' = (SELECT date FROM develop_book WHERE book_id =1); 

select의 동작은 행을 하나하나보고 where절의 조건이 참인지를 확인

UPDATE - where book_id =2
UPDATE develop_book SET name = 'Java' WHERE book_id =2
RETURNING *;

name을 자바로 어떤레코드의 칼럼>? where절
book id가 2인 경우
where가 없어지면?

postgres=# DROP TABLE develop_book;
DROP TABLE

postgres=# CREATE TABLE develop_book(
book_id INTEGER, date DATE,
name VARCHAR(80)

https://dbeaver.io/download/

postgres=# CREATE TABLE develop_book(book_id NUMERIC(6), date INTEGER, name VARCHAR(80));
CREATE TABLE

varchar(n) n이하 문자의 길이 그대로 저장 , n미지정시 임의의 길이 모든 문자열 

char(n) 문자길이 + 공백 형태로 n을 맞추어

-postgres에서는 길이

TIMESTAMP TIMESTANPTZ DATE TIME
우리나라는 utc보다 +9시간
CREATE TABLE datetime_study(
type_ts TIMESTAMP
type_tstz TIMESTAMPTZ
type_date DATE

SHOW TIMEZONE;
SET TIMEZONE ='America/Los_Angeles'; timezone string

JSON형 / JSONB

입력한 텍스트의 정확한 사본 저장 입력이 비교적빠르지만 처리 속도가 느림
JSONB텍스트를 이진 형태로 분해 후전장 입력이 비교적느리지만 처리속도가 빠름

JOSON구조

{”키값” : “밸류값”}

{”키값”: “밸류값”, “키 값” :{”키 값”:”밸류값”}

cast 연산자

cast (표현식 AS 바꿀 데이터 타입)

SELECT CAST(’3000 AS INTEGER);

cast형 연산자

표현식 :: 바꿀데이터 타입

무결성

데이터베이스 내에 정확하고 데이터만을 유지시키는 속성
CRUD수행시 데이터 갑을 일관되고 정확하게 유지
금액칼럼에는 문자및 기호를 입력 할 수 없게 한다

1.개체 무결성

모든 테이블이 프라이머리키 NULL값 허용안됨
데이터를 구분하는 고유한 정보

2.참조 무결성

외래키 값이 빈 값이거나 참조된 테이블의 기본 키 값과 동일

3.범위 무결성

사용자가 정의한 도메인내에서 관계형 데이터베이스의 모든 열을 정의하도록 규정

무결성을 유지하기 위해 칼럼 값을 제한해야한다

not null 빈값을 허용하지 않는 조건 
DROP TABLE IF EXISTS contact_info;
CREATE TABLE contact_info(
cont_id NUMERIC(3) NOT NULL,
name VARCHAR(15) NOT NULL,
tel INTEGER[] NOT NULL,
Email VARCHAR);
INSERT INTO contact_into(email) values('example@naver.com')

UNIQUE유일한 값을 가져야하는 조건

DROP TABLE IF EXISTS contact_info;

CREATE TABLE contact_info(
cont_id NUMERIC(3) NOT NULL,
name VARCHAR(15) NOT NULL,
tel INTEGER[] NOT NULL,
Email VARCHAR);
INSERT INTO contact_into(cont_id, name, tel, email) values(001,'example@naver.com');

프라이머리키

-unique not null

외래키

보통FK로 표현 다른 테이블의 고유한값 참조

UNIQUE,PK

부모테이블이 자식테이블보다 먼저 생성
참조된 컬럼이 자식 테이블에 입력가능
모두 프라이머리 키 unique 제약 조건

CREATE TABLE subject (
subj_id numeric(5) NOT NULL PRIMARY KEY,
subj_name VARCHAR(60) NOT NULL);
INSERT INTO subject
values
(00001,'mathemarics'
0002,'sicentics')
CREATE TABLE teacher(
teac_id NUMERIC(5) NOT NULL PRIMARY KEY,
teac_name VARCHAR(20) NOT NULL.
subj_id NUMERIC(5) REFERENCES suject,
teac_certifi_date DATE);

참조테이블의 칼럼명과 같은경우 테이블명만 입력

CREATE TABLE subject (
subj_id numeric(5) NOT NULL PRIMARY KEY,
subj_name VARCHAR(60) NOT NULL);
INSERT INTO subject
values
(00001,'mathemarics'
 0002,'sicentics')
CREATE TABLE teacher(
teac_id NUMERIC(5) NOT NULL PRIMARY KEY,
teac_name VARCHAR(20) NOT NULL.
subj_id NUMERIC(5) REFERENCES suject,
teac_certifi_date DATE);
INSERT INTO teacher values (00011,'정선생',00001,'2017-03-11');
INSERT INTO teacher values (00021,'홍선생',00001,'2017-04-12');
INSERT INTO teacher values (00031,'박선생',00001,'2017-04-13');
INSERT INTO teacher values (00041,'한선생',00001,'2018-05-20');
SELECT * FROM teacher_table;

CREATE TABLE subject (
subj_id numeric(5) NOT NULL PRIMARY KEY,
subj_name VARCHAR(60) NOT NULL,
stud_count NUMERIC(20) NOT NULL);
INSERT INTO subject
values
(00001,'mathemarics',60),
 (00002,'scientics',42),
 (00003, 'programin',7');
CREATE TABLE teacher(
teac_id NUMERIC(5) NOT NULL PRIMARY KEY,
teac_name VARCHAR(20) NOT NULL,
subj_code NUMERIC(5) NOT NULL,
subj_name VARCHAR(60) NOT NULL,
teac_certifi_date DATE NOT NULL,
FOREIGN KEY(subj_code,subj_name) REFERENCES subject(subj_id,subj_name));

on DELETE NO ACTION

디폴트 - 변수를 초기화할때 기본값

on delete no action
on delete restrict

지우면 안되는경우


on delete set null
on delete 
CREATE TABLE order_info(
order_no INTEGER NOT NULL PRIMARY KEY, cust_name VARCHAR(100), price MONEY, order_qty INTGER CHECK(order_qty >0)

안전하게

REATE TABLE BOOK_info(id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(20) NOT NULL);

INSERT INTO book_info VALUES(1, 'POSTGRESQL'),(2,'MONGODB');
ALTER TABLE book_info
ADD COLUMN PUBLISHED_DATE DATE;

SELECT * FROM BOOK_INFO;

ALTER TABLE BOOK_INFO

ADD COLUMN NULL_TEST DATE NOT NULL;

CREATE TABLE book_info (
book_id INTEGER NOT NULLL PRIMARY KEY,
book_name VARCHAR(20) NOT NULL UNIQUE);
INSERT INTO book_info VALUES
(1, 'POSTGRESQL'),
(2, 'MONGDB');

CREATE TABLE librarfy(
id INTEGER NOT NULL,
book_name VARCHAR(20) NOT NULL REFERENCES book_info)(book_name));
insert into library values
(1, '국립도서관', 'postgresql');

ALTER TABLE book_info DROP COLUMN book_name;

CASCADE

라이브러리에 있는 북네임이 삭제됨
ALTER TABLE 테이블 이름
RENAME 기존컬럼이름 TO새컬럼이름;

RENAME COLUMN 기존컬럼이름 TO 새컬럼이름;

CREATE TABLE book_info (
book_id INTEGER NOT NULL PRIMARY KEY,
book_name VARCHAR(20) NOT NULL UNIQUE);
INSERT INTO book_info VALUES
(1, 'POSTGRESQL'),
(2, 'MONGDB');

CREATE TABLE library(
id INTEGER NOT NULL,
book_name VARCHAR(20) NOT NULL REFERENCES book_info(book_name))
    insert into library values
    (1, '국립도서관', 'postgresql');

    ALTER TABLE book_info RENAME book_name TO NAME;
    SELECT * FROM book_info;
ALTER TABLE 테이블이름
ALTER COLUMN 컬럼이름 DROP 

PK추가

ALTER TABLE 테이블이름
ALTER CLOUMN 컬럼이름 TYPE 새로운 데이터 타입
ALTER CLOUMN 컬럼이름 
CREATE TABLE water(
id SMALLINT NOT NULL PRIMARY KEY,
name TEXT NOT NULL,
location_no VARCHAR NOT NULL,
description TEXT);
INSERT INTO water VALYES(01,'천지','02','백두산 천지');
ALTER TABLE water
ALTER COLUM id TYPE INTEGER,
ALTER COLUM description TYPE VARCHAR;
ALTER TABLE water
ALTER TABLE location_no TYPP INTEGER;

ALTER TABLE location_no TYPE INTEGER USING LOCATION_NO::INTEGER;
SELECT 기준년도, 학교명, 졸업남자수, 졸업여자수
FROM graduates
WHERE 학교급명 = '특수학교' AND (졸업남자수 + 졸업여자수) >= 25;
SELECT 학교명, 지역명, 100*(취업남자수 + 취업여자수)/(졸업남자수+졸업여자수) AS 취업률
FROM graduates
WHERE EXTRACT (YEAR FROM 기준년도) =2015
AND (졸업남자수 + 졸업여자수) >0
AND 100*(취업남자수+취업여자수)/(졸업남자수+졸업여자수)>=50;
SELECT 기준년도,학교명,졸업남자수,졸업여자수,
CASE
when (졸업남자수 + 졸업여자수) =0 then 0
when (졸업남자수 + 졸업여자수) >0 then 100*(진학여자수+진학남자수)/(졸업여자수+졸업남자수)
END 진학률
FROM graduates
where 지역명 like '%고양시 일산%'
ORDER BY 진학률 DESC;
profile
개발 메모창고

0개의 댓글