JOIN은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현해준다.
이러한 조인은 보통 SELECT문과 함께 자주 사용된다.
자식 테이블의 Foreign Key가 부모 테이블의 Primary Key를 참조한다.
(1) 참조를 하는 테이블을 ‘자식 테이블’
(2) 참조를 당하는 테이블을 ‘부모 테이블’
--JOIN
--1. Oracle join : Oracle 제품에서만 사용되는
--2. Ansi Join : 모든 DB에서 사용가능.
--1.1. Oracle join sample
SELECT
FROM table1 a, table2 b
WHERE a.col2 = b.col2
--1.2. Ansi join sample
SELECT a.col1,b.col1
FROM table1 a, [INNER] JOIN table2 b
ON a.col2 = b.col2
LEFT (OUTER) JOIN
-- left outer join
SELECT
ITEM.ID,
ITEM.NAME,
STOCK.ITEM_ID,
STOCK.INVENTORY_COUNT
FROM ITEM LEFT OUTER JOIN STOCK
ON ITEM.ID = STOCK.ITEM_ID;
RIGHT (OUTER) JOIN
SELECT
I.ID,
I.NAME,
S.ITEM_ID,
S.INVENTORY_COUNT
FROM ITEM I RIGHT OUTER JOIN STOCK S
ON I.ID = S.ITEM_ID;
INNER JOIN
SELECT
I.ID,
I.NAME,
S.ITEM_ID,
S.INVENTORY_COUNT
FROM ITEM I INNER JOIN STOCK S
ON I.ID = S.ITEM_ID;
Cartesian Product(카티션 곱)
조인 조건절을 적지 않고(조인 조건 누락) 해당 테이블에 대한 모든 데이터를 모두 가져오는 현상
즉, 조인 쿼리중에 where절에 기술하는 join조건이 잘못되었거나 아에 없을 경우 발생하는 현상
(ANSI SQL에서는 CROSS JOIN이라고도 부름)
A테이블의 row 개수 x B테이블의 row 개수 |
-- 조인조건누락
SELECT *
FROM ITEM JOIN item_new;
SELECT *
FROM ITEM,item_new;
SELECT *
FROM ITEM CROSS JOIN item_new;
SELF JOIN
자기 자신의 테이블을 참조하는 조인 (셀프 X 셀프 조인)
ex) 회사에서 사원의 직속 상사를 찾기 위해 자체 조인..모든 사원에 대해 사원의 이름과 직속 상사의 이름 찾기
SELECT E.EMPNAME, M.EMPNAME
FROM EMPLOYEE E, EMPLOYEE M
WHERE E.MANAGER = M.EMPNO;
E.EMPNAME | M.EMPNAME |
사원 이름 | 직속 상사 이름 |
NATURAL JOIN
두 테이블에서 같은 이름의 컬럼을 찾아 자동으로 조인 조건을 설정하고, INNER JOIN을 해주는 조인
INNER JOIN을 NATURAL JOIN으로 바꾸고, 조인 조건을 나타내는 ON절 삭제
FULL OUTER JOIN
LEFT OUTER JOIN + RIGHT OUTER JOIN을 합치는 조인으로,
두 결과에 모두 존재하는 로우들은 한번만 표현한다. (중복 제거)
Non-Equi JOIN
동등 조건이 아닌 다른 종류의 조건을 사용하여 조인을 하는 방법
SELECT M.EMAIL, M.SIGN_UP_DAY, I.NAME, I.REGISTRATION_DATE
FROM MEMBER M LEFT JOIN ITEM I
ON M.SIGN_UP_DAY < I.REGISTRATION_DATE
ORDER BY M.SIGN_UP_DAY ASC;
USING vs ON
조건 조건을 나타낼 때, 조인 조건으로 쓰인 두 컬럼의 이름이 같으면 ON 대신 USING을 쓸 수 있다.
ON old.id = new.id 와 USING(id) 같은 의미
SELECT OLD.ID, OLD.NAME, NEW.ID, NEW.NAME
FROM ITEM AS OLD INNER JOIN ITEM_NEW AS NEW
USING(ID);
출처 및 참고
www.tcpschool.com/mysql/mysql_multipleTable_join
www.codeit.kr/learn/courses/sql-database-for-developers/3221
'Data > MySQL' 카테고리의 다른 글
[MySQL] 결합 연산과 집합 연산 - UNION, UNION ALL (0) | 2021.01.05 |
---|---|
[MySQL] PRIMARY KEY, FOREIGN KEY 설정하는 다양한 방법 (0) | 2021.01.04 |
[MySQL] WITH ROLLUP - 항목별 합계에 대한 전체 합계 구하기 (0) | 2020.12.21 |
[MySQL] GROUP BY - 그룹핑 / HAVING (0) | 2020.12.15 |
[MySQL] 문자열 관련 함수 (0) | 2020.12.15 |