231110 TIL #239 SQL #13 JOIN 심화

김춘복·2023년 11월 10일
0

TIL : Today I Learned

목록 보기
239/543
post-custom-banner

Today I Learned

오늘은 책의 마지막장 JOIN의 심화과정에 대해 공부했다.


JOIN - 2

JOIN의 실행 순서

FROM 테이블A
JOIN 테이블B
ON 결합조건;
  • INNER JOIN과 OUTER JOIN은 결합조건을 적는 구인 ON을 반드시 적는다.

  • 작성 순서는 FROM->JOIN->ON이지만, 실행순서는 FROM->ON->JOIN이다.
    테이블A에 결합조건이 맞는 데이터를 테이블B에서 찾아붙인다.

  • 전체적인 실행순서 ----------------------------------------------------------------------->
    FROM ON JOIN WHERE GROUPBY HAVING SELECT DISTINCT ORDERBY OFFSET LIMIT


WHERE구 같이 쓸 때

productorder 테이블에서 price가 500 이하인 상품의 이름과 단가를 product 테이블에서 가져와라

SELECT a.order_id, b.product_name, b.price
FROM productorder AS a
LEFT JOIN product AS b
ON a.product_id = b.product_id
WHERE a.price <= 500;

  • FROM구>WHERE구>SELECT구 순서로 실행된다.
    JOIN으로 productorder테이블과 product테이블을 붙였지 때문에 WHERE구에서는 어느쪽 테이블의 데이터도 사용할 수 있다.

조건에 일치하는 레코드가 여러개 일 때

CROSS JOIN의 경우일때나, 아니면 조건에 맞는 레코드가 여러개일 때 예시이다.

  • customer 테이블에 대해 productorder 테이블에서 그 고객의 쇼핑 정보를 가져올 때, 쇼핑을 한번도 안한 고객과 여러번한 고객이 있다.
SELECT a.customer_id, a.customer_name, b.order_id
FROM customer AS a
LEFT JOIN productorder AS b
ON a.customer_id = b.customer_id
order by a.customer_id;

  • 위와 같은 경우 조건에 맞는 레코드가 여러개 일 경우 그 레코드를 모두 표시하기 위해 기준이 되는 레코드를 여러번 출력한다.

JOIN으로 여러 테이블을 붙이고 싶을 때

productorder테이블의 customer_id와 일치한 고객 정보를 cusotmer테이블에서 가져온다. 그리고 product_id가 일치한 상품정보를 product 테이블에서 가져온다. 주문id, 고객명, 상품명을 출력해라.

SELECT a.order_id, b.customer_name, c.product_name
FROM productorder AS a
LEFT JOIN customer AS b
ON a.customer_id = b.customer_id
LEFT JOIN product AS c
ON a.product_id = c.product_id;

  • JOIN을 여러번 쓰면 여러 테이블을 붙일 수 있다.

서브쿼리의 결과를 JOIN으로 붙이고 싶을 때

JOIN으로 기존에 존재하는 테이블만 붙일 수 있는게 아니라, 서브쿼리의 결과를 테이블로 가져와서 별명을 붙여 JOIN으로 붙일 수 있다.

SELECT a.customer_id, a.customer_name, b.total
FROM customer AS a
LEFT JOIN
	(
    SELECT customer_id, SUM(price) AS total
    FROM productorder
    GROUP BY customer_id
    ) AS b
ON a.customer_id = b.customer_id;

  • 위처럼 서브쿼리의 결과를 테이블로써 JOIN에 사용할 수 있다.

ON의 조건 (확장)

지금까지 ON의 조건으로 =만 사용했으나 다른 연산자도 사용할 수 있다.
WHERE 구에 적는 조건처럼 똑같이 사용할 수 있다.
단, ON구에 적힌 모든 조건을 만족해야 가져온다.

SELECT a.customer_id, a.customer_name, b.order_id, b.price
FROM customer AS a
LEFT JOIN productorder AS b
ON a.customer_id = b.customer_id
AND b.price >= 500
ORDER BY a.customer_id

  • ON의 조건은 a와 b의 customer_id가 일치한다 와 b의 price가 500이상인 조건 둘 다 AND기 때문에 모두 만족해야 한다. order_id가 5,7일때는 위의 조건을 만족하지 않으므로 NULL이 된다.

USING

ON a.customer_id = b.cusomer_id를 간단하게 USING customer_id로 쓸 수 있다.

  • 사용법
FROM 테이블A
JOIN 테이블B
USING (컬럼명);
  • USING 뒤에 컬럼명을 괄호로 감싸야 한다.

  • 양쪽의 컬럼명이 공통으로 일치해야 사용할 수 있다.

  • MySQL에서는 사용할 수 있지만 DBMS에 따라 사용하지 못할 수도 있다.

  • 위의 '조건에 일치하는 레코드가 여러개 일 때' 에서 쓴 예시에서 ON을 USING으로 대체하면 결과는 똑같이 나오고 좀 더 간단하게 사용할 수 있다.

SELECT a.customer_id, a.customer_name, b.order_id
FROM customer AS a
LEFT JOIN productorder AS b
USING (customer_id)
order by a.customer_id;

profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글