티스토리 뷰

일상코딩/노트

DB : SQLite JOIN

코딩애벌레 2024. 4. 4. 09:19

SQL에서 사용되는 개념인 JOIN은 중요하다 생각해서 따로 포스팅한다. 한 데이터 테이블에 모든 데이터를 저장하면 좋겠지만, 효율이 떨어지게 되고 조회를 할때 생각해야하는 것이 많아진다. 이를 피하기 위해 나눠서 보관하고 호출을 쉽게할 수 있는 방법이 FK(Foreign Key) 호출이다. 바로 배워보자.


먼저 간단한 예시로 User, Artices, Comments가 한 테이블에 있다고 가정해보자

 

만약 DB를 이렇게 관리할 경우 갖고 있는 데이터는 ID, User명, Article, Comment를 확인 할 수 있다. 이 상황에서 어떤 유저가 작성한 게시글을 모두 조회한다면 DQL 명령어로

SELECT * FROM TABLE WHERE User = 'User_Name'; 을 진행할 것이다.

하지만 User가 동명이인이 있다면? 데이터를 조회 했을 때 어떤 User인지 알 수 없다. 즉, 구별할 수 있는 방법이 없다. (물론 User 저장할때 동명이인의 경우 이름 뒤에 임의의 문자열을 추가할 순 있겠지만)

 

그래서 DB를 다룰때, 테이블을 분류해서 저장한다.

마치 체인으로 묶여있는 Column을 표현했다.

 

그림으로 이해하기 어렵다면 표로 다시한번 살펴보자. Id가 같다고해서 같다는 뜻은 아니다, 각 테이블에 해당하는 Id이니 혼돈이 없으면 한다. 

 

위처럼 연결되어있지 않은 테이블에서 묶어보자

 

데이터베이스에 이렇게 저장되어있을 경우 겹치는 문제 없이 User의 고유 Id로 세세하게 조회가 가능하다.

 

이렇게 정리해두면, 유저의 Id를 조회했을때, 어떤 게시글을 썼는지 어떤 댓글을 썼는지 확인 가능할 것이다. 이때 참조해서 만든 id는 외래키(외부에서 불러온 키)라고 생각하면 된다.

외래키를 작성하기 위해 사용하는 SQL 명령어는 FOREIGN KEY, REFERENCES이며 호출은 INNER JOIN, ON을 이용한다.

 

일단 User랑 Article만 묶어보자

 

복잡해보이지만 몇번 만들면 감이 잡힐 것이다. 이렇게 했을 때 db table 결과를 봐볼까?

users table는 변화가없고 articles에는 userId로 설정해둔 것을 확인할 수 있다.

 

그리고 눈썰미가 좋은 분들은 한가지 변화점을 봤을텐데, 3초만 찾아보자.

 


 

혹시 이 은색키는 처음 보지 않는가???

 

커맨드가 입력되어서 캡쳐는 못하지만 마우스 커서를 올려 두면 세부 사항을 확인할 수 있는데, 우측처럼 뜨는 것을 확인할 수 있을 것이다. 연결되어있는 것을 재차 확인할 수 있다.

이번엔 데이터를 생성해보자

 

 

이번에는 조회를 해볼까?

 

INNER JOIN

: 두 테이블에서 값이 일치하는 레코드의 결과만 반환

호출 틀은 위와 같다. 조금 많이 헷갈림!! 

 

호출 틀은 위와 같다. INNER JOIN으로 참조를 열고 해당 테이블의 Foreign Key와 호출하는 테이블의 Primary Key를 비교해서 같은 것만을 출력하겠다는 의미다.

위에서 만들었던 database를 통해 호출해보자.

articles의 기준으로 users의 table에서 외래키 id와 일치하는 데이터를 가져온 것이다. 이를 통해 게시글을 작성한 사람의 이름을 출력할 수 있다

 

FROM 을 통해 articles의 table 데이터를 불러들어와서 전체 호출하는 asterisk( * )을 사용했는데, 실제 조회된 데이터에는 users의 table 데이터도 같이 출력됨을 인지하자!

 

 

LEFT JOIN

: 오른쪽 테이블의 일치하는 레코드와 함께 왼쪽 테이블의 모든 레코드 반환

바뀐거는 INNER에서 LEFT로!
이번에는 B에 해당하지않는 데이터까지 불러왔기 때문에 해당되지 않는 데이터들은 NULL이 할당되어 출력된다

 

 

이럴거면 Table A와 다른게 무엇이냐 할 수 있지만, 다른 예시를 살펴보자. 

아무것도 작성하지 않은 박땡은 NULL 으로 데이터 조회출력이 될 것이다.

 

그렇다면 WHERE을 통해 조건을 추가해준다면?

 

WHERE을 통해 NULL인 사람을 조회했을 경우의 결과다. 즉 게시글을 여태 쓰지 않은 사람을 걸러낼 수 있다. 만약 JOIN을 사용하지 않았다면 일일이 조회해서 체크했어야 할지도 모른다. 심지어 동명이인까지 나온다면 머리가 터진다. 


마치 엑셀 필터 거는 느낌이어서 신기했는데, 이런거보면 데이터를 잘 만지는 사람은 머리가 좋은 것임에 틀림없다. 조건 2-3개만 추가되어도 바로 몸이 멈추는데.. 기회가되면 더 공부해봐야겠다.

'일상코딩 > 노트' 카테고리의 다른 글

Django : REST API 1  (0) 2024.04.11
Django : Many to one relationship  (0) 2024.04.05
DB : SQLite (DDL, DML) 명령어  (0) 2024.04.03
DB : SQLite (DQL) 명령어  (0) 2024.04.02
DB : 데이터베이스  (0) 2024.04.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함