테이블을 여러개 출력하고 싶다면 INNER JOIN을 쓰면 된다고하였습니다.
그리고 공통점이 있는 행만 필터링 하고 싶다면 ON을 쓰는 것도 배웠습니다.
근데 공통점이 하나도 없는 테이블을 JOIN 하고 싶다면???
그때는 LEFT JOIN, RIGHT JOIN, OUTER JOIN 을 쓰면 됩니다.
일케 두 테이블이 있습니다.
왼쪽 테이블 전체 + 공통된 행 출력하고 싶으면 LEFT JOIN
그러니까유 지난 시간에 했던 INNER JOIN 결과 + 왼쪽 테이블 모든 행을 출력하고 싶다면 LEFT JOIN 쓰는 겁니다.
SELECT *
FROM program
LEFT JOIN teacher
ON program.강사id = teacher.id
⬆️ 진짜 모든 행이 나오는구만요
왼쪽 테이블의 강사id와 일치하는 오른쪽 테이블 행이 없는 경우는 null 로 채워집니다.
오른쪽 테이블 전체 + 공통된 행 출력하고 싶으면 RIGHT JOIN
방금은 왼쪽으로 합칠때 left 썼죠?? 오른쪽을 기준으로 합치고 싶다면 RIGHT JOIN 를 쓰면 됩니다.
SELECT *
FROM program
RIGHT JOIN teacher
ON program.강사id = teacher.id
⬆️ 그렇군여. teacher 테이블을 기준으로 합쳐졌습니다.
이 쯤 왔으면
??? : 아니 left join 이고 right join이고 다 알겠는데여. 이거 배워서 어따 씀??
흐
ㅁ…
흥미로운 질문이군요
사실 테이블끼리 합칠때 NULL이 발생하는 부분을 미리 찾고 싶을때 사용하는 경우가 많습니다.
보통은
SELECT *
FROM program
LEFT JOIN teacher
ON program.강사id = teacher.id
WHERE 컬럼명 IS NULL
IS NULL 조건은 NULL을 갖고 있는 행만 출력하게 해주는데요.
이렇게 NULL 이 뜨는 내용을 직접 눈으로 확인해서 이상한 점을 바로 잡아줄 수도 있습니다.
FULL JOIN
LEFT JOIN과 RIGHT JOIN을 합치고 싶으면 FULL JOIN 문법을 사용하면 됩니다.
SELECT *
FROM program
FULL JOIN teacher
ON program.강사id = teacher.id
하지만 Mysql, mariadb, sqlite에선 사용불가합니다.
거기서는 FULL JOIN을 안쓰고 LEFT JOIN, RIGHT JOIN 결과를 UNION으로 묶으면 되는데 각자 DB에 맞게 찾아보면 됩니다.
⬆️ 그림을 보면 한번에 이해가 되실겁니다. 그냥 JOIN을 쓴다면 INNER JOIN으로 쓰입니다. CROSS JOIN은 뭐 그냥 빼버렸습니다.
(참고)
LEFT JOIN / LEFT OUTER JOIN
RIGHT JOIN / RIGHT OUTER JOIN
FULL JOIN / FULL OUTER JOIN
같은 뜻이라 대부분의 DBMS에선 혼용해서 사용가능합니다.
실전
저번 시간에 쓴 db에서
Q1. 매출 내역에 없는 상품들을 출력하기
SELECT *
FROM product p
LEFT JOIN sales s
ON p.id = s.상품id
WHERE id IS NULL
Q2. 매출내역에 없는 고객들 출력하기
SELECT *
FROM sales s
RIGHT JOIN user_table ut
ON s.고객번호 = ut.id
WHERE id IS NULL
'DI(Digital Innovation) > DataBase & SQL 뽀개기' 카테고리의 다른 글
데이터 수정 삭제는 UPDATE / DELETE (0) | 2024.03.14 |
---|---|
데이터 넣거나 복사하려면 INSERT (5) | 2024.03.14 |
JOIN 하는게 쉬워보이면 그 분은 이미 전문가 (1) | 2024.03.07 |
국나뇽이 말아주는 엔티티관계도(ERD) (3) | 2024.03.07 |
제 3정규형 차렷 (0) | 2024.02.27 |