Post

TIL(20240930) [데이터베이스/SQL-JOIN]

TIL(20240930) [데이터베이스/SQL-JOIN]

이전에 제대로 이해하지 못했던 JOIN에 대해서 다시 공부를 해보려고 한다. 이번 기회로 확실하게 inner join, outer join(left, right, full) 이해를 해보자!

💡 데이터베이스 JOIN

  • join 이란? 둘 이상의 테이블을 연결해서 데이터를 검색하는 방법을 의미합니다.
  • 연결하려면 테이블이 적어도 하나의 컬럼을 공유하고 있어야 하고, 이 공유하고 있는 컬럼을 PK OR FK값으로 사용해야 합니다.

🚩JOIN 종류

image

  • INNER JOIN : 내부조인-> 교집합
  • LEFT/RIGHT JOIN: 부분집합
  • OUTER JOIN: 외부조인-> 합집합
  • ** 오라클은 OUTER JOIN이 있지만 MYSQL은 없기에 LEFT+RIGHT를 사용

자 그럼 이제 실습해보자

데이터는 고객테이블, 상품테이블이 있다. 고객테이블에 no 이 primary key이며 상품테이블에는 고객테이블의 no의 fk customer_id가 있다.

1
2
3
4
5
6
7
create table customer
(
	no INT,
    name varchar(10),
    join_date date,
    primary key(no)
)
1
2
3
4
5
6
7
8
9
create table product
(
	no INT,
    name varchar(10),
    price INT,
    customer_id INT,
    primary key(no),
    foreign key(customer_id) references customer(no)
)

🚩INNER JOIN

image

위 테이블에서 innerjoin을 한다고 가정했을 때 어떻게 이해할 수 있을까?

select에서 요구한 데이터에 따라 customer과 product에 정확히 매핑되는 데이터만 가져온다.

그래서 다음과 같이 SQL문 명령어를 입력해보았고 결과를 확인할 수 있었다.

1
SELECT c.no, c.name, c.join_date, p.price FROM customer c INNER JOIN product p ON c.no = p.customer_id;

image

🚩LEFT JOIN

image image

LEFT JOIN은 두 가지: 공통된 부분+LEFT에 있는 거만/왼쪽에 있는거만

그래서 첫번째 그림대로 한다면 공통된 부분+LEFT에 있는 데이터를 가져오려고 한다.

1
SELECT c.name, c.join_date, p.price FROM customer c LEFT OUTER JOIN product p ON c.no = p.customer_id;

image

두 번째는 왼쪽에 있는거만

1
SELECT c.name, c.join_date FROM customer c LEFT OUTER JOIN product p ON c.no = p.customer_id WHERE p.customer_id is null;

-> 위와 같은 경우에는 customer과 product가 매핑되어있지 않는 데이터만 불러오게 되는 것

image

🚩RIGHT JOIN

image image

right도 left와 데이터를 가져오는 방식은 같지만 기준이 right라는 것!

첫번째는 공통된 부분+ right에만 있는 데이터 가져오기

1
SELECT p.name, p.price, c.name FROM customer c RIGHT OUTER JOIN product p ON p.customer_id = c.no;

image

두 번째 오른쪽에 있는거만 가져오기

1
SELECT p.name, p.price FROM customer c RIGHT OUTER JOIN product p ON p.customer_id = c.no WHERE c.no is null;

데이터 결과셋이 없다. product에 매핑되어있지 않는 데이터가 없기 때문에

🚩 FULL OUTER JOIN

  • 일단 현재 mariaDB를 사용중인데 mariaDB는 full outer join을 지원하지 않는다.
  • left+right를 혼합하여 union 명령어로 함께 사용해주어야 한다.

참고 DB join정리

This post is licensed under CC BY 4.0 by the author.