SQL/sql 문법(mysql, mariaDB)

2.JOIN _ inner, outer (+ on과 where의 차이)

읽히는 블로그 2024. 5. 6. 15:16

▤ 목차

    INNER JOIN

    일치하는 데이터만 나온다. null 값이 있다면 포함하지 않는다.

    있는 자료를 기준으로 진행한다.

    위의 사진처럼 교집합의 값을 가져온다.

    ⌨ 형식

    SELECT [COLUMN 목록]
    	FROM [테이블1]
        INNER JOIN [테이블2] ON [조인 조건]
    WHERE [검색 조건]

    💻 코드로 보기

    # oracle 방식

    SELECT jikwon_no, jikwon_name, buser_name FROM jikwon,buser
    WHERE buser_num =buser_no;
    SELECT jikwon.jikwon_no, jikwon.jikwon_name, buser.buser_name
    FROM jikwon jiktab,buser butab
    WHERE jiktab.buser_num =butab.buser_no;

    아래 코드처럼 별명을 줄 수 있다.

     

    #anci sql 표준

    SELECT jikwon_no, jikwon_name, buser_name
    FROM jikwon INNER JOIN buser 
    ON buser_num =buser_no
    WHERE jikwon_gen='남';

     

    👏 정리

    inner join 의 조건은 on으로 진행된다. 

     

    당연하게 쿼리문을 짜고있다가 질문이 들어오니 생각해보게 된 문제가 있다.

    on과 where의 차이이다.

     

    SELF JOIN을 수행하는 경우는?

    한 테이블 내에 두 칼럼이 연관 관계가 있는 경우이다.

    ON vs WHERE

    ON 

    : JOIN을 하기 전 필터링을 한다. ON 조건으로 필터링이 된 레코들 간의 JOIN이 이뤄진다.

    WHERE

    : JOIN을 한 후 필터링을 한다. JOIN을 한 결과에서 WHERE 조건절로 필터링이 이뤄진다.

     

    ※  쿼리를 순차적으로 실행된다는 점을 생각하자.

     

    OUTER JOIN

    ⌨ lefr outer join

    왼쪽 테이블을 기준으로 join을 시도한다.

    오른쪽에는 null이 허용된다.

     

     

    💻 코드로 보기

    SELECT jikwon_no, jikwon_name, buser_name
    FROM jikwon LEFT OUTER JOIN buser
    ON jikwon.buser_num = buser.buser_no;

    👏 중요

    왼쪽의 모든 결과를 가져온 후 대응되는 오른쪽 테이블의 데이터를 매칭한다.

    왼쪽의 결과를 기준으로 매칭되는 데이터가 없다면 null로 표시된다.

     

    right outer join

    오른쪽 테이블을 기준으로 join을 시도한다.

    왼쪽 테이블에 null이 존재한다.

    💻 코드로 보기

    SELECT jikwon_no, jikwon_name, buser_name
    FROM jikwon RIGHT OUTER JOIN buser
    ON jikwon.buser_num = buser.buser_no;

    '

    👏 중요

    오른쪽의 모든 결과를 가져온 후 대응되는 오른쪽 테이블의 데이터를 매칭한다.

    오른쪽의 결과를 기준으로 매칭되는 데이터가 없다면 null로 표시된다.

    ⌨ FULL OUTER JOIN

    기준 피드의 값과 매치되는 레코드가 어느 한쪽 테이블이라도 있으면 해당 레코드를 가져온다.

    다대다 형식으로 join되기 때문에 결과 테이블의 용량이 매우 커질 수 있어

    주의해야한다.

    💻 코드로 보기

    오라클의 방식이 heidiSQL에서 먹히지 않아, union을 사용해서 합쳤다.

    SELECT jikwon_no, jikwon_name, buser_name
    FROM jikwon LEFT OUTER JOIN buser
    ON jikwon.buser_num = buser.buser_no
    UNION
    SELECT jikwon_no, jikwon_name, buser_name
    FROM jikwon RIGHT OUTER JOIN buser
    ON jikwon.buser_num = buser.buser_no;

     

    -- full outer join [Oracle 방식]
    SELECT jikwon_no, jikwon_name, buser_name
    FROM jikwon full OUTER JOIN buser
    ON jikwon.buser_num = buser.buser_no;

     

     

    👏 중요

    INNER JOIN과 LEFT/ RIGHT JOIN의 차이가 있나?

    있다.

    INNER JOIN은 두 테이블 모두에 기준 필드의 값이 존재하는 레코드만 가져온다.

     

    LEFT/ RIGHT JOIN은 한쪽 테이블에 있는 모든 레코드를 가져온 후

    다른 테이블에서 필드값과 매치되는 레코드들을 가져온다.

    만약 기준 테이블의 필드의 기준 필드 값과 매치되는 값이 오른쪽 테이블에 없으면 NULL을 가져온다.

     

    😊정리

    CROSS JOIN과 OUTER JOIN의 차이가 궁금해져 검색을 해보지

    CROSS JOIN은 NULL값을 허용하지 않고 OUTER JOIN은 NULL값을 허용한다는 점에서 차이가 있었다.

     

    참고

    https://velog.io/@onicle/SQL%EA%B0%84%EB%8B%A8%ED%95%98%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-CROSS-INNER-OUTER-JOIN-%EC%B0%A8%EC%9D%B4-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC