FULL OUTER JOIN이 처음으로 문제에 나와서 직접 파일을 만들어서 이것저것 해보고 있다.
내 예상과 다르게 동작해서 또 새로운 것을 배웠다.

데이터 만들기

create table a (
    id number(4)
);

insert into a values(1000);
insert into a values(1000);
insert into a values(2000);
insert into a values(3000);

create table b (
    id number(4)
);

insert into b values(1000);
insert into b values(4000);

1000이라는 숫자만 같은 데이터를 만들어줬다. 문제에서 테이블에 id 컬럼밖에 없기 때문에 빠르게 작성할 수 있다.

(INNER) JOIN

inner join을 하게 되면 밴다이어그램으로 생각했을 때 교집합인 '1000'만 조회되는 테이블을 만든다. b테이블에서 a테이블과 공통으로 가지고 있는 튜플이 1개밖에 없지만, inner join 결과 b테이블의 2번째 행은 null이 아니라 1000이 반복이 된 것을 확인할 수 있다. a테이블과 b테이블을 하나의 테이블로 맞춰준다고 생각하면 될 것 같다.

join을 입력해도 inner join과 동일한 결과가 나오는데, MS Access DB는 단순한 join 을 허용하지 않는다. 쿼리에서 사용할 'inner join', 'outer join', 'left join' 및 'right join'과 같이 'join' 유형을 지정하는 경우에만 허용된다. 따라서 다양한 데이터베이스에서 동일하거나 유사한 구문을 사용하려는 경우 쿼리에 '조인' 대신 '내부 조인'을 작성해야 한다고 한다.

Read more: Difference Between Join And Inner Join | Difference Between http://www.differencebetween.net/technology/software-technology/difference-between-join-and-inner-join/#ixzz7vKN74N97

LEFT (OUTER) JOIN

왼쪽 테이블인 a 테이블을 기준으로 b 테이블이 이어 붙여진다.

이 상태에서 where 절에 b.id is null을 추가하면 a테이블에만 있는 값이 조회된다.

LEFT JOIN 또한 위와 같은 이유로 LEFT OUTER JOIN을 쓰는 것이 더 명확한 것 같다. 코테 준비할 때는 그냥 LEFT JOIN 이라고 썼지만 명확하게 쓰는 게 더 좋을 것 같다 ㅎ

RIGHT (OUTER) JOIN

LEFT JOIN과 반대로 오른쪽 테이블인 b 테이블을 기준으로 a 테이블이 이어 붙여진다.

이 상태에서 where 절에 a.id is null을 추가하면 b테이블에만 있는 값이 조회된다.

FULL OUTER JOIN

두 테이블 모두를 기준으로 테이블을 이어 붙인 모습이다. 합집합의 개념.

벤다이어그램으로 생각했을 때 합집합의 모습을 띈다. 여기서 where 절을 추가하면 배타적 논리합으로 만들 수 있다.




NATURAL JOIN과 INNER JOIN 차이

  • NATURAL JOIN은 같은 이름인 모든 컬럼에 대해 EQUI JOIN을 수행한다.

  • 같은 데이터에 대해 INNER JOIN한 경우

    • EMP 테이블과 DEPT 테이블이 갖는 공통 컬럼인 DEPT_CODE에 대해서 INNER JOIN은 아래 결과 화면처럼 별개의 컬럼으로 나타낸다.
      select * from emp inner join dept on emp.dept_code = dept.dept_code;
  • 같은 데이터에 대해 NATURAL JOIN한 경우

    • INNER JOIN과 다르게 조인하고자 하는 컬럼을 지정해주지 않아도 공통 컬럼을 찾아서 조인을 수행한다.

      select * from emp natural join dept;

    • USING 조건절

      • USING 조건절을 사용하면 같은 이름을 가진 모든 컬럼 중 일부만을 조인할 수도 있다(SQL Server에서는 지원하지 않는 문법이다).

      • JOIN하는 컬럼에 대해서는 ALIAS나 테이블 이름과 같은 접두사를 붙일 수 없다(NATURAL JOIN과 USING에 해당).

        -- dept_test 테이블 생성하기(dept 테이블에서 부서장 컬럼 추가하여 테스트)
        create table dept_test(
            dept_code number(4),
            dept_name varchar2(20),
            dept_head varchar2(20)
        );
        
        insert into dept_test values(1000, '기획팀', '김희');
        insert into dept_test values(2000, '경영지원팀', '원필');
        insert into dept_test values(3000, '교육지원팀', '영케이');
        insert into dept_test values(4000, '마케팅팀', null);
        
        




profile
자고 일어나면 해결되는게 더 많은 듯 그럼 잘까

0개의 댓글