230322 DB_Join

Myung A Lee·2023년 3월 22일
0

DB

목록 보기
7/15
post-thumbnail

JOIN

  • 둘 이상의 테이블을 연결하여 데이터를 검색하는 방법

JOIN의 종류

  • CROSS JOIN, *EQUI JOIN(등가조인, 내부조인, Natural)
  • NON EQUI JOIN (거의 사용하지 않음)
  • SELF JOIN, *OUTER JOIN

1. CROSS JOIN(X)

  • CROSS JOIN은 카다시안 곱을 수행한 결과를 반환한다.
  • CROSS JOIN은 생략 가능하며 어떤 테이블에서 온 정보인지 명시하기 위해 별명을 사용하는 것이 좋다.
  • CROSS JOIN은 양 테이블의 모든 컬럼의 조합을 보여주므로 의미있는 데이터를 뽑아내기 어렵다.
  • JOIN 형태의 원형이며 조건을 추가하여 다양한 JOIN을 사용한다.
  • SELECT [컬럼명] FROM [tableA] CROSS JOIN [tableB]
    select e.ename, d.deptname from dept d cross join emp e ;
    select e.ename, d.deptname from dept d, emp e ;

    카테시안 곱(Cartesian Product)
    두 집합 A,B의 원소들로 만들어지는 모든 순서쌍 (a,b)들의 집합
    ex) A = {1,2}, B = {c,d}
    A x B = {(1,c),(1,d),(2,c),(2,d)}

2. EQUI JOIN

  • 가장 일반적으로 사용하는 JOIN으로 '=' 조건을 사용한다.
  • 정확히 일치하는 컬럼이 있을 때 사용하기 때문에 일반적으로 pk와 fk를 활용한다.

1) 등가조인

  • JOIN하려는 테이블간의 공통 컬럼이 존재해야한다.
  • SELECT [컬럼명] FROM [tableA], [tableB] WHERE [조건]
    - Step 1. CROSS JOIN : 'emp' 테이블과 'dept' 테이블을 합쳐서 'ename'과 'deptname' 조회
    select e.ename, d.deptname from dept d, emp e ;
    - Step 2. EQUI JOIN (등가조인): e.deptno = d.deptno 인 데이터만 조회하라는 '조건'을 추가
    select e.ename, d.deptname from dept d, emp e where e.deptno = d.deptno ;

2) 내부조인

  • INNER JOIN 키워드를 사용하며 조인의 조건을 WHERE가 아닌 ON을 사용한다.
  • SELECT [컬럼명] FROM [tableA] INNER JOIN [tableB] ON [조건]
  • INNER 키워드는 생략이 가능하며, ON 대신 USING 사용이 가능하며 이때 USING(SUBQUERY) 가능하다.
    - Step 1. CROSS JOIN : 'emp' 테이블과 'dept' 테이블을 합쳐서 'ename'과 'deptname' 조회
    select e.ename, d.deptname from dept d, emp e ;
    - Step 2. INNER JOIN (내부조인): e.deptno = d.deptno 인 데이터만 조회하라는 '조건'을 추가
    select e.ename, d.deptname from dept d inner join emp e on e.deptno = d.deptno ;
    select e.ename, d.deptname from dept d join emp e on e.deptno = d.deptno ;
    select e.ename, d.deptname from dept d join emp e using (deptno) ;

3) NATURAL JOIN

  • JOIN 하고자 하는 테이블 간 공통 컬럼을 기준으로 자동으로 합쳐지므로 조건을 사용하지 않는다.
  • 가독성을 위해 잘 사용하진 않는다.
  • SELECT [컬럼명] FROM [tableA] NATURAL JOIN [tableB]
    select e.ename, d.deptname from dept d natural join emp e;

3. OUTER JOIN (외부 조인)

  • 특정 테이블에 데이터가 더 많은 경우 사용하는 JOIN 이다.
  • 매칭되는 데이터가 없을 경우 NULL로 표시된다.
  • SELECT [컬럼명] FROM [tableA][LEFT|RIGHT|FULL] OUTER(생략가능) JOIN [tableB] ON [조건]
  • [RIGHT | LEFT | FULL] OUTER JOIN

1) RIGHT OUTER JOIN

  • 오른쪽 테이블을 기준으로 더 많은 데이터를 보여줌
  • select d.deptno, e.ename, d.deptname from emp e right join dept d on e.deptno = d.deptno ;
  • Result
  • 실습을 위해 부모자식 간의 관계를 삭제 (== FK 삭제) 후 데이터 추가
    - ALTER TABLE [테이블명] DROP CONSTRAINT [제약조건의 이름]
    select * from information_schema.table_constraints where TABLE_NAME = 'emp';
    alter table emp drop constraint emp_ibfk_1;
    insert into emp(ename,job,deptno,hiredate) values('kim','manager',6,str_to_date('14/06/02','%Y/%m/%d'));

3) LEFT OUTER JOIN

  • 왼쪽 테이블을 기준으로 더 많은 데이터를 보여줌
  • select e.deptno, e.ename, d.deptname from emp e left join dept d on e.deptno = d.deptno ;
  • Result

3) FULL OUTER JOIN

  • 양쪽 테이블에만 존재하는 데이터도 모두 보여줌 (mariaDB/MySQL에서는 지원 X)
  • select e.deptno, e.ename, d.deptname from emp e full join dept d on e.deptno = d.deptno ;
  • Union을 사용하여 같은 효과를 낼 수 있다.
    select e.deptno, e.ename, d.deptname from emp e left outer join dept d on e.deptno = d.deptno
    union
    select d.deptno, e.ename, d.deptname from emp e right outer join dept d on e.deptno = d.deptno;

4. SELF JOIN (자기 조인)

  • 등가 조인과 같지만 두개의 테이블이 아닌 하나의 테이블을 대상으로 한다.
  • 자기 조인을 하면 두 테이터간 카다시안 곱이 결과로 나온다.
    select a.deptno ,a.ename,b.job from emp a, emp b where a.deptno = b.deptno ;

0개의 댓글