[TIL] # 28 SQL문 (2)

ddalkigum·2020년 12월 27일
2

TIL

목록 보기
28/50
post-thumbnail

오늘 사용할 데이터 입니다
user 와 post 두가지로 연습해볼거고,
post의 경우는 user_id를 가지고 와서 작성이 되었습니다

INNER JOIN

JOIN

연결이 되어있는 부분이 있을 경우
같은 데이터가 있는 경우

ForeignKey 사용

ForeignKey로 연결이 되어있을 때 주로 사용해서 데이터를 가지고오는 DQL입니다

JOIN 명령어를 사용하면 INNER JOIN 으로 생각하면 됩니다

INNER JOIN 의 경우 OUTER JOIN과 다르게 table 입력 순서가 중요하지 않습니다

SELECT column_name
FROM table1
( INNER ) JOIN table2
ON talbe1.column_name = table2.column_name

서로 연결이 되어있다면 가지고 온다는 점이
if문과 비슷하다고 생각했습니다

SELECT *
FROM users as u
JOIN posts as p
ON u.id = p.user_id

다른 형식으로 보기

SELECT *
FROM users as u
JOIN posts as p
ON u.id = p.user_id\G

ForeignKey아닌 경우

위의 경우는 ForeignKey로 연결되어 있는 경우를 봈고,
다른 경우를 보기위해서 데이터를 조금 변경하고 갈게요

이처럼 유저의 패스워드를 1이라고 UPDATE를 해주고,

SELECT users.id, users.email, posts.content
FROM users JOIN posts
ON users.password = posts.id;

좀 극단적인 경우긴 한데 ㅋㅋㅋ
패스워드와 post의 아이디가 일치하는 경우를 가지고 왔습니다


OUTER JOIN

OUTER JOIN 중에서 알아볼 것은

LEFT OUTER JOIN

RIGHT OUTER JOIN

FULL OUTER JOIN

세가지입니다

각자의 특징이 존재하지만, 공통적으로 OUTER JOIN의 경우
조건이 만족하는 데이터가 적을수록 속도가 빨라집니다


LEFT JOIN

LEFT ( OUTER ) JOIN

OUTER 는 생략하고 사용 가능합니다

보이는 것과 같이 왼쪽의 데이터는 전부 가지고 오고,
오른쪽은 조건에 만족하는 데이터를 가지고 옵니다

SELECT column_name
FROM table1
LEFT JOIN table2
ON 조건

가지고 오기

SELECT users.id, users.email, posts.content
FROM users LEFT JOIN posts
ON users.password = posts.id;

table1의 내용은 전부 가지고 오고 겹치지 않는 테이블의 경우는
NULL값으로 가지고 왔습니다

table2의 경우는 가지고 오면 table1의 내용이 전부 표시한다음
조건이 맞는 경우를 가지고 오는게 아닌 content에 내용을 표시 해주는걸 볼 수 있습니다

SELECT * 
FROM users
LEFT JOIN posts 
ON users.password = posts.id\G;

다른 형식으로 보게 되어도 유저에 대한 정보는 전부 가지고 오지만
posts의 경우 일치하는 부분만 가지고 오는 걸 확인 할 수 있습니다

RIGHT JOIN

LEFT JOIN과는 반대로 table2의 데이터는 전부 가지고 오지만
table1의 경우 조건에 만족하는 데이터만 가지고 옵니다

SELECT *
FROM users
RIGHT ( OUTER ) JOIN posts
ON users.password = posts.id;

RIGHT JOIN 으로 써도 RIGHT OUTER JOIN 으로 써도 결과는 같습니다

SELECT * 
FROM users 
RIGHT JOIN posts
ON users.password = posts.id\G;


FULL JOIN

이정도면 감이 오실거같은데
일치하는 경우 데이터를 가지고 오고 일치하지 않는 데이터는
양쪽에서 NULL을 포함한 값으로 가지고 옵니다

제가 사용하는 mysql에서는 FULL JOIN을 지원하지 않습니다
UNION을 이용하여 흉내는 낼 수 있습니다

SELECT * FROM users LEFT JOIN posts ON users.password = posts.id
UNION
SELECT * FROM users RIGHT JOIN posts ON users.password = posts.id;

서로가 겹치는 한가지 값을 제외하고는 전부 가지고 오는 걸 확인 할 수 있습니다

겹치지 않는다면 다른 OUTER JOIN과 마찬가지로 NULL값을 포함한 데이터로 가지고 옵니다.


profile
딸기검 -본캐🐒 , 김준형 - 현실 본캐 🐒

0개의 댓글