테이블 조인 1

10148 단어 sqlsql

<테이블 추가>

  • member : 회원 정보
  • item : 의류 상품 정보
  • item_new
  • review : 별점, 댓글
  • stock : 재고 수량 정보

📌 Foreign Key 개념

stock 테이블의 item_id 컬럼이 tiem 테이블의 id 컬럼을 참조하는 관계이다.

item_id 컬럼처럼 다른 테이블의 특정 row를 식별할 수 있게 해주는 컬럼을 Foreign Key라고 한다. 우리 말로 외래키라고 한다.

  • 참조를 하는 테이블인 stock 테이블을 자식 테이블
  • 참조를 당하는 테이블인 item 테이블을 부모 테이블

자식 테이블의 Foreign Key가 부모 테이블의 Primary Key를 참조하고 있다. Foreign Key다른 테이블의 특정 row를 식별할 수 있어야 하기 때문에 주로 다른 테이블의 Primary Key를 참조할 때가 많다.


📌 Foreign Key 설정

item_id 컬럼을 Foreign Key로 설정하는 작업이 필요하다.

stock에서 컬럼을 보는 가운데 아이콘을 클릭하여 아래 쪽 Foreign Keys를 클릭하고 이름을 설정해준다.

  • stock 테이블은 참조 하는 테이블
  • item 테이블은 참조 당하는 테이블

stock 테이블의 item_id 컬럼을 item 테이블의 id 컬럼을 참조하는 Foreign Key로 설정하면, item_id 컬럼에 id 컬럼에 없는 이상한 값을 추가하려고 할 때 에러를 발생시켜 엉뚱한 row가 추가되는 걸 막아준다.


📌 LEFT OUTER JOIN / RIGHT OUTER JOIN

JOIN은 서로 다른 테이블을 합쳐 하나로 만드는 것이다.

  1. LEFT OUTER JOIN
SELECT
	item.id,
    item.name,
    stock.item_id,
    stock.inventory_count
FROM copang_main.item LEFT OUTER JOIN copang_main.stock
ON item.id = stock.item_id;
  • LEFT OUTER JOIN은 LEFT OUTER JOIN의 왼쪽에 있는 테이블을 기준으로 오른쪽에 있는 테이블을 합친다.
  • ON 뒤의 기준으로 합친다.

ON item.id = stock.item_id : item 테이블의 id 컬럼의 값과 stock 테이블의 item_id 컬럼의 값을 비교해서 값이 같은 row끼리 가로 방향으로 연결하라.

SELECT문은 JOIN을 통해 생성된 새로운 테이블에서 item 테이블의 id 컬럼과 name 컬럼, stock 테이블의 item_id컬럼과 inventory_count 컬럼을 보여달라는 의미이다.

왼쪽은 item 테이블에 있던 컬럼이고, 오른쪽이 stock 테이블에 있던 컬럼이다.

item_id 컬럼에 NULL이 row들은 item 테이블의 id 컬럼의 값에서 stock 테이블의 item_id 컬럼에는 존재하지 않았던 값을 의미한다.

즉, item 테이블에는 있지만 stock 테이블에는 없는 row는 NULL이 나타난다.

  1. RIGHT OUTER JOIN
SELECT
	item.id,
    item.name,
    stock.item_id,
    stock.inventory_count
FROM copang_main.item RIGHT OUTER JOIN copang_main.stock
ON item.id = stock.item_id;
  • RIGHT OUTER JOIN은 RIGHT OUTER JOIN의 오른쪽에 있는 테이블을 기준으로 왼쪽에 있는 테이블을 합친다.
  • ON 뒤의 기준으로 합친다.


📌 조인할 때 테이블에 alias 붙이기

SELECT
	i.id,
    i.name,
    s.item_id,
    s.inventory_count
FROM copang_main.item AS i RIGHT OUTER JOIN copang_main.stock AS s
ON i.id = s.item_id;

테이블에도 alias를 붙일 수 있다.

그러나 테이블에 alias를 붙일 경우 SQl문에서 테이블 이름이 등장하는 다른 부분들도 다 alias로 바꿔줘야 한다.

item을 i로, stock을 salias를 이용해 변경해주었다.

JOIN을 하는 SQL문은 길이가 꽤 길기 때문에 JOIN과 함께 alias를 자주 사용한다.


📝 컬럼의 alias와 테이블의 alias

컬럼의 alias는 각 컬럼 이름이 실제로 그 alias로 변환되어 보여지게 하기 위한 용도로 쓰인다.

테이블의 alias는 조회 결과에서 보기 위한 게 아닌 SQL문의 전체 길이를 줄여서 가독성을 높이기 위해 사용된다.


📌 INNER JOIN

INNER JOIN은 각 테이블에서 조인 기준으로 사용된 컬럼들의 일치하는 값이 둘 다 존재하는 row들만 합친다. 기준이 되는 테이블은 따로 존재하지 않는다.

두 테이블을 INNER JOIN 하는 과정을 살표보자.

item 테이블의 id 컬럼과 stock 테이블의 ited_id 컬럼의 값이 같은 row들만 합쳐지게 된다.

SELECT
	i.id,
    i.name,
    s.item_id,
    s.inventory_count
FROM copang_main.item AS i INNER JOIN copang_main.stock AS s
ON i.id = s.item_id;


📌 Foreign Key가 아닌 컬럼 기준으로 조인

위에서 다룬 item 테이블과 stock 테이블은 RIGHT OUTER JOININNER JOIN을 한 결과가 같았다. 왜 그럴까 ❓

stock 테이블은 item 테이블에 존재하는 상품의 재고 수를 담고 있고, item 테이블에 있지 않은 상품의 재고 수를 담고 있지는 않기 때문이다.

즉, stock 테이블의 item_id 컬럼이 item 테이블의 id 컬럼을 참조하는 Foreign Key이기 떄문이다.

Foreign Key를 기준으로 조인하면 OUTER JOIN의 결과와 INNER JOIN의 결과가 같을 수 밖에 없다.

하지만 반드시 Foreign Key를 기준으로 조인해야 하는 건 아니다.
Foreign Key가 아닌 컬럼을 기준으로 조인이 가능하다. 그럴 경우 LEFT OUTER JOIN, RIGHT OUTER JOIN, INNER JOIN의 세 가지 결과가 모두 달라진다.


✅ 과제 : Foreign Key와 조인 과제

pizza_price_cost 테이블이 있다.
그리고 각 피자의 판매량 정보가 담긴 sales 테이블이 있다.

이 두 테이블을 조인해서, 각 피자별 판매량을 한꺼번에 보려고 한다.

  1. 조인을 통해 생성된 결과 중에서 pizza_price_cost 테이블의 name 컬럼과, sales 테이블의 sales_volume 컬럼만 조회하라.

  2. 이때 sales_volume 컬럼에는 '판매량'이라는 alias를 붙이고, sales_volume이 NULL인 row의 경우에는 ‘판매량 정보 없음’으로 표시하라.

SELECT 
    p.name,
    COALESCE(s.sales_volume, '판매량 정보 없음') AS '판매량'
FROM pizza_price_cost AS p LEFT OUTER JOIN sales AS s
ON p.id = s.menu_id;

좋은 웹페이지 즐겨찾기