inblog logo
|
Uni
    SpringbootSQL

    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)
    Contents
    1. 인너 조인(Inner Join)1-2. 인너 조인(Inner Join) 활용 JPQL 와 Native SQL 비교하기
     

    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

    RSS·Powered by Inblog