나는 CMD를 이용해서 DB에 접근했다.
어제 했던 것 처럼 psql에 로그인, 어제 추가했던 DB명을 확인하기위해 \l 입력.
다행히 book_store DB가 남아있다 ^^ 휴~
\c DB 체인지 명령문으로 book_store로 변경하고, SELECT 문으로 해당 DB를 참조한다.
psql 에서 ""안의 내용을 칼럼(column)으로 인식
위와같이 문장씩 칠 수 있지만, 아래와같이 한번에 넣을 수도 있다.
LIMIT 반환하는 로우(row)의 개수를 지정
OFFSET 반환하는 로우(row)의 시작지점을 지정
ORDER BY 반환하는 로우(row)를 정렬할 때 사용
WHERE 지정한 로우(row)만 조회 되도록 필터 기능
COM의 메모리 번지는 0부터 시작하기 때문에 OFFSET 1로 설정하면 2번째 부터 시작하게된다.
SELECT*FROM develop_book
ORDER BY book_id DESC;
book_id를 내림차순으로 정리했다!
내림차순으로 참조하는 것도 일회성이다.
※내림차순 영문 : descending order
SELECT*FROM develop_book
ORDER BY date, name;
두가지 동시에 정력 가능하며,
date를 먼저 정리하고, name을 정리한다. 그리고 차순에 대한 정의가 없다면.
default로 설정되는데 ORDER BY는 ASC이다.
SELECT date, name FROM develop_book
ORDER BY 1,2;
SELECT date, name FROM develop_book
ORDER BY 2,1;
해당 명령은 이해를 잘해야 한다.
SELECT할때 순서를 date, name으로 했기때문에 자동지정으로 date=1,name=2가 된다.
여기서 ORDER BY 할 순서로 2,1를 했기 때문에 name먼저 정리 후, date정리를 두번째로 정리한다.
비교 연산자
/= 같다
<> 다르다
/> 크다
< 작다
/>= 크거나 같다
<= 작거나 같다
=
SELECT*FROM develop_book
WHERE book_id = 1;
SELECT date FROM develop_book
WHERE book_id = 3;
SELECT*FROM develop_book
WHERE '2020-01-03' = '2020-01-03';
뭔가 원하는 방향으로 안나온다.22
SELECT*FROM develop_book
WHERE date = '2020-01-03';
SELECT*FROM develop_book
WHERE date = (
SELECT date FROM develop_book
WHERE book_id = 3
);
여전히 이상한걸?333
SELECT*FROM develop_book
WHERE date = (
SELECT date FROM develop_book
WHERE book_id = 2
);
아래 결과와 같이 2개 data에 대해서 오류가 난것이다.
UPDATE 테이블명
SET 컬럼명 = 바꿀 데이터 내용
WHERE 수정할 로우의 조건
RETURNING *; --수정한 내용 바로조회
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
UPDATE develop_book
SET name = 'Java'
WHERE book_id = 2
RETURNING *;
name칼럼을 Java로 바꿀 것이다. 그런데 조건이 있다. 'WHERE book_id = 2'
book_id 가 2인 data만 원한다.
그리고 방금한 작업에 대한 결과를 보고싶다면 'RETURNING *' 을 사용한다.
데이터 테이블을 다시 조회 해보니 방금 UPDATE한 data가 맨 마지막에 위치해 있다.
ALTER TABLE develop_book_2
RENAME TO develop_book;
develop_book_2를 develop_book으로 수정한다.
데이터 테이블 까지 확인해본다.
DELETE FROM 테이블명 WHERE 컬럼명 = 삭제할 데이터의 컬럼 값;
DELETE FROM developbook WHERE book_id = 6;
※ 삭제할 데이터의 컬럼 값을 안넣으면!! 모두 지워진다._
DELETE FROM 테이블명; 으로 끝내면 테이블에 있는 모든 데이터가 삭제된다.
실습위해 다시한번 백업을 만들고 develop_book_2를 지워보았다.
psql(쉘) 혹은 CMD를 이용하여 DB에 접근했었다.
이번에는 pgAdmin4를 이용한 방법을 보인다.
나는 공부중이니 postgres로 비번을 설정하겠다.
※설정이 필요하다면, 브라우저의 server에 우클릭 -> create -> server 후 아래와 같이 설정, 나는 할 필요 없다.
칼럼명 : id, 자료형 INTEGER
칼럼명 : user_id, 자료형 VARCHAR(80)
칼럼명 : user_pw, 자료형 VARCHAR(12)
칼럼명 : register_date, 자료형 DATE
칼럼명 : id, 자료형 INTEGER
칼럼명 : board_user, 자료형 INTEGER
칼럼명 : register_date, 자료형 DATE
칼럼명 : title, 자료형 VARCHAR(30)
칼럼명 : description, 자료형 VARCHAR(3000)
칼럼명 : likes, 자료형 INTEGER
칼럼명 : image_name, 자료형 VARCHAR(50)
CREATE DATABASE community_board;
CREATE TABLE users (
id INTEGER,
users_id VARCHAR(80),
users_pw VARCHAR(12),
register_date DATE
);
CREATE TABLE board (
id INTEGER,
board_user INTEGER,
register_date DATE,
title VARCHAR(30),
description VARCHAR(3000),
likes INTEGER,
image_name VARCHAR(50)
);
CMD에서도 확인가능하다
아래 data를 참조하여 users 테이블에 입력하자
id, user_id, user_pw, register_date
1, Carveinus, car1234, 2020/04/23
2, Jenna, kk3375, 2020/07/12
3, Wlfur, fur0022, 2020/08/31
INSERT INTO users VALUES
(1,'Carveinus','car1234','2020/04/23'),
(2,'Jenna','kk3375','2020/07/12'),
(3,'Wlfur','fur0022', '2020/08/31');
제대로 들어갔는지 확인
아래 data를 참조하여 board 테이블에 입력하자
id, title, description, image_name, register_date, board_user
1, Developer's essay, Perhaps the reason we develop is because of the sense of accomplishment when we create something useful, , 2020-05-02, 1
2, Why the earth is round, I took a picture myself from space and saw that the earth is round, er.png, 2020-09-28, 3
3, Coffee time, I had a vanilla latte this afternoon at the blue signboard cafe on the boulevard., coffee.jpeg, 2020-07-13, 2
4, Chicken is inefficient, This is because fried chicken is more expensive than other chicken dishes., , 2020-08-14, 2
5, When bothering, Let's get someone else to work., , 2020-06-22, 1
insert into board values
(1,1,'2020-05-02','Developer''s essay','Perhaps the reson we develop is because of the sense of accomplishment when we create something useful','0',''),
(2,3,'2020-09-28','Why the earth is round', 'I took a picture myself from space and saw that the earth is round','0','er.png'),
(3,2,'2020-07-13','Coffee time', 'I had a vanilla latte this afternoon at the blue signboard cafe on the boulevard.','0','coffee.jpeg'),
(4,2,'2020-08-14','Chicken is inefficient', 'This is because fried chicken is more expensive than other chicken dishes.','0',''),
(5,1,'2020-06-22','When bothering', 'Let''s get someone else to work.','0','');
UPDATE users
SET user_pw = '4321'
WHERE user_id = 'Carveinus'
RETURNING *;
DELETE FROM develop_book WHERE book_id = 6;
열 | 칼럼 | ||
---|---|---|---|
행 | 으로 부르는 가로를 | 이라고 부르는 세로를 | 이라고 부른다 |
row | 라고 부르기도하며 | ||
레이블 | 이라고 부르기도 한다 |
나타낼 수 있는 수의 법위와 저장용량 사이의 밸런스가 적절함 일반적으로 많이 씀, 숫자 길이 제한 불가.
소수점 자리 표시 가능, p=전체 자릿수, q=소수점 자릿수
예) numeric(6) 면 6자리 숫자만 입력 가능 100,000
부동소수점을 사용, REAL 또는 DOUBLE PRECISION으로 인식
INTEGER기본 값으로 1씩 추가되며
2020-01-09 19:00:00.000
2020-01-09 19:00:00.000(GMT +9)
2020-01-09
19:00:00
19:00:00.000(GMT +9)
CREATE DATABASE timezone;
create table datetime_study (
type_ts timestamp,
type_tstz timestamptz,
type_date date,
type_time time
);
insert into datetime_study(type_ts,type_tstz,type_date,type_time)
values(
'2020-07-26 20:00:25+09',
'2020-07-26 20:00:25+09',
'2020-07-26',
'18:00:00'
);
show timezone;
set TIMEZONE = 'America/Los_Angeles';
show timezone;
timezone이 미국 LA로 설정되어 type_ts 와 type_tstz의 시차가 16시 인것을 알 수 있다.
전세계 서비스 서버라면 UTC로 설정후 각 유저에 따라 TZ를 설정할 것이다.
timezone string 참조
(참조 : https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
true, yes, on, 1
false, no, off, 0
알 수 없는 정보 또는 일부 불확실
입력한 텍스트의 정확한 사본 저장 입력이 비교적 빠르지만 처리 속도가 느림
JSON 구조
{"키 값":"밸류 값"}
우리는 밸류 값을 사용하기 위해 이 구조를 사용한다.
예){"1":"A"} 로 선언하고 JSON{1} 하면 A가 나온다.
{"키 값":"밸류 값", "키 값":{"키 값":"밸류 값"}
}
텍스트를 이진 형태로 분해 후 저장 입력이 비교적 느리지만 처리속도가 빠름
{"키 값":"밸류 값"}
}]{"키 값":"밸류 값"}
}]create table develop_book_order(
id NUMERIC(3),
order_info JSON NOT NULL
);
INSERT INTO develop_book_order(
values
(001,'{"customer":"Jaejin","books":{"product":"product1","qty":2}}'),
(002,'{"customer":"Yunsang","books":{"product":"product2","qty":3}}'),
(003,'{"customer":"Sojung","books":{"product":"product3","qty":1}}')
)
키 값 1: customer
키 값 2: book
키 값 3: qty
CREATE TABLE item_info (
item_id VARCHAR(5),
item_name VARCHAR(40),
production_date DATE,
item_price INTEGER,
factory_num VARCHAR(7)
);
강사님코드
CREATE TABLE prod_info(
prod_no NUMERIC(5),
prod_name VARCHAR(40),
prod_date DATE,
prod_price MONEY,
fact-no NUMERIC(7)
);
CREATE TABLE factory_info (
factory_num VARCHAR(7),
factory_name VARCHAR(45),
place_city VARCHAR(25),
manager VARCHAR(40),
hotline VARCHAR(11),
shipment_product VARCHAR,
founding_date DATE
);
강사님코드
CREATE TABLE factory (
fact_no NUMERIC(7),
fact_name VARCHAR(45),
city VARCHAR(25),
fact_admin VARCHAR(40),
fact_tel NUMERIC(11),
prod_name VARCHAR[],
estab_date DATE
CREATE TABLE item_order (
order_num VARCHAR(6),
user_id VARCHAR(8),
item_order VARCHAR(40),
item_qty VARCHAR(1000),
item_price INTEGER,
order_date DATE
);
강사님코드
CREATE TABLE prod_order (
ord_no NUMERIC(6),
cust_id CHAR(8),
prod_name VARCHAR(40),
qty NUMERIC(1000),
prod_price MONEY,
ord_date TIMESTAMPTZ
);
CREATE TABLE users (
user_id VARCHAR(8),
user_name VARCHAR(40),
phone_num VARCHAR(11),
email VARCHAR(100),
birth_date INTEGER,
identity_verification BOOL
);
강사님코드
CREATE TABLE prod_info (
cust_id CHAR(8),
cust_name VARCHAR(40),
cust_tel NUMERIC(11),
email VARCHAR(100),
birth NUMERIC(6),
identify BOOLEAN
);
SELECT FROM item_info;
SELECT FROM factory_info;
SELECT FROM item_order;
SELECT FROM users;
data 타입을 변환해준다.(자료형 변환)
CAST(표현식 AS 바꿀 데이터) // 표현식 :: 바꿀 데이터 타입
SELECT CAST('3000' AS INTEGER); == SELECT '3000'::INTEGER; // 등호를 기준으로 양쪽 문법은 동일한 기능을 가진다.
3000이라는 문자열을 integer형으로 바꿨다.
데이터베이스 내에 정확하고 유효한 데이터만을 유지시키는 속성
CRUD 수행 시 데이터 값을 일관되고 정확하게 두지하고자 하는것
예) 금액 칼럼에는 문자 및 기호를 입력 할 수 없게 한다.
지키면 좋은점
응용프로그램에서 추가적인 작업을 할 필요가 없다.
단 요즘 트랜드는 FRONT 단에서 제약을 걸고 DB에서는 최소한으로 한다.
개체 무결성
모든 테이블이 프라이머리 키(PK)를 가져야 하며
프라이머리 키로 선택된 칼럼은 고유하고 null값을 허용하지 않아야 한다.
데이터를 구분하는 고유한
정보
참조 무결성
외래 키(FK) 값이 빈(NULL)값이거나 참조된 테이블의 기본 키 값(PK거나 유일한)
과 동이해야 한다.
범위 무결성
사용자가 정의한 도메인(domain) 내에서 관계형 데이터베이스의 모든 열을 저의 하도록 규정
사용자 화면에서 제약조건을 거는 경우가 많음
예) 휴대폰 번호 입력시 숫자만, 비밀번호 입력시 특수문자 제외 등
빈(null) 값을 허용하지 않음
아래와 같이 DATABASE 만들고 (GUI사용 시)
TABLE 만들고
create table contact_info(
cont_id NUMERIC(3) not null,
name VARCHAR(15) not null,
tel INTEGER[] not null,
Email VARCHAR not null
);
insert into contact_info(Email) values
('example@naver.com');
유일한 값을 가져야 하는 조건
TO BE CONTINUE... 내일 계속 합시다!