1-7 인너 조인(Inner Join),레프트 아우터 조인(Left Outer Join),드라이빙 테이블(Driving Table)

Inner Join
홍윤's avatar
Aug 21, 2024
1-7 인너 조인(Inner Join),레프트 아우터 조인(Left Outer Join),드라이빙 테이블(Driving Table)
 

1. 인너 조인(Inner Join)

💡
인너 조인(Inner Join)
  • 정의: 인너 조인은 두 개 이상의 테이블을 조인할 때, 서로 매칭되는 데이터만 조회하는 방식입니다. 조인 조건을 만족하는 행들만 결과 집합에 포함됩니다.
  • 예시:
    • sql코드 복사 SELECT * FROM Employees e INNER JOIN Departments d ON e.department_id = d.id;
    • 이 쿼리는 Employees 테이블과 Departments 테이블에서 department_id가 일치하는 행들만 조회합니다.
    • 결과는 두 테이블에서 공통된 값이 있는 행들만 포함합니다.
    •  
      이러한 조인 및 드라이빙 테이블의 개념은 SQL 쿼리를 작성하고 최적화할 때 매우 중요합니다. 올바르게 사용하면 데이터베이스 성능을 크게 향상시킬 수 있습니다.

1-2. 인너 조인(Inner Join) 활용 JPQL 와 Native SQL 비교하기

JPQL
public Board findById(int id) { // select * from board_tb bt inner join user_tb ut on bt.user_id = ut.id where bt.id =1 Query query = em.createQuery("select b from Board b join fetch b.user where b.id = :id", Board.class); query.setParameter("id", id); try { Board board = (Board) query.getSingleResult(); return board;
💡
1-1 쿼리언어
JPQL
  • JPQL (Java Persistence Query Language)은 엔티티 객체를 대상으로 쿼리를 만든다.
  • 데이터베이스의 테이블이 아니라, JPA 엔티티 클래스를 기준으로 쿼리를 만들고 독립적인 데이터베이스
  • 엔티티 객체와 그 관계를 통해 데이터베이스에 접근, 데이터베이스 필드 대신 엔티티 필드를 기준으로 쿼리를 만든다.
 
1-2 결과 처리 방식
  • ‘Board’ 엔티티 객체를 반환한다.
  • JPA는 ‘Board’ 엔티티와 연고나된 ‘User’ 엔티티를 자동으로 매핑하여 객체 그래프로 관리한다. 즉 쿼리 결과로 반환된 객체는 JPA 엔티티 관리의 일부분이므로, 영속성 컨텍스트에 의해 관리된다. ※ 영속성 컨텍스트는 주로 EntityManager를 통해 관리됩니다.
 
1-3 조작대상
  • ‘Board’ 엔티티와 그 연관된 ‘User’ 엔티티를 대상으로 합니다.
  • JPA 엔티티 매핑을 통해서 테이블 간의 관계를 자동으로 처리하며, 객체 지향적인 방식으로 데이터를 다룬다.
 
Consol Test
notion image
 
Native SQL
public Board findByIdV3(int id) { Query query = em.createNativeQuery("select bt.id, bt.title, bt.content, bt.user_id, bt.created_at, ut.id u_id, ut.username, ut.password, ut.email, ut.created_at u_created_at from board_tb bt inner join user_tb ut on bt.user_id = ut.id where bt.id = ?"); query.setParameter(1, id); Object[] obs = (Object[]) query.getSingleResult(); System.out.println(obs[0]); System.out.println(obs[1]); System.out.println(obs[2]); System.out.println(obs[3]); System.out.println(obs[4]); System.out.println(obs[5]); System.out.println(obs[6]); System.out.println(obs[7]); System.out.println(obs[8]); System.out.println(obs[9]); // 1 // 제목1 // 내용1 // 1 // 2024-08-21 12:49:35.197432 // 1 // ssar // 1234 // ssar@nate.com // 2024-08-21 12:49:35.194432 Board board = new Board(); User user = new User(); board.setId((Integer) obs[0]); board.setTitle((String) obs[1]); board.setContent((String) obs[2]); board.setCreatedAt((Timestamp) obs[4]); user.setId((Integer) obs[3]); user.setUsername((String) obs[6]); user.setPassword((String) obs[7]); user.setEmail((String) obs[8]); user.setCreatedAt((Timestamp) obs[9]); board.setUser(user); return board; }
Consol Test
notion image
 
 
💡
1-1 쿼리언어
Native SQL
  • Native SQL 쿼리를 사용합니다.
  • Native SQL은 데이터베이스의 실제 테이블과 컬럼을 대상으로 쿼리를 작성합니다. SQL 쿼리는 특정 데이터베이스에 종속적일 수 있습니다.
  • 이 쿼리는 데이터베이스에 직접 실행되며, 쿼리 작성자가 데이터베이스 구조를 명시적으로 알고 있어야 합니다.
 
1-2 결과 처리 방식
Native SQL
  • 결과는 기본적으로 Object 배열(Object[])로 봔환된다.
  • 각 배열의 요소를 쿼리에서 선택한 컬럼 값에 대응하고 JAP가 자동으로 엔티티를 매핑 하지 않기 때문에 결과를 수동으로 처리해야 한다.
  • 반환된 데이터는 JPA의 영속성 컨텍스트 의해 관리 되지 않고 단순환 데이터베이스 조회 결과이다.
 
1-3 조작대상
Native SQL
  • ‘board_tb’와 ‘user_tb’라는 실제 데이터베이스 테이블을 대상으로 한다.
  • 쿼리 작성자가 테이블과 그 관계를 명시적으로 정의하고, SQL을 직접 사용하여 데이터베이스와 상호작용한다.
 
 
💡
JPQL 와 Native SQL 차이
  • JPQL 쿼리는 JPA 엔티티를 대상으로 하며, 객체 지향적인 접근을 제공한다.
  • Native SQL 쿼리는 데이터베이스 테이블을 대상으로 하여 SQL의 강력한 기능을 직접 활용할 수 있다. 하지만 JPA엔티티로 변환하려면 수작업이 필요하다.
 
 
 

 

2. 레프트 아우터 조인(Left Outer Join)

💡
레프트 아우터 조인(Left Outer Join)
  • 정의: 레프트 아우터 조인은 왼쪽 테이블(첫 번째 테이블)의 모든 행을 포함하고, 오른쪽 테이블(두 번째 테이블)에서 조인 조건에 맞는 행을 포함시킵니다. 만약 오른쪽 테이블에 매칭되는 데이터가 없으면, 그 부분에 NULL 값이 채워집니다.
  • 예시:
    • sql코드 복사 SELECT * FROM Employees e LEFT OUTER JOIN Departments d ON e.department_id = d.id;
    • 이 쿼리는 Employees 테이블의 모든 행을 포함하며, Departments 테이블에서 일치하는 department_id를 가진 행을 추가합니다.
    • Employees 테이블에 있는 모든 직원이 포함되며, 그들이 속한 부서가 없다면 Departments 테이블의 관련 데이터는 NULL로 표시됩니다.
 
이러한 조인 및 드라이빙 테이블의 개념은 SQL 쿼리를 작성하고 최적화할 때 매우 중요합니다. 올바르게 사용하면 데이터베이스 성능을 크게 향상시킬 수 있습니다.
 

 

3. 드라이빙 테이블(Driving Table)

💡
드라이빙 테이블(Driving Table)
  • 정의: 드라이빙 테이블은 조인 쿼리에서 먼저 접근하는 테이블로, 쿼리 실행의 시작점이 됩니다. 조인 조건에 따라, 쿼리 계획에서 데이터베이스는 어느 테이블부터 시작할지 선택하게 되며, 이 시작점이 되는 테이블이 드라이빙 테이블입니다.
  • 선택 기준:
    • 일반적으로 쿼리 옵티마이저는 데이터량이 적거나 인덱스가 잘 설정된 테이블을 드라이빙 테이블로 선택합니다. 이렇게 하면 쿼리 성능을 최적화할 수 있습니다.
    • 조인에서의 드라이빙 테이블은 쿼리의 성능에 큰 영향을 미칠 수 있으며, 옵티마이저가 선택한 방식에 따라 조인 순서가 결정됩니다.

종합 예시

다음은 위에서 설명한 개념들을 종합적으로 보여주는 SQL 쿼리입니다.
sql코드 복사 SELECT e.name, d.department_name FROM Employees e LEFT OUTER JOIN Departments d ON e.department_id = d.id WHERE d.location = 'New York';
 
이러한 조인 및 드라이빙 테이블의 개념은 SQL 쿼리를 작성하고 최적화할 때 매우 중요합니다. 올바르게 사용하면 데이터베이스 성능을 크게 향상시킬 수 있습니다.
Share article

Uni