Mysql&DBeaver

DBeaver)저번시간 숙제와 LEFT, RIGHT JOIN

연습노트 2024. 9. 7. 09:34

테이블 여러개 출력할 때 INNER JOIN 쓰면 된다고 했습니다.

그리고 공통점이 있는 행만 필터링하고 싶으면 ON 조건문도 붙이면 된다고 했습니다.

근데 공통점이 없는 행도 함께 출력해보고 싶으면 LEFT JOIN, RIGHT JOIN, OUTER JOIN 쓰면 됩니다. 

 

 

 

▲ 일단 저번 시간에 썼던 program, teacher 테이블에 

id가 이상한 행 1개 씩 추가하고 시작해봅시다. 

 

 

 

 

 

 

왼쪽 테이블 전체 + 공통된 행 출력하고 싶으면 LEFT JOIN

 

그러니까 전에 했던 INNER JOIN 결과 + 왼쪽 테이블 모든 행을 출력하고 싶으면

LEFT JOIN 문법 쓰면 됩니다.

 

 

SELECT * 
FROM program 
  LEFT JOIN teacher
    ON program.강사id = teacher.id 

INNER JOIN 대신 LEFT JOIN과 ON 조건문을 사용해봅시다. 

그럼 INNER JOIN 결과 + 왼쪽 program 테이블의 모든 행이 출력됩니다. 

 

 

 

▲ 진짜 모든 행이 나오는군요. 

왼쪽테이블의 강사id와 일치하는 오른쪽테이블 행이 없는 경우는 NULL 로 채워줍니다.

NULL은 텅 비었다는 뜻임 

 

 

 

 

 

 

오른쪽 테이블 전체 + 공통된 행 출력하고 싶으면 RIGHT JOIN

 

그러니까 전에 했던 INNER JOIN 결과 + 오른쪽 테이블 모든 행을 출력하고 싶으면

RIGHT JOIN 문법 쓰면 됩니다.

 

 

SELECT * 
FROM program 
  RIGHT JOIN teacher
    ON program.강사id = teacher.id 

INNER JOIN 대신 RIGHT JOIN과 ON 조건문을 사용해봅시다. 

그럼 INNER JOIN 결과 + 오른쪽 teacher 테이블의 모든 행이 출력됩니다. 

 

 

 

 

▲ 그렇군요 

 

 

 

그래서 이것들을 어디다 쓰냐고요? 

테이블끼리 합칠 때 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 에선 사용할 수 없습니다.

거기선 LEFT JOIN, RIGHT JOIN 결과를 UNION 연산자로 묶으면 되는데 필요하면 찾아봅시다. 

 

 

 

 

 

▲ 4개의 JOIN 문법들을 그림으로 표현하자면 이런 식입니다. 

CROSS JOIN은 쓸데없어서 안껴줌 

 

 

 

 

 

 

(참고)

LEFT JOIN / LEFT OUTER JOIN

RIGHT JOIN / RIGHT OUTER JOIN

FULL JOIN / FULL OUTER JOIN

같은 뜻이라 대부분의 DBMS에선 혼용해서 사용가능합니다. 

 

 

 

 

오늘의 숙제 : 

 

 

저번강의 숙제에 쓰던 데이터베이스에서 

Q1. 오늘 배운 JOIN문법을 활용해서 매출내역에 없는 상품들을 출력해봅시다.

어떻게할것임

그니까 sales와 공통점이 없는 product 테이블의 행을 출력하면 됩니다.  

 

SELECT *
FROM sales RIGHT JOIN product
ON sales.상품id = product.id 

이러면 INNER JOIN으로 공통점 출력해줌 + product 테이블 행도 전부 출력해줍니다. 

그럼 7번 8번 상품이 sales 테이블엔 없어서 NULL이라고 나오는군요. 

 

뒤에 WHERE 어쩌구 IS NULL 붙여도 될듯

 

[collapse]

 

 

Q2. 매출내역에 없는 고객들을 출력해봅시다.

대가리를 씁니다

 

SELECT * 
FROM sales RIGHT JOIN user_table
ON sales.고객번호 = user_table.id 

이러면 INNER JOIN으로 공통점 출력해줌 + user_table 테이블 행도 전부 출력해줍니다. 

그럼 NULL 나오는 부분 확인가능