테이블을 연결시켜보자!

테이블 연결?

  • primary key로 각 테이블을 연결 시켜서 볼 수 있음
  • 필요한 데이터끼리 잘 묶어서 테이블을 구분 해 둬야 잘 설계된 DB임.. (수정이 필요할때 모든 자료를 다 찾아서 수정하게 되는것을 방지..)

JOIN (Merge)

  • 내가 보는 테이블에 추가로 알고싶은 정보가 담긴 테이블을 가져와서 붙이는것
SELECT 주문.*, 사용자.name
FROM data.orders AS 주문
JOIN data.users AS 사용자
ON 주문.order_id = 사용자.order_id

ON 이 JOIN되는 조건. order_id가 같을때 JOIN 해!

  • 여러개를 JOIN하고싶으면 반복해서 쓰면됨
SELECT O.*, P.category, P.name
FROM data_pre.orders O
JOIN data_pre.products P
ON O.product_id = P.product_id
JOIN data_pre.users U

엑셀의 V-lookup과 굉장히 흡사하구나...!!

JOIN 의 종류

  • INNER JOIN (교집합)
    • 테이블에서 중복되는 항목의 데이터만 가져오는 join
SELECT
FROM table1
JOIN table2

또는
SELECT
FROM table1
INNER JOIN table2
  • FULL (OUTER) JOIN (합집합)
    • 테이블의 모든 데이터를 가져옴
    • 없는 값은 NULL 이 됨
SELECT
FROM table1
FULL JOIN table2

또는
SELECT
FROM table1
FULL OUTER JOIN table2
  • LEFT (OUTER) JOIN
    • 왼쪽 테이블의 데이터(먼저나온것) 를 유지한 채 다른쪽 데이터를 가져옴
SELECT
FROM table1
LEFT JOIN table2

또는
SELECT
FROM table1
LEFT OUTER JOIN table2
  • RIGHT (OUTER) JOIN
    • 오른쪽 테이블의 데이터를 유지한 채 다른쪽 데이터를 가져옴 (LEFT와 방향만 반대)
      • 실제 업무에선 테이블 순서바꿔서 LEFT JOIN 을 주로 사용함
SELECT
FROM table1
RIGHT JOIN table2

또는
SELECT
FROM table1
RIGHT OUTER JOIN table2

ONWHERE의 차이

  • ON에 있는 조건절은 테이블이 JOIN되기 전에 실행됨
  • WHERE에 있는 조건절은 테이블이 JOIN된 후에 실행됨
SELECT o.*, p.category,p.name
FROM `orders` o LEFT JOIN `products` p
ON o.product_id = p.product_id
AND p.category = "Furniture"

ON절은 JOIN전에 실행되기때문에 category가 Furniture인것만 join되었음

SELECT o.*, p.category,p.name
FROM `orders` o LEFT JOIN `products` p
ON o.product_id = p.product_id
WHERE p.category = "Furniture"

WHERE절은 JOIN이후에 실행되기 때문에 Null없이 Furniture인 값만 필터링해서 보여줌. row가 줄었음

JOIN을 할 때엔 내가 필요한 테이블을 잘 고려해서 사용해야합니다!

UNION

  • 테이블을 세로로 붙여주는 것 (아래에)
    • JOIN은 새로운 컬럼이 생기는것
    • UNION은 새로운 로우가 생기는것

JOIN은 로우에 대해 더 깊게 아는것, UNION은 더 넓은 로우를 알수 있게 하는것...? 정도일까?

SELECT *
FROM table1

UNION ALL ---UNION DISTINCT를 쓰면 중복을 제거해줌

SELECT * 
FROM table2
  • 컬럼 명이 다르면 어떻게 될까?
    • 가능!
  • UNION하는 컬럼 수가 다르면 어떻게 될까?
    • UNION 불가능 !
  • 컬럼의 데이터 타입이 다르면요?
    • UNION 불가능 !
  • 컬럼의 수가 같고, 데이터타입이 같은 경우엔?
    • 가능! (다만 데이터는 부정확)
SELECT *
FROM table1

UNION ALL 

SELECT * 
FROM table2

UNION ALL 

SELECT * 
FROM table3

좋은 웹페이지 즐겨찾기