2.JOIN _ inner, outer (+ on과 where의 차이)
▤ 목차
✔ INNER JOIN
일치하는 데이터만 나온다. null 값이 있다면 포함하지 않는다.
있는 자료를 기준으로 진행한다.
위의 사진처럼 교집합의 값을 가져온다.
⌨ 형식
SELECT [COLUMN 목록]
FROM [테이블1]
INNER JOIN [테이블2] ON [조인 조건]
WHERE [검색 조건]
💻 코드로 보기
# oracle 방식
SELECT jikwon_no, jikwon_name, buser_name FROM jikwon,buser
WHERE buser_num =buser_no;
SELECT jikwon.jikwon_no, jikwon.jikwon_name, buser.buser_name
FROM jikwon jiktab,buser butab
WHERE jiktab.buser_num =butab.buser_no;
아래 코드처럼 별명을 줄 수 있다.
#anci sql 표준
SELECT jikwon_no, jikwon_name, buser_name
FROM jikwon INNER JOIN buser
ON buser_num =buser_no
WHERE jikwon_gen='남';
👏 정리
inner join 의 조건은 on으로 진행된다.
당연하게 쿼리문을 짜고있다가 질문이 들어오니 생각해보게 된 문제가 있다.
on과 where의 차이이다.
SELF JOIN을 수행하는 경우는?
한 테이블 내에 두 칼럼이 연관 관계가 있는 경우이다.
✔ ON vs WHERE
ON
: JOIN을 하기 전 필터링을 한다. ON 조건으로 필터링이 된 레코들 간의 JOIN이 이뤄진다.
WHERE
: JOIN을 한 후 필터링을 한다. JOIN을 한 결과에서 WHERE 조건절로 필터링이 이뤄진다.
※ 쿼리를 순차적으로 실행된다는 점을 생각하자.
✔OUTER JOIN
⌨ lefr outer join
왼쪽 테이블을 기준으로 join을 시도한다.
오른쪽에는 null이 허용된다.
💻 코드로 보기
SELECT jikwon_no, jikwon_name, buser_name
FROM jikwon LEFT OUTER JOIN buser
ON jikwon.buser_num = buser.buser_no;
👏 중요
왼쪽의 모든 결과를 가져온 후 대응되는 오른쪽 테이블의 데이터를 매칭한다.
왼쪽의 결과를 기준으로 매칭되는 데이터가 없다면 null로 표시된다.
⌨ right outer join
오른쪽 테이블을 기준으로 join을 시도한다.
왼쪽 테이블에 null이 존재한다.
💻 코드로 보기
SELECT jikwon_no, jikwon_name, buser_name
FROM jikwon RIGHT OUTER JOIN buser
ON jikwon.buser_num = buser.buser_no;
'
👏 중요
오른쪽의 모든 결과를 가져온 후 대응되는 오른쪽 테이블의 데이터를 매칭한다.
오른쪽의 결과를 기준으로 매칭되는 데이터가 없다면 null로 표시된다.
⌨ FULL OUTER JOIN
기준 피드의 값과 매치되는 레코드가 어느 한쪽 테이블이라도 있으면 해당 레코드를 가져온다.
다대다 형식으로 join되기 때문에 결과 테이블의 용량이 매우 커질 수 있어
주의해야한다.
💻 코드로 보기
오라클의 방식이 heidiSQL에서 먹히지 않아, union을 사용해서 합쳤다.
SELECT jikwon_no, jikwon_name, buser_name
FROM jikwon LEFT OUTER JOIN buser
ON jikwon.buser_num = buser.buser_no
UNION
SELECT jikwon_no, jikwon_name, buser_name
FROM jikwon RIGHT OUTER JOIN buser
ON jikwon.buser_num = buser.buser_no;
-- full outer join [Oracle 방식]
SELECT jikwon_no, jikwon_name, buser_name
FROM jikwon full OUTER JOIN buser
ON jikwon.buser_num = buser.buser_no;
👏 중요
INNER JOIN과 LEFT/ RIGHT JOIN의 차이가 있나?
있다.
INNER JOIN은 두 테이블 모두에 기준 필드의 값이 존재하는 레코드만 가져온다.
LEFT/ RIGHT JOIN은 한쪽 테이블에 있는 모든 레코드를 가져온 후
다른 테이블에서 필드값과 매치되는 레코드들을 가져온다.
만약 기준 테이블의 필드의 기준 필드 값과 매치되는 값이 오른쪽 테이블에 없으면 NULL을 가져온다.
😊정리
CROSS JOIN과 OUTER JOIN의 차이가 궁금해져 검색을 해보지
CROSS JOIN은 NULL값을 허용하지 않고 OUTER JOIN은 NULL값을 허용한다는 점에서 차이가 있었다.
참고