SQL, 데이터 분석!

SQL, 데이터 분석!

바로 보고 실습하는 SQL, 입문부터 활용까지!

08 PK와 FK(관계 부여하기)

# PK와 FK ## 미션 --- 인스타그램을 참고하여, 사용자-사진-댓글 DB를 만드시오. ![홍팍-SQL-입문-PK와-FK-미션](http://drive.google.com/thumbnail?export=view&sz=w960&id=1RvEkp52Nqh451FROH9RFGrJj27xzw7Dk) ## 개념 --- #### 데이터간 관계를 만드려면 PK와 FK를 연결해야 한다. 여기서 PK(primary key)는 기본키 또는 대표키, FK(foreign key)는 외래키 또는 외부키로 불린다. ![홍팍-SQL-입문-PK와-FK-기본키와-외래키](http://drive.google.com/thumbnail?export=view&sz=w960&id=1S6UhTOkD7K_sHGMrpZGVHdGekcnHBhiH) #### 기본키(PK)는 일종의 주민등록번호다. 보통 "id"로 명명된다. ![홍팍-SQL-입문-유니크](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SEMA-ktv6dWZVOqD-gqycNJBKbGzPN6a) 주민등록 번호는 누구와도 겹치지 않는다. 이러한 성질을 유니크(unique)라 한다. ![홍팍-SQL-입문-유니크](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SBKCdv_COdxTewnM_OW-gpa9ayP0ES65) PK는 다음과 같이 선언할 수 있다. ![홍팍-SQL-입문-기본키-생성-PK](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SElZoOiNmwvK76zO-Ch1hr9_1sKuZqL4) Postgres가 아닌 다른 DBMS는 문법이 약간 다르다. 잘 모를땐? 구글링이 답이다. - "Primary Key Generation for {DBMS}" #### 외래키(FK)는 PK를 가리킴으로써 데이터간 관계를 연결한다. ![홍팍-SQL-입문-외래키-PK](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SGIZHSmhC8gH_A06HObF8YEYDE57YWqA) FK는 다음과 같이 선언한다. ![홍팍-SQL-입문-외래키-FK-생성](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SHM57OB9EfHj1ukZAhFb0diCFpLtfEM3) 자세한 설명은 유튜브 영상을 통해 확인하자. ![홍팍-SQL-입문-더이상-말이-필요-없다](http://drive.google.com/thumbnail?export=view&sz=w960&id=1Nu7x-xbjt3sGns83CSjDXCvQwLsK6V6B) ## 실습 --- #### 테이블 생성 ``` -- users 테이블 CREATE TABLE users ( -- 컬럼명 -- 타입 -- 특성 id SERIAL PRIMARY KEY, -- PK 선언(SERIAL: 자동 생성 타입) nickname VARCHAR(50), email VARCHAR(100) ); -- photos 테이블 CREATE TABLE photos ( id SERIAL PRIMARY KEY, -- PK filename VARCHAR(255), user_id INTEGER REFERENCES users(id) -- FK: 사진 게시자의 PK로 연결 ); -- comments 테이블 CREATE TABLE comments ( id SERIAL PRIMARY KEY, -- PK body VARCHAR(1000), user_id INTEGER REFERENCES users(id), -- FK: 댓글 작성자 photo_id INTEGER REFERENCES photos(id) -- FK: 댓글이 달린 사진 ); ``` #### 레코드 등록 ``` -- users 데이터 등록 INSERT INTO users(nickname, email) VALUES ('cloudstudying_kr', '[email protected]'), ('hongpark_cs', '[email protected]'), ('haesamq', '[email protected]') ; -- photos 데이터 등록 for user #1 INSERT INTO photos(filename, user_id) VALUES -- 1번 유저의 사진 업로드 ('cat-on-road.jpg', 1), ('sunset-over-the-ocean.jpg', 1), ('andromeda-galaxy.jpg', 1), -- 2번 유저의 사진 업로드 ('white-tiger.jpg', 2), ('nero-the-black-cat.jpg', 2) ; -- comments 데이터 등록 INSERT INTO comments(body, user_id, photo_id) VALUES -- 1번 사진의 댓글들 ('meow', 1, 1), -- 유저#1 ('nyaong', 2, 1), -- 유저#2 ('냐옹', 3, 1), -- 유저#3 -- 2번 사진의 댓글들 ('sunset', 1, 2), -- 유저#1 ('falling slowly', 2, 2), -- 유저#2 -- 3번 사진의 댓글들 ('Andromeda galaxy', 1, 3), -- 유저#1 ('mysteriouse..!', 3, 3) -- 유저#3 ; ``` #### 레코드 조회 ``` -- users 조회 SELECT * FROM users; -- photos 조회 SELECT * FROM photos; -- comments 조회 SELECT * FROM comments; ``` ## 훈련 --- #### 다음 테이블을 보고 질문에 답하시오. ![홍팍-SQL-입문-일대다-관계-인스타그램-문제](http://drive.google.com/thumbnail?export=view&sz=w960&id=1SH__aa_Av3bkPKueHahNlqeFRVsK7DIT) - 댓글을 가장 많이 작성한 유저는? - 사진을 게시한 유저는 모두 몇명? - 3번 댓글이 달린 사진은? - 5번 댓글이 달린 사진의 게시자는?