SEQUENCE* ( autoincrement대체 ) and INDEX* ( WHERE서치를 문자열에서 빠르게 내부binary파일생성)
2019. 1. 30. 10:45
총정리
SEQUENCE 정리
- SEQUENCE 만들기 : CREATE SEQUENCE 시퀀스명 (START n);
- 해당테이블의 해당칼럼 default값을 SEQUENCE로 하나씩 꺼내기 : ALTER TABLE + ALTER COLUMN + SET DEFAULT nextval('시퀀스명');
- SEQUENCE를 해당테이블.해당칼럼에 종속시켜 같이 사라지게 하기 : ALTER SEQUENCE 시퀀스명 OWNED BY 테이블명.칼럼명;
- 이제 INSERT INTO 테이블시 SEQUENCE칼럼빼고 값 입력하기
INDEX 정리
- INDEX는 만들기 : CREATE INDEX 인덱스명 ON 테이블명(칼럼명);
- 자주 검색조건에 들어가는 문자열을 WHERE로 서치해도 속도가 빨라진다. 내부 binary tree파일 생성
SEQUENCE
-- PostgreSQL에서는 autoincrement가 없다. 대신 우리는 SEQUENCE를 생성해야한다. SELECT * FROM users; -- users테이블의 (id, name)에서 id는 자동으로 증가하고 name만 넣어도 되도록 해보자. -- 1) 일단은 name만 입력시키는 것은 안된다.( id가 primary key로 not null인데 null이 들어갔다고 나옴) INSERT INTO public.users(name) VALUES ('chojaeseong') -- 2) 먼저, SEQUENCE 생성하기 [ CREATE SEQUENCE table명_적용할칼럼명_seq ] -- 우리는 이미 3명이 차있기 때문에, default로 SEQUENCE 생성시 1로 시작해서 오류가 날것이다. -- [ CREATE SEQUENCE table명_적용할칼럼명_seq START 4; ]로 시작번호도 알려주자. CREATE SEQUENCE users_id_seq START 4; -- 3) ALTER TABLE로 users테이블의 id칼럼의 default value를 SEQUENCE로 SET해주기 -- 만약, SET DEFAULT 9 으로 주면,, 칼럼의 모든 값이 9가 되어버린다. -- 9가 아니라 nextval(' seq name ')이라는 pgSQL의 함수로 SEQUENCE에서 하나씩 꺼내어 대입하는 방식이다. ALTER TABLE public.users ALTER COLUMN id SET DEFAULT nextval('users_id_seq'); SELECT * FROM users; -- 4) 이제 SEQUENCE를 해당 칼럼에 종속시켜 다른데서 안쓰이고, 지울때 같이 지워지도록 설정해준다. ALTER SEQUENCE users_id_seq OWNED BY public.users.id; -- 5) SEQUENCE가 적용된 users테이블의 id값을 주지말고, 다시 name만 입력해보자. -- id칼럼에 autoincrement같은 SEQUENCE가 적용되면, 빼고 INSERT 해줘도 자동으로 증가한다. INSERT INTO public.users(name) VALUES ('chojaeseong') SELECT * FROM users;
INDEX
-- INDEX -- 인덱스는 WHERE 서치를 빠르게 해주는데 유용하다. SELECT * FROM public.users; -- 1) 먼저, id가 아닌 name으로 사람의 검색해보고 걸리는 시간을 우측하단에서 확인해보자. -- 만약 데이터가 엄청 많다면, 많은 시간이 걸릴 것이다. 왜냐하면 normal column이기 때문! SELECT * FROM public.users WHERE name = 'chojaeseong'; -- 12~15msec -- 2) 인덱스는 자주검색하는 문자열(name 등)에 내부적으로 orderd된 index를 주어 직접 문자열 검색안하고도 빠르게 서치가 가능하게 한다. -- 하지만, 인덱스는 공짜가 아니라서, binary tree를 디스크에 저장해야한다. -- 그러므로, 서칭용 칼럼이 아니여서 INSERT나 UPDATE하는 칼럼에는 적용시키면, 느려진다. -- 즉, 자주 검색하는 칼럼에 index를 지정해주고 내부적으로는 파일이 생성될 뿐. -- primary key는 특별한 종류의 index이다. 하지만, id로 검색하진 않는다. -- 검색을 자주하는 name칼럼을 인덱스로 지정해보자. -- [CREATE INDEX 인덱스명(테이블명_칼럼명_index) ON 테이블명(칼럼명);] CREATE INDEX users_name_index ON public.users(name); -- 3) 다시 한번 name으로 사람을 검색해보고 시간을 측정해보자. SELECT * FROM public.users WHERE name = 'chojaeseong'; -- 11 msec까지 나온다. -- 4) 만약, 2개의 칼럼을 동시에 필터링 하는 작업을 자주한다면, 멀티칼럼 인덱스를 생성할 수 있다. -- 마지막 ON 테이블명(칼럼1, 칼럼2) 형식으로 지정해주면 된다. 그러나 필수는 아니다. -- 예시) CREATE INDEX index_name On pulbic.movies(id, user_id) -- 5) 다양한 UPDATE로 인해서, index가 꼬였다면, REINDEX TABLE 인덱스명;을 통해 해준다.
'한의대 생활 > └ PostgreSQL' 카테고리의 다른 글
HAVING* ( group by 결과물의 조건문 ) (0) | 2019.01.30 |
---|---|
DROP * ( with CASCADE ) and VIEW* ( with LOCAL / CASECADE CHECK OPTION ) (0) | 2019.01.30 |
CREAT TABLE*(primary key, references) and INSERT INTO (0) | 2019.01.29 |
JOIN*(3개 테이블) and GROUP BY*(보이지않더라도 key칼럼으로) and ORDER BY (0) | 2019.01.29 |
4. DB 조작해보기(sp_help과 같은코드, JOIN, *JOIN에 JOIN example) (0) | 2019.01.24 |
R 마크다운 팁 + 단축키
2019. 1. 30. 09:22
html로 Knit 할 때 옵션이 항상 헤깔렸는데
Chunk Output in Console
을 선택해야지, 현재 Rmd에 결과안뜨지만 Knit시 결과가 잘나오는 것을 확인chunk 생성 :
Ctrl + Alt + I
knit 단축키 :
Ctrl + Shift + K
주석 :
ctrl+shift+/
(내가 설정함)구역나누기 주석 : Ctrl + shift + R
'빅데이터 관련 프로그래밍 > 단축키' 카테고리의 다른 글
VS code 단축키 정리 (1) | 2019.05.13 |
---|---|
Windows Anaconda Jupyter notebook(주피터 노트북) 홈 디렉토리 변경 방법 (0) | 2019.05.04 |
jupyter notebook 필수 단축키 (0) | 2019.01.28 |
[Pycharm] 단축키 설정 및 한 줄 실행 (0) | 2018.12.30 |
01. 29 식권 대량구매
2019. 1. 30. 09:13
매일 혜화역에서 밥을 사먹어야하다보니
여자친구 부모님이 보내주신 반찬도 다 먹어서
승*선생님의 도움을 받아 서울대병원 식권을 대량구매했다
35장 * 장당 4000원 = 14만원 정듀
한달정도는 식비랑 시간을 아낄 수 있겠다.
필요할때 많이들 도와주셔서 너무감사하다!
'한의대 생활 > 본4 - SNUBI 인턴생활' 카테고리의 다른 글
02. 07 새로운 의료데이터 받기 (0) | 2019.02.09 |
---|---|
02. 01 첫 cdm 스터디 (0) | 2019.02.01 |
01. 24 Pandas세미나 듣고옴 (0) | 2019.01.24 |
01. 23 작성중이던 논문 통계 정리 (0) | 2019.01.23 |
01.14 R세미나 2번째 시간 (0) | 2019.01.14 |
6. [ Kruskal - Wallis test -> Mann-Whiteney test ] 3군이상 하나라도 비정규분포일 때, 비교
2019. 1. 29. 16:04
R markdown
- Kruskal
데이터 가져오기
setwd("C:/Users/is2js/python_da/deep analysis(논문용 설문지 분석)")
table = read.csv('sens_spec_for_r_table.csv', header = T)
head(table)
## Kind.of.medicinal.herbs Sensitivity Specitivity Group
## 1 SA 0.95 1.000 Ph.D. of Herbology
## 2 SA 0.95 1.000 Ph.D. of Herbology
## 3 SA 1.00 0.875 Ph.D. of Herbology
## 4 SA 0.95 0.900 Ph.D. of Herbology
## 5 SA 0.90 1.000 Ph.D. of Herbology
## 6 SA 0.95 0.800 Ph.D. of Herbology
dplyr - filter + 사용자 정의 함수로 약재별로 나누기
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
herb <- function(table, herbname){
a = filter(table, Kind.of.medicinal.herbs == herbname)
return(a)
}
ac = herb(table,"AC")
amc = herb(table, "AMC")
sa = herb(table, "SA")
Kruskal-Wallis Test
- 각 약재별로 kruskal.test(민감도칼럼 ~ 그룹칼럼)
- Kruskal-Wallis test(비모수적 검정)을 사용해야한다. =>
- H0 : 3그룹의 차이가 없다.
# n수가 적어 정규분포 안따르는 비모수검정 -> 3 그룹간의 차이를 검정
# (정규분포를 따르지 않는)AC에 대한 3그룹 민감도 차이가 없다(H0)를 검정
kruskal.test(ac$Sensitivity ~ ac$Group) #p-value = 0.02285
##
## Kruskal-Wallis rank sum test
##
## data: ac$Sensitivity by ac$Group
## Kruskal-Wallis chi-squared = 7.5576, df = 2, p-value = 0.02285
kruskal.test(amc$Sensitivity ~ amc$Group) #p-value = 0.3188
##
## Kruskal-Wallis rank sum test
##
## data: amc$Sensitivity by amc$Group
## Kruskal-Wallis chi-squared = 2.2864, df = 2, p-value = 0.3188
kruskal.test(sa$Sensitivity ~ sa$Group) #p-value = 0.3099
##
## Kruskal-Wallis rank sum test
##
## data: sa$Sensitivity by sa$Group
## Kruskal-Wallis chi-squared = 2.3433, df = 2, p-value = 0.3099
사후검정 - 각 2군씩로 Mann-Whitney test by bonferroni’s method
- “pgirmess” 패키지 - kruskalmc( 민감도칼럼, 그룹칼럼)
- bonferroni’s method란 기존 유의수준(5%)에 nC2 = 2군씩
검정횟수
를 나누어 유의수준을 낮추는 것
#install.packages("pgirmess")
library(pgirmess)
kruskalmc(ac$Sensitivity,ac$Group)
## Multiple comparison test after Kruskal-Wallis
## p.value: 0.05
## Comparisons
## obs.dif critical.dif difference
## KMD-Ph.D. of Herbology 44.75000 44.74725 TRUE
## KMD-Undergraduates 2.22973 27.19549 FALSE
## Ph.D. of Herbology-Undergraduates 42.52027 37.51044 TRUE
kruskalmc(amc$Sensitivity,amc$Group)
## Multiple comparison test after Kruskal-Wallis
## p.value: 0.05
## Comparisons
## obs.dif critical.dif difference
## KMD-Ph.D. of Herbology 23.7916667 44.74725 FALSE
## KMD-Undergraduates 0.4087838 27.19549 FALSE
## Ph.D. of Herbology-Undergraduates 23.3828829 37.51044 FALSE
kruskalmc(sa$Sensitivity,sa$Group)
## Multiple comparison test after Kruskal-Wallis
## p.value: 0.05
## Comparisons
## obs.dif critical.dif difference
## KMD-Ph.D. of Herbology 26.875000 44.74725 FALSE
## KMD-Undergraduates 4.600225 27.19549 FALSE
## Ph.D. of Herbology-Undergraduates 22.274775 37.51044 FALSE
'한의대 생활 > └ R studio 통계적 분석2' 카테고리의 다른 글
CREAT TABLE*(primary key, references) and INSERT INTO
2019. 1. 29. 13:56
정리해보기
- pgSQL에서는 테이블생성시 public. 등의 스키마를 테이블명 앞에 붙힌다( 생략시 default - public. 자동)
- 2번째 테이블 생성부터는, 자신이 필요한 id(PRIMARY KEY)와 칼럼을 입력후 -> 참조 테이블을 고려한다.
1) 참조테이블_id(칼럼명) + 참조테이블의 PRIMARY KEY와 같은 datatype + REFERENCES + 스키마.참조테이블명
2) 이렇게 지정해주면 참조테이블의 PRIMARY KEY는 2번째 테이블의 FOREIGN KEY가 되어버린다 - 1번째 테이블을 먼저 입력한 뒤, 참조테이블인 2번째 테이블에 데이터 입력한다.
1) 이 때, 1번째 테이블의 PRIMARY KEY = 2번째 테이블의 FOREIGN KEY에 없는 값은 입력되지 않는다.
CREATE TABLE
-- CREATE TABLE -- -- 만약 default schema인 public을 사용할 것이라면, public.은 생략해도 된다. -- users테이블을 맨 처음 만들기. CREATE TABLE public.users ( id integer PRIMARY KEY, --사용자가 많다면 *bigint를 사용하면 된다. datatype다음에 PRIMARY KEY를 지정해주면 된다. name character varying(100) NOT NULL, --*pgSQL에서는 varchar(255)가 아니라 character varying(255)로 사용한다. ) -- PRIMARY KEY 지정은, 다 칼럼들 작성하고 난 다음에, CONSTRAINT로 지정해줄 수 있다. -- CONSTRAINT + constraint's name + PRIMARY KEY + (칼럼명) -- ()안에는 여러개의 primary key를 지정해 줄 수 도 있다. CREATE TABLE public.users ( id integer, name character varying(100) NOT NULL, CONSTRAINT users_id_pkey PRIMARY KEY (id) ) -- 그러나 *** 추천 ***은 칼럼 만들때 지정해주는 것이다. CREATE TABLE public.users ( id integer PRIMARY KEY, name character varying(100) NOT NULL ) SELECT * FROM users -- videos 테이블 만들기 -- 1) videos에 필요한 칼럼들 먼저 넣기 CREATE TABLE public.videos ( id integer PRIMARY KEY, name character varying(255) NOT NULL ) -- 2) *** users 테이블과 연관관계를 고려하여, 어떤사람이 업로드 했는지 id가 필요함. -- *** id와 users_id가 상관관계가 있으니 라인을 비슷한데 두자. -- (1) user_id는 users 테이블과 같은 datatype을 가져야할 것이다. CREATE TABLE public.videos ( id integer PRIMARY KEY, user_id integer, name character varying(255) NOT NULL ) -- (2) user_id는 users 테이블의 id만 들어갈 수 있어야한다.****** -- users 테이블을 참조값만 들어가는 테이블임을 < REFRENCES 스키마.테이블 >로 명시해준다. -- REFERENCES만 정해주면, ***참조테이블의 primay key가 자동적으로 체크된다. CREATE TABLE public.videos ( id integer PRIMARY KEY, user_id integer REFERENCES public.users, name character varying(255) NOT NULL ) SELECT * FROM videos
INSERT INTO
-- INSERT INTO -- -- 1) user table에 넣기 *** video 테이블은 users 테이블을 참조하고 있기 때문에 값을 바로 넣을 수 없다 **** -- 테이블명다음에 블라켓()에 칼럼리스트를 적어줘도 되지만, 생략해도 된다. INSERT INTO public.users(id,name) VALUES (1, 'marysmith'); SELECT * FROM public.users INSERT INTO public.users VALUES (2, 'rolfsmith'); SELECT * FROM public.users INSERT INTO public.users VALUES (3, 'josesalvatierra'); -- 2) videos 테이블은, user_id칼럼이 users테이블의 primaykey를 참조하고 있기 때문에, -- uses테이블을 먼저 채워넣고 ----> 거기에 있는 값만 INSERT INTO 할 수 있다. -- 참조하는 순간 uses테이블의 primary key는 **자동으로 videos테이블의 foreign key가 된다.*** SELECT * FROM public.videos; -- (1) 만약 users테이블에 없는 값을 입력시킨다면, 에러가 난다. INSERT INTO public.videos VALUES (1, 10, 'Test Video'); -- (2) users 테이블의 primary key = videos테이블이 참조해서 foreign key가 된다. INSERT INTO public.videos VALUES (1, 2, 'Test Video'); SELECT * FROM public.videos; -- 3) 이제 2개 테이블을 조인시켜보자. SELECT * FROM public.videos INNER JOIN public.users ON public.users.id = public.videos.user_id; -- 4) users테이블에서 primary key(***자동적으로 NOT NULL적용***)을 -- autoincrementing 로 적용시켜서 -> name만 입력하면 id가 자동으로 올라가도록 해보자.
'한의대 생활 > └ PostgreSQL' 카테고리의 다른 글
DROP * ( with CASCADE ) and VIEW* ( with LOCAL / CASECADE CHECK OPTION ) (0) | 2019.01.30 |
---|---|
SEQUENCE* ( autoincrement대체 ) and INDEX* ( WHERE서치를 문자열에서 빠르게 내부binary파일생성) (0) | 2019.01.30 |
JOIN*(3개 테이블) and GROUP BY*(보이지않더라도 key칼럼으로) and ORDER BY (0) | 2019.01.29 |
4. DB 조작해보기(sp_help과 같은코드, JOIN, *JOIN에 JOIN example) (0) | 2019.01.24 |
3. DB 조작해보기(UPDATE, DELETE, LIKE %_FILTERING*) (0) | 2019.01.23 |