오늘 사용할 데이터 입니다
user 와 post 두가지로 연습해볼거고,
post의 경우는 user_id를 가지고 와서 작성이 되었습니다
연결이 되어있는 부분이 있을 경우
같은 데이터가 있는 경우
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로 연결되어 있는 경우를 봈고,
다른 경우를 보기위해서 데이터를 조금 변경하고 갈게요
이처럼 유저의 패스워드를 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
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의 경우 일치하는 부분만 가지고 오는 걸 확인 할 수 있습니다
LEFT JOIN과는 반대로 table2의 데이터는 전부 가지고 오지만
table1의 경우 조건에 만족하는 데이터만 가지고 옵니다
SELECT * FROM users RIGHT ( OUTER ) JOIN posts ON users.password = posts.id;
SELECT * FROM users RIGHT JOIN posts ON users.password = posts.id\G;
이정도면 감이 오실거같은데
일치하는 경우 데이터를 가지고 오고 일치하지 않는 데이터는
양쪽에서 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값을 포함한 데이터로 가지고 옵니다.