SQL Join

2023. 4. 8. 10:36·📦 Database/SQL

💡 Join

두 개 이상의 테이블 사이의 컬럼을 기반으로 행을 결합하는데 사용한다.


다양한 유형의 SQL Join

  • (INNER) JOIN : 두 테이블 간 일치하는 값이 있는 레코드 반환
  • LEFT (OUTER) JOIN : 왼쪽 테이블의 모든 레코드를 반환하고 오른쪽 테이블의 일치하는 레코드 반환
  • RIGHT (OUTER) JOIN : 오른쪽 테이블의 모든 레코드를 반환하고 왼쪽 테이블의 일치하는 레코드 반환
  • FULL (OUTER) JOIN : 왼쪽 또는 오른쪽 테이블에 일치 항목이 있는 경우 모든 레코드 반환

image-20230408103512817


Sample Table


Orders 테이블

OrderID CustomerID OrderDate
10308 2 1996-09-18
10309 37 1996-09-19
10310 77 1996-09-20

Customers 테이블

CustomerID CustomerName ContactName Country
1 Alfreds Futterkiste Maria Anders Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Mexico
3 Antonio Moreno Taquería Antonio Moreno Mexico

예시

Order 테이블의 CustomerID 컬럼은 Customers 테이블의 PK를 참조하는 FK이다.

INNER JOIN을 사용해서 두 테이블 간 일치하는 값이 있는 레코드를 선택하는 SQL문이다.

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

💡 Inner Join

두 테이블에서 일치하는 값이 있는 레코드를 반환한다.

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

예시

Orders와 Customers 테이블 간 고객정보가 있는 모든 주문을 선택한다.

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

3개의 테이블 조인, Orders는 Customers와 Shippers의 PK를 FK로 가지고 있다.

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);

💡 Left Join

왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드를 반환한다.

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.colomn_name = table2.column_name;

예시

Customers 테이블 (왼쪽)의 모든 레코드와 Orders 테이블의 일치 항목을 반환한다.

참고 : 만약 오른쪽 테이블에 일치 항목이 없더라도 왼쪽 테이블의 모든 레코드를 반환한다.

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;

💡 Right Join

오른쪽 테이블의 모든 레코드와 왼쪽 테이블의 일치하는 레코드를 반환한다.

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

예시

Orders 테이블 (왼쪽) 의 일치하는 레코드와 Employees 테이블(오른쪽)의 모든 레코드를 반환한다.

참고 : 만약 왼쪽 테이블에 일치 항목이 없더라도 오른쪽 테이블의 모든 레코드를 반환한다.

SELECT Orders.OrderID, Employees.LastName, Employees.FirstName
FROM Orders
RIGHT JOIN Employees ON Orders.EmployyeID = Employees.EmployeeID
ORDER BY Orders.OrderID;

💡 Full (Outer) Join

왼쪽과 오른쪽 테이블 레코드에 일치 항목이 있는 경우 모든 레코드를 반환한다.

참고 : Full Join은 잠재적으로 매우 큰 결과 집합을 반환할 수 있다.

 SELECT column_name(s)
 FROM table1
 FULL OUTER JOIN table2
 ON table1.column_name = table2.column_name
 WHERE condition;

예시

CustomerName을 기준으로 Customers와 Orders의 일치하는 레코드를 전부 반환한다.

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;

💡 Self Join

1개의 테이블에 가상으로 n개의 별칭을 부여하여 n개의 테이블로 간주한 뒤 Self Join한다.

1개의 컬럼 내에 섞여있는 여러 레코드들을 다른 컬럼을 통해서 관계를 알 수 있는 모습으로 조회 가능.

SELECT Alias1.컬럼명, Alias2.컬럼명
FROM table1 Alias1, table table2 Alias2
WHERE Alias1.컬럼명 = Alias2.컬럼명;

예시

Customers 테이블의 City를 기준으로 CustomerName을 A와 B로 나눠서 조인한다.

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City;
저작자표시 (새창열림)

'📦 Database > SQL' 카테고리의 다른 글

SQL Group By  (0) 2023.04.08
SQL Union  (0) 2023.04.08
SQL Alias  (0) 2023.04.08
SQL Between  (0) 2023.04.08
SQL In  (0) 2023.04.08
'📦 Database/SQL' 카테고리의 다른 글
  • SQL Group By
  • SQL Union
  • SQL Alias
  • SQL Between
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      React #Markdown
      GStreamer #Pipeline
      Lock #Thread #Concurrency
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    SQL Join
    상단으로

    티스토리툴바