본문 바로가기
Data/MySQL

[MySQL] 여러 테이블을 합쳐 하나의 테이블처럼 보이게 하는 조인의 종류(join)

by prinha 2020. 12. 31.
반응형
반응형

 

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);

 

 

 

 


출처 및 참고

dlwjdcks5343.tistory.com/56

gbs1995.tistory.com/59

www.tcpschool.com/mysql/mysql_multipleTable_join

www.codeit.kr/learn/courses/sql-database-for-developers/3221

galid1.tistory.com/110

반응형