DataBase/SQL

[DB][SQL] Multi Table Queries _ Inner Join

bay07 2024. 4. 2. 14:17

1. 사전준비 

그 전에 만들어 둔 파일들 삭제 

DROP TABLE articles;

 

사전 셋팅으로 테이블 2개 생성하기

CREATE TABLE users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name VARCHAR(50) NOT NULL
);

CREATE TABLE articles (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  title VARCHAR(50) NOT NULL,
  content VARCHAR(100) NOT NULL,
  userId INTEGER NOT NULL,
  FOREIGN KEY (userId) 
    REFERENCES users(id)
);

 

 테이블 생성이 잘 되었는지 sqlite explorer를 통해서 확인해 보기
특이한 점은 articles 테이블에 FOREIGN KEY (userId)

REFERENCES users(id)   부분이다.
이것은 users 테이블에 id필드를 참조하겠다는 의미이다.


2. 각 테이블에 실습 값 넣기 

table에 필드 값 추가 

INSERT INTO 
  users (name)
VALUES 
  ('하석주'),
  ('송윤미'),
  ('유하선');

INSERT INTO
  articles (title, content, userId)
VALUES 
  ('제목1', '내용1', 1),
  ('제목2', '내용2', 2),
  ('제목3', '내용3', 1),
  ('제목4', '내용4', 4),
  ('제목5', '내용5', 1);

값이 잘 들어갔는지 sqlite explorer를 통해서 확인해 보자.
('제목1', '내용1', 1),  이 부분에서 1이라는 값은
'제목1' 이라는 게시글을 작성한 사람은 users.id가 1인 사람이라는 뜻이다.

즉, users 테이블의 pk값이 1인 사람을 말한다.


3. Inner Join을 사용해서, 두 테이블 레코드의 교집합을 살펴보자

SELECT * FROM articles
INNER JOIN users 
  ON users.id = articles.userId;

테이블 2개를 지정 후 ON 키워드에 결합조건을 적었다.
유저 ID를 (User 테이블의 PK 를)
게시글을 작성한 유저 ID와 (article 테이블의 FK와) 연결을 시켰다.
sqlite explorer를 통해서 테이블을 확인해 보자.
 join을 통해서 해당 게시판에 각가의 게시글을 누가 작성 했는지 파악이 가능해 졌다

 


4. PK가 사람 확인해보기 

SELECT articles.title, users.name 
FROM articles
INNER JOIN users 
  ON users.id = articles.userId
WHERE users.id = 1;

게시판에 users 테이블에 PK가 1인 사람이 작성한 게시글을 모두 확인 할 수 있다.
우리는 이제 게시판에 하석주가 작성한 게시글을 모두 볼 수 있다

 

만약에 '하석주'라는 이름을 가진 사람이 이름을 개명하더라도 
users테이블의 pk가 1인 레코드의 값이 '하석주'에서 '달님'으로 바뀌더라도

하석주가 작성한 게시글이라는 내용은 일괄적으로 달님이 작성한 게시글로 바뀔 것이다.
그 이유는 articles 의 articles.userId (FK)는 users테이블의 user.id (PK) 값을 가지고 왔기 때문이다.