본문 바로가기

백엔드 기술/DataBase

SQL - JOIN 키워드

< SQL - JOIN > 키워드 : 테이블 간의 관계를 나타내는 키워드.

JOIN 키워드를 사용하면 여러 테이블에서 관련 정보를 더 분석 및 조합 할 수 있다.
특히 관계형 데이터베이스에서 중요한 부분인데,
이는 데이터가 여러 테이블에 분산되어 있고, 각 테이블이 서로 다른 방식으로 연관되어 있기 때문이다.
SQL의 JOIN 명령은 이러한 관계를 사용하여 데이터에 대한 복잡한 질의를 수행할 수 있다.

1. LEFT JOIN

왼쪽 테이블(기준_테이블)의 모든 행과 오른쪽 테이블(대상_테이블)의 일치하는 행을 반환한다.
일치하는 행이 없는 경우, 왼쪽 테이블의 결과 집합에는 NULL 값이 포함되어 반환된다.

 

SELECT 결과에 포함될 컬럼

FROM 데이터를 가져올 테이블(기준_테이블)

LEFT JOIN 데이터를 가져올 테이블과 합칠 테이블(대상_테이블)

ON 기준_테이블과 대상_테이블의 결합 조건

 

<예제>

<Customer 테이블>

CustomerId CustomerName
1 John
2 Emma
3 Lisa

<Order 테이블>

OrderId CustomerId OrderDate
101 1 2023-05-15
102 2 2023-05-16
103 1 2023-05-18

 

고객별로 주문한 정보를 가지고올 때.

 

SELECT Customers.CustomerName, Orders.OrderId, Orders.OrderDate
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerId = Orders.CustomerId;

#1. Customer 테이블의 CustomerName과,
Orders 테이블의 OrderId와, OrderDate가
병합된 테이블을 조회한다.
결과로 반환되는 테이블에는 Customers테이블과 Orders테이블의 컬럼들이 포함된다.

 

#2. 기준은 Customers 테이블
(Customer 테이블의 모든 레코드를 포함하는 결과를 반환)

 

#3. 조건 대상은 Orders 테이블


#4. ON 절에서는 Customers 테이블의 CustomerId와
Orders 테이블의 CustomerId 값을 비교하여 일치하는 컬럼만을 합친다.

 

<반환되는 테이블>

CustomerName OrderId OrderDate
John 101 2023-05-15
John 103 2023-05-18
Emma 102 2023-05-16
Lisa NULL NULL


** JOIN 문에서 ON 과 WHERE 차이 **

JOIN에서 ON은 기준_테이블과 대상_테이블의 결합 조건을 정하지만,
WHERE은 두 테이블의 결합 이후 결과 값들을 필터링하는 조건이다.
즉 ON은 JOIN 연산에 포함될지를 결정하는데 사용,
WHERE은 JOIN 연산 이후 최종 결과 값의 결과를 필터링 하는 역.

 

<예제#2 >

SELECT Customers.CustomerName, Orders.OrderId
FROM Customers
LEFT JOIN Orders
ON Customers.CustomersId = Orders.CustomersId
WHERE Orders.OrderDate > '2023-06-22';

위의 쿼리는 Customers의 이름과 OrderId를 반환하지만,
WHERE절로 조건을 걸은대로
2023-06-22 이후에 생성된 주문건들만 가진 CustomersName, OrderId를 반환한다.

 

2. RIGHT JOIN

오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환한다.
일치하는 행이 없는 경우, 오른쪽 테이블의 결과 집합에는 NULL 값이 포함되어 반환된다.

 

SELECT 결과에 포함될 컬럼

FROM 대상_테이블

RIGHT JOIN 기준_테이블

ON 기준_테이블과 대상_테이블의 결합 조건

 

사실상 LEFT JOIN을 다른식으로 표현한게 RIGHT JOIN이라 실제로 자주 사용되지는 않을 듯하다.

3. INNER JOIN

두 테이블 사이에 일치하는 행만 반환. 일치하는 행이 없는 경우 결과가 반환되지 않는다.

 

SELECT 결과에 포함될 컬럼

FROM 기준_테이블

LEFT JOIN 대상_테이블

ON 기준_테이블과 대상_테이블의 결합 조건


<예제>

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

Customer테이블과 Order테이블에서 CustomerId가 일치하는 행만 반환되며
SELECT에서 지정한 CustomerName과 OrderId만 결과에 포함된다.
즉 CustomerId는 결합 조건이 되지만 결과로는 나타나지 않는다.
Customers테이블과 Orders테이블에서 CustomerId가 일치하는 행들 중에
CustomerName, OrderId 만이 결과로 반환된다.

4. FULL JOIN

왼쪽과 오른쪽 테이블의 모든 행을 반환.
일치하는 행이 없는 경우, 왼쪽 또는 오른쪽 테이블의 결과 집합에는 NULL 값이 포함된다.

5. CROSS JOIN

왼쪽 테이블의 모든 행과 오른쪽 테이블의 모든 행의 조합을 생성.

'백엔드 기술 > DataBase' 카테고리의 다른 글

SQL 문제  (0) 2023.07.04
QueryDSL  (0) 2023.05.23
데이터베이스 - SQL, NoSQL, DB 설계  (0) 2023.04.23