-
2.JOIN _ inner, outer (+ on과 where의 차이)SQL/sql 문법(mysql, mariaDB) 2024. 5. 6. 15:16
▤ 목차
✔ 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값을 허용한다는 점에서 차이가 있었다.
참고
'SQL > sql 문법(mysql, mariaDB)' 카테고리의 다른 글
subquery _ 상관쿼리( correlated subquery ) (0) 2024.05.08 mariaDB) 내장 함수 정리 (0) 2024.05.07 1. JOIN _ CROSS JOIN, SELF JOIN, EQUI JOIN (0) 2024.05.04 그룹 함수 : GROUP BY 와 HAVING + 복수행 함수(집계함수) (0) 2024.05.03 UNION 코드로 알아보기 (0) 2024.05.02