SELECT
b.BOOK_ID as BOOK_ID ,
a.AUTHOR_NAME as AUTHOR_NAME,
DATE_FORMAT(b.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK b
LEFT JOIN AUTHOR a ON b.AUTHOR_ID = A.AUTHOR_ID
WHERE b.CATEGORY = '경제'
ORDER BY b.PUBLISHED_DATE ASC;
JOIN에는 여러가지 JOIN 방식이 있다. LEFT, RIGHT, OUTER, INNER, UNION 등..
OUTER JOIN은 두 테이블의 합집합을 의미한다. 그러나 WHERE을 이용하여 두 집합의 교집합을 제외한 나머지를 구할 수 있다.
SELECT * FROM TableA A LEFT JOIN TableB B
UNION
SELECT * FROM TableA A RIGHT JOIN TableB B
WHERE A.key IS NULL OR B.key IS NULL
MySQL은 FULL OUTER JOIN을 지원하지 않는다. 그래서 RIGHT JOIN과 LEFT JOIN을 이용하여야 한다.
SELECT * FROM TableA A LEFT JOIN TableB B
UNION
SELECT * FROM TableA A RIGHT JOIN TableB B
RIGTH와 LEFT JOIN은 A와 B 테이블이 A + A와 B의 같은 KEY 값을 더한 결과를 리턴하는 것이 LEFT이고 반대는 RIGHT이다.
그림을 보면
이는 A테이블과 B 테이블을 조인한 후 조건으로 A와 B의 같은 키 값을 얻도록 하여 A테이블과 합친 것이다.
SELECT *
FROM TableA A
LEFT JOIN TableB B ON A.key = B.key;
이는 B테이블과 A 테이블을 조인한 후 조건으로 B와 A의 같은 키 값을 얻도록 하여 B테이블과 합친 것이다.
SELECT *
FROM TableA A
RIGHT JOIN TableB B ON A.key = B.key;
위 그림 처럼 두 테이블의 교집합을 죄외한 값을 얻고 싶다면 LEFT, RIGHT 조인에 WHERE 조건을 주어 sql문을 짜면 된다.
SELECT *
FROM TableA A
LEFT JOIN TableB B ON A.key = B.key
WHERE B.Key IS NULL;
이 sql문이 순수 A만 얻고 싶은 sql문이다.
SELECT * FROM TableA A RIGHT JOIN TableB B ON A.key = B.key
WHERE A.Key IS NULL;
이 sql문이 순수 B만 얻고 싶은 sql문이다.
그냥 JOIN 명령을 쓰면 원하는 결과가 나오지 않을 경우가 있다. 예를 들어
id name department_id
---------------------------
1 John 1
2 Jane 2
3 Bob 1
4 Alice NULL
id name
------------
1 Sales
2 Marketing
3 Engineering
이렇게 employees 테이블과 departments 테이블이 있을 때 JOIN 명령어만 사용하면 아래의 결과가 나온다.
SELECT employees.name, departments.name
FROM employees JOIN departments
ON employees.department_id = departments.id;
name name
-------------
John Sales
Jane Marketing
Bob Sales
이렇게 하면 부서가 존재하는 사람만 조회가 되고 부서가 없는 Alice는 조회가 되지 않는다. 그러나 Alice를 조회하기 위해서는 LEFT JOIN을 이용하면 된다.
SELECT employees.name, departments.name
FROM employees LEFT JOIN departments
ON employees.department_id = departments.id;
name name
-------------
John Sales
Jane Marketing
Bob Sales
Alice NULL
Alice는 이제 부서 이름에 대한 NULL 값과 함께 결과 집합에 포함된다. 직원이 없는 부서를 포함하여 모든 부서를 포함하려면 RIGHT JOIN을 대신 사용할 수 있습니다.
따라서 JOIN만을 쓰면 원하는 결과를 도출하기 어려울 수 있으며, 연관관계가 없는 데이터를 조회할 때 조회가 되지 않아 적절하게 JOIN 명령어를 사용해야 한다.
참고
https://chlgpdus921.github.io/basecamp/MySQL-JOIN/#reference