TIL # 112 : [SQL] JOIN

셀레스틴 허·2021년 3월 26일
0
post-thumbnail

여러 테이블 JOIN 하기

SELECT *
FROM orders
JOIN customers
  ON order.customer_id = customer_id;
  • 3번째 줄 : orders에서 정보를 customers으로 JOIN을 선언한다
  • 4번째 줄 : orders 테이블의 customer_id column을 customers customer_id column과 합치고 싶다
  • column name 명확하게 구분하기 : column name은 꼭 table_name.column_name으로 명시해야 한다

COMMON 항목 JOIN하기

INNER JOIN

  • FROM과 JOIN과 테이블을 합치되 양쪽 테이블을 비교해 ON 구문 속 조건문과 맞는 row들만 보여준다
  • 비어있는 row 또는 조건과 맞지 않는 row는 삭제한다
  • 교집합!
SELECT COUNT(*)
FROM products;

SELECT COUNT(*)
FROM drinks;

SELECT COUNT(*)
FROM products
JOIN drinks
	ON product.id = drink.id;

LEFT JOIN

  • LEFT JOIN은 INNER JOIN과 다르게 두번째 테이블과 일치하는 row가 있는지 여부와 관계 없이 첫번째 테이블 row를 다 유지한다
  • 두번째 테이블은 조건과 일치하지 않을시 생략된다
  • 왼쪽 합집합!
-- product에 있고, drink에도 없어도 null처리 되는 제품들 
SELECT *
FROM product
LEFT JOIN drink
	ON product.id = drink.id;
  
-- 어떤 product들이 drink 테이블에 없는지 찾기
SELECT *
FROM products
LEFT JOIN drink
	ON product.id = drink.id
WHERE drink.id IS NULL;
-> 해당 제품들은 drink 테이블에 없다는 것을 판별할 수 있다 

PRIMARY KEY && FOREIGN KEY

PRIMARY KEY

  • 절대 NULL이면 안된다
  • 입력된 각 값은 unique하다
  • 각 테이블은 하나 이상의 PRIMARY KEY를 가질 수 없다

FOREIGN KEY

  • 어느 테이블의 PRIMARY KEY가 다른 테이블에 등장할 경우 FOREIGN KEY다

🔑 가장 일반적인 JOIN 유형은 한 테이블의 외래키와 다른 테이블의 프라이머리키를 결합하는 것이다.

-- PRIMARY, FOREIGN KEY를 활용해서 JOIN하기
SELECT * 
FROM products
JOIN orders
  ON product.id = orders.product_id;

COMMON 항목 없어도 JOIN하기

CROSS JOIN

  • 공통 항목이 없어도 테이블의 row들을 모두 합치기!
  • 값들을 나열한 리스트를 각 row마다 비교해야할 때
  • ON 없어도 가능하다 column을 정말 JOINING하고 있지 않기 때문이다
-- 
SELECT drink.type,
   products.flavor
FROM drinks
CROSS JOIN products;
  1. 1-2번째 줄 : drink.type, products.flavor를 선택하고
  2. 3번째 줄 : drink 테이블의 데이터를 가져와
  3. products와 CROSS JOIN을 수행한다

Dataset 쌓기

UNION

  • 똑같은 개수의 column이어야 하며
  • 첫번째 테이블과 똑같은 data type이 같은 순서로 있어야 한다
SELECT * 
FROM drinks
UNION
SELECT * 
FROM products

WITH

  • 독립적인 query를 수행할 수 있다 - aggregation도 가능
  • WITH 구문 안에 있는 모든 column들을 previous results이라는 alias으로 reference한다
    query 결과값을 뽑은 다음에 다른 테이블과 JOIN 해 우리가 원하는 새로운 결과값을 뽑을 수 있다
-- customers의 아이디값을 준다. 하지만 우리는 아이디보다 customers의 이름과 정보를 원한다!
SELECT customer_id,
   COUNT(subscription_id) AS 'subscriptions'
FROM orders
GROUP BY customer_id;

-- customers 테이블과 JOIN 해서 기타 정보를 가지고 온다
WITH previous_results AS (
   SELECT customer_id,
   COUNT(subscription_id) AS 'subscriptions'
   FROM orders
   GROUP BY customer_id;
)
SELECT *
FROM previous_results
JOIN customers
  ON _____ = _____;
profile
Software Developer / 고통은 필연, 괴로움은 선택

0개의 댓글