오늘은 책의 마지막장 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
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;
CROSS JOIN의 경우일때나, 아니면 조건에 맞는 레코드가 여러개일 때 예시이다.
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;
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으로 붙일 수 있다.
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;
지금까지 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.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;