[ 살펴보기 ] Sql - Join
![[ 살펴보기 ] Sql - Join](https://cdn.hashnode.com/res/hashnode/image/upload/v1719984442358/2da3aa02-8b38-4ec2-95fc-4fd32577c51b.jpeg)
특정 데이터를 기준으로 서로 다른 테이블에서 데이터를 함께 조회할 때 Join을 사용할 수 있다. 만약 users라는 table과 orders라는 table 두 곳에서 특정 user에 대한 정보와 user가 주문한 데이터를 함께 조회해야 할 때 Join을 통해 두 table 모두에서 데이터를 조회할 수 있다. 그리고 이 때 두 테이블 간의 연결 수단으로 흔히 사용되는 것이 Foreign key다
데이터베이스에 users와 orders라는 두 개의 데이터을 만들어 간단한 데이터로 채워 Join의 차이점을 살펴보자
현재 users table에 있는 데이터는 다음과 같다

그리고 orders 테이블에 존재하는 데이터는 아래와 같다. user_id는 user 데이블의 id column에 대한 외래키로 설정되어 있다.

Inner Join
Inner Join은 Join하는 조건을 충족하는 데이터만 검색 결과에 포함한다. 다음 예제를 살펴보자
SELECT users.name as userName, orders.title as orderName
FROM users
INNER JOIN orders
ON users.id = orders.user_id;
위의 예제는 users와 orders 테이블 두 곳에서 필요한 데이터를 검색하며 JOIN의 조건으로 users 테이블의 id와 orders 테이블의 user_id 값이 동일한 행을 검색 결과에 포함시킨다. 즉, 결과는 다음과 같다

Left ( Outer ) Join
두 테이블을 Join할 때 왼쪽에 선언된 테이블의 데이터를 모두 출력하고 오른쪽에 선언된 테이블은 조건에 일치하는 행을 가지고 온다. 만약 오른쪽에 선언된 테이블에 매칭되는 행이 없으면 값을 NULL로 대체되어 들어간다
다음 예제를 살펴보자
SELECT users.name as userName, orders.title as orderName
FROM users
LEFT JOIN orders
ON users.id = orders.user_id;
위의 예제에서는 LEFT JOIN의 대상은 users 테이블이 된다. 즉 users 테이블의 데이터는 모두 출력되고 orders table 중에 조건에 만족하는 데이터가 없다면 NULL로 대체된다. 즉 결과는 다음과 같다

Left 또는 Right Join을 수행할 때 Outer 키워드는 선택사항이므로 위의 예제와 같이 JOIN JOIN만 기입해도 무관하지만 명확성을 중요시 한다면 아래와 같이 OUTER 키워드를 추가해도 무관하다. 쿼리 결과는 OUTER 키워드가 없을 때와 동일하다.
SELECT users.name as userName, orders.title as orderName
FROM users
LEFT OUTER JOIN orders
ON users.id = orders.user_id;
Right ( Outer ) Join
Left Join의 반대되는 역할을 한다. RIGHT JOIN 구문 오른쪽에 오는 table의 데이터를 모두 출력하고 조건에 만족하는 데이터가 없으면 구문 왼쪽 테이블의 출력 데이터를 NULL로 대체된다
SELECT users.name as userName, orders.title as orderName
FROM orders
RIGHT JOIN users
ON users.id = orders.user_id;
위의 예제와 같이 RIGHT JOIN에 대상이 되는 Table을 users로 변경해서 다시 테스트 해보면 결과는 다음과 같다

3방향 Join
만약 세 개의 테이블을 통해 데이터를 검색해야 한다면 Join절을 하나 더 추가하여 작업을 수행한다. 3방향 Join 테스트를 위해 refunds이라는 이름의 table을 하나 더 만들고 다음과 같이 간단히 테이터를 삽입하여 테스트를 해보자

위의 테이블에서 order_id는 order table id column에 대한 외래키이고 user_id는 user table id column에 대한 외래키이다.
위에서 살펴보았던 join 테스트 결과와 더불어 order id에 따라 refunds table의 reason 데이터로 조회하고 싶다면 아래와 같이 처리할 수 있다
SELECT users.name as userName, orders.id as orderId,
orders.name as orderName, refunds.reason as refundReason
FROM users
LEFT JOIN orders
ON users.id = orders.user_id
LEFT JOIN refunds
ON refunds.order_id = orders.id;
그리고 위의 쿼리를 실행한 결과는 다음과 같다

Join에 추가 필터 적용하기
JOIN절과 더불어 추가적으로 검색에 필요한 필터를 추가해야 할 때 다음과 같이 추가 필터를 적용할 수 있다.
SELECT users.name as userName, orders.id as orderId, orders.name as orderName
FROM users
LEFT JOIN orders
ON users.id = orders.user_id
WHERE users.name = 'jake'
위의 쿼리는 users table에 대한 Left Join이후 user name이 jake인 데이터를 추가적으로 필터한다. 위 쿼리에 대한 결과는 다음과 같다

![[ 살펴보기 ] RDB - Relationships](https://cdn.hashnode.com/res/hashnode/image/upload/v1739711556668/48dc9e84-a621-42aa-9c9f-5fc5c436f0ec.jpeg)
![[ 살펴보기 ] MySQL - Data types](https://cdn.hashnode.com/res/hashnode/image/upload/v1739593589113/530f8704-4d27-42c9-a451-bb5c63150b99.jpeg)
![[ 살펴보기 ] TypeORM - Transactions, Migration](https://cdn.hashnode.com/res/hashnode/image/upload/v1739106042581/980b8133-61d4-406a-a026-65be9c28eace.jpeg)
![[ 살펴보기 ] TypeORM - Relations](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666874402/b688bd0b-b6bb-4f43-87d8-c1b46b59f1b7.jpeg)
![[ 살펴보기 ] TypeORM - Basics](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666803591/bef5df17-7dc7-4123-ae55-004d5042df39.jpeg)