ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2.JOIN _ inner, outer (+ on과 where의 차이)
    SQL/sql 문법(mysql, mariaDB) 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

    Designed by Tistory.