본문 바로가기
Database

[MariaDB] JOIN

by qoth_0 2023. 11. 22.
728x90
반응형

  • JOIN(테이블을 가로로 합침)
    • 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현
    • 크게는 INNER JOIN, OUTER JOIN으로 구분
      • INNER JOIN(교집합)
        • 두 테이블 사이에 지정된 조건에 맞는 레코드만을 반환. 양쪽 테이블에 모두 해당 조건에 맞는 값이 있어야 결과에 포함
        • tableA의 ID와 tableB의 a_id가 일치하는 ON 조건을 만족하는 데이터만 JOIN
        • SELECT * FROM tableA INNER JOIN tableB ON tableA.ID = tableB.A_ID
        • SELECT * FROM tableA AS a INNER JOIN tableB AS b on a.ID = b.a_id; →AS 생략 가능
        • 출력결과
          • TableA의 모든컬럼 + TableB의 모든컬럼
          • 그 중에 ON조건을 만족하는 row만 출력
        • ex)author와 post를 inner조인하면 글을 작성한적이 있는 author와 해당 author가 작성한 post정보를 결합하여 조회 (author의 id와 post의 author_id가 같은 값만 조회)
        author
        post
        select * from author a inner join post p on a.id = p.author_id;

        → author id에 해당하는 post의 데이터가 합쳐짐(null은 조회되지 않고, 두번 쓴 사람은 두행으로 조회됨)

        • 가장 일반적인 형태
        • 컬럼을 선택하여 조회 시 중복된 컬럼명엔 테이블. 으로 붙여서 구분해줘야 함
        select a.id, name author, title, contents, author_id from author a inner join post p on a.id = p.author_id;
      • OUTER JOIN
        • 하나의 테이블을 기준으로 모든 레코드와 그에 JOIN된 다른 테이블의 일치하는 레코드를 반환
        • 왼쪽테이블이 기준이면 LEFT (OUTER) JOIN, 오른쪽 기준이면 RIGHT (OUTER) JOIN
        • LEFT JOIN이 더 일반적으로 많이 사용되는 JOIN(왼쪽의 데이터는 다나오고 join되는 테이블의 데이터는 해당하는 부분만 조회)
        • LEFT OUTER JOIN
          • 문법
            • SELECT * FROM tableA a LEFT JOIN tableB b ON a.id = b.a_id
          • 출력결과
            • TableA의 모든컬럼 + TableB의 모든컬럼
            • A테이블 데이터는 row는 모두 출력 B데이터는 ON 조건에 맞는 데이터만 출력
            • ON조건에 맞지 않는 B데이터는 null로 출력
            • A테이블의 데이터를 기준으로 B테이블의 데이터를 정렬
        • ex)author의 테이블은 일단 다 조회하고 author가 작성한 글정보를 join하여 추가적으로 조회 → author테이블에 post테이블을 left join
        select * from author a LEFT JOIN post p on a.id = p.author_id;

    • JOIN 특이사항
      • JOIN된 데이터에 WHERE조건
        • where조건을 걸게 되면, ON 조건을 만족하는 데이터중에서도 WHERE문을 만족하는 데이터만 출력
        • SELECT * FROM tableA AS a INNER JOIN tableB AS b on a.ID = b.a_id where a.name like ‘kim%’;
      • RIGHT JOIN의 경우 LEFT JOIN과 동일
        • 다만, 기준이 되는 테이블이 왼쪽 테이블에서 오른쪽으로 변경
    • 실습
      • author 테이블과 post테이블을 JOIN하여, 글을 작성한 모든 저자의 이름(name)과 해당 글의 제목(title)을 조회하시오. author는 alias a, post는 alias p를 쓰시오
      SELECT name, title from author a inner join post p on a.id = p.author_id;
      • author 테이블을 기준으로 post 테이블과 JOIN하여, 모든 저자의 이름과 해당 저자가 작성한 글의 제목을 조회하시오. 글을 작성하지 않은 저자의 경우, 글 제목은 NULL로 표시
      select name, title from author a left join post p on a.id = p.author_id;
      • 위 예제와 동일하게 모든 저자의 이름과 해당 저자가 작성한 글의 제목을 조회. 단, 저자의 나이가 25세 이상인 저자만 조회
      author
      post
      select name, title from author a left join post p on a.id = p.author_id where a.age >= 25;
      • *프로그래머스 SQL문제 풀기
        • LEFT JOIN - 없어진 기록 찾기

        https://school.programmers.co.kr/learn/courses/30/lessons/59042

        ANUNAL_OUT에 INS를 LEFT JOIN한 상태로 INS가 NULL인 데이터를 찾으면 됨

        SELECT A.ANIMAL_ID, A.NAME FROM ANIMAL_OUTS A LEFT JOIN ANIMAL_INS B ON A.ANIMAL_ID = B.ANIMAL_ID WHERE B.DATETIME IS NULL;

        또는 NOT IN 과 INNER JOIN을 사용해서도 가능

        SELECT ANIMAL_ID, NAME FROM ANIMAL_OUTS 
        WHERE ANIMAL_ID NOT IN (
            SELECT A.ANIMAL_ID FROM ANIMAL_OUTS A INNER JOIN ANIMAL_INS B ON A.ANIMAL_ID = B.ANIMAL_ID
        );
        • INNER JOIN - 조건에 맞는 도서와 저자 리스트 출력하기

        https://school.programmers.co.kr/learn/courses/30/lessons/144854

        SELECT BOOK_ID, AUTHOR_NAME, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE FROM BOOK A INNER JOIN AUTHOR B ON A.AUTHOR_ID = B.AUTHOR_ID WHERE A.CATEGORY='경제' ORDER BY PUBLISHED_DATE;
  • UNION(테이블을 아래로 합침)
    • 여러 개의 SELECT 문의 결과를 하나의 테이블이나 결과 집합으로 표현
    • 각각의 SELECT 문으로 선택된 필드의 개수와 타입은 모두 일치해야함
    • UNION은 DISTINCT 키워드를 따로 명시하지 않아도 중복되는 레코드를 제거
      • 중복되는 레코드까지 모두 출력하고 싶다면 UNION ALL
    • SELECT 컬럼1, 컬럼2 FROM TABLE1 UNION SELECT 컬럼1, 컬럼2 FROM TABLE2;
    • author 테이블에서 NAME, EMAIL조회한 결과와 POST테이블에서 TITLE, CONTENTS를 조회한 결과를 UNION
    SELECT name, email FROM author UNION SELECT title, contents FROM POST;
  • 서브쿼리
    • 서브쿼리(subquery)란 다른 쿼리 내부에 포함되어 있는 SELECT 문을 의미
    • JOIN대신 서브쿼리를 써보자
      • SELECT a.* FROM author a INNER JOIN post p ON a.id = p.author_id;
      • SELECT a.* FROM author a WHERE a.ID IN (SELECT p.author_id FROM post p);
    • IN과 NOT IN을 많이 사용
      • SELECT * FROM tableA WHERE id IN (SELECT a_id FROM tableB);
      • 서브쿼리는 반드시 괄호(())로 감싸져 있어야 한다
    • 대부분의 서브쿼리는 join으로 대체가능하고 join을 쓰는것이 성능이 더 좋음
      • 단, 매우 복잡한 쿼리는 join으로 대체하는 것이 불가능

과거 업무는 쿼리기반 프로젝트가 주요했지만 현재는 ORM기반 데이터베이스 기술을 쓰고있다.

→ 프로그램으로 쿼리문을 생성해주고 데이터베이스를 관리

→ 쿼리작성 능력보다 자바 프로그램의 활용 능력이 더 중요


Uploaded by N2T

728x90
반응형

'Database' 카테고리의 다른 글

[MariaDB] INDEX  (0) 2023.11.24
[MariaDB] GROUP BY  (0) 2023.11.24
[MariaDB] 동시성 이슈  (1) 2023.11.22
[MariaDB] 흐름제어  (0) 2023.11.22
[MariaDB] 제약조건  (0) 2023.11.22