Database | Join

새니·2023년 6월 29일

database

목록 보기
4/8
post-thumbnail

JOIN

하나의 테이블로 원하는 칼럼정보를 참조 할수 없는 경우 관련된 테이블을 논리적으로 결합하여 원하는 칼럼 정보를 참조하는 방법을 JOIN 이라고 한다.




JOIN의 문법

SELECT 칼럼명1, 칼럼명2...
FROM 테이블명1, 테이블2...
WHERE JOIN 조건 AND 다른 조건.... 

  • 파란색 부분 : EMP TABLE 의 COLUMN
  • 빨간색 부분 : DEPTNO TABLE의 COLUMN


EMP 테이블의 DEPTNO와 DEPT 테이블의 DEPTNO를 확인하여 ALLEN의 DNAME값을 확인 할 수 있다.
즉, 서로 다른 두 테이블의 중복 되는 값을 통해서 다른 값을 출력할 수 있다!



두 테이블의 겹쳐지는 DEPTNO를 소환할때 정확하게 TABLE명을 적어주어야 한다.
하지만 이렇게 작성하면 모든 경우의 수들이 다 출력 되기 때문에
조건에 부합하지 않는 ROW들을 제외하기 위해 JOIN을 사용한다!



- JOIN 조건 이외의 또 다른 조건이 있을 경우!

'AND'연산자로 묶어서 조건을 추가하기!

😶예시를 통해 파악하기!
급여가 3000에서 5000 사이의 사원이름과 부서명을 출력해보세요.

  • EMP TABLE과 DEPT TABLE의 DEPT를 JOIN하고, 조건에 맞는 급여를 가진 사람을 출력해야한다!

SQL> SELECT ename, dname
FROM emp, dept
WHERE emp.deptno = dept.deptno AND
sal BETWEEN 3000 AND 5000;

AND연산자를 사용하여 조건을 추가 할 수 있다.

SQL> SELECT ename, dname
FROM emp, dept
WHERE emp.deptno = dept.deptno AND
(sal >= 3000 AND SAL <= 5000) ;

또, 범위의 조건은 비교연산자를 통해 나타낼 수도 있다!




- COLUMN에 별칭부여하기!

만일 COLUMN의 이름이 길어진다면 코드를 작성하는데 어려움이 생기고 복잡하여 실수 할 수도 있다! 이럴 경우, 테이블명의 별칭을 만들어서 사용 할 수 있다!

😶예시를 통해 파악하기!

부서명이 'ACCOUNTING'인 사원의 이름, 입사일, 부서번호, 부서명을 출력해보세요!

SQL> SELECT ename, hiredate, emp.deptno, dname
FROM emp emp, dept dmpt
WHRER emp.deptno = dept.deptno
AND dname = 'ACCOUNTING'

*테이블에 별칭(ALIAS)를 붙인다면

SQL> SELECT ename, hiredate, e.deptno, dname
FROM emp e, dept d
WHRER e.deptno = d.deptno
AND dname = 'ACCOUNTING'

🔹 TIP!
별칭을 붙일때 'AS'를 붙이지 않고 , 한칸 띄어쓰기를 한 후 별칭을 적어주면 된다!


❗ 주의!!

코드의 실행 순서는 from -> where -> select 인데
별칭을 작성한 이전의 실행되는 코드에는 별칭이 적용이 되지 않는다.

JOIN의 종류

ANSI JOIN 표현식 ( 조인 조건의 칼럼명이 같다면 ?)

😶예시를 통해 파악하기!

부서명이 'ACCOUNTING'인 사원의 이름, 입사일, 부서번호, 부서명을 출력해보세요!

SQL>  SELECT ename, hiredate, deptno, dname
FROM emp
INNER JOIN dept USING(deptno)
WHERE dname = 'ACCOUNTING';
  • ANSI JOIN은 WHERE절의 조인 조건이 아래로 내려가게 된다.

  • COLUMN의 이름이 같다면 (DEPTNO = DEPTNO ) INNER 생략이 가능하고 USING으로 묶어서 작성할 수 있다. -> 문법이 더 간결해진다. (INNER JOIN이 default값)

SQL>  SELECT ename, hiredate, deptno, dname
FROM emp
JOIN dept USING(deptno)
WHERE dname = 'ACCOUNTING';

SELF JOIN

  • 참조해야할 칼럼이 자신의 테이블에 있는 경우에 사용하는 JOIN 방법!

둘다 같은 EMP 테이블에 있지만 MGR의 값과 EMPNO의 값을 서로 매칭하고자 한다면
별칭을 정해줘서 불러오기!
ex) emp -> e1 / emp -> e2 로 정하고 참조해야할 칼럼을 호출하기!

😶예시를 통해 파악하기!

각 사원의 이름과 매니저 이름을 출력하세요!

SQL> SELECT e1.ename, e2.ename
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno;

OUTER JOIN

  • 한쪽 테이블에는 해당하는 데이터가 존재하는데 다른 테이블에는 데이터가 존재하지 않을때에도 모든 데이터를 추출하도록 하는 JOIN 방법
  • (+) 연산자를 이용하고 반드시 한 쪽 테이블에서만 사용 할 수 있다.

총 12개의 열을 가지고 있지만, KING이라고 하는 값에는 ENAME이 존재 하지 않을 경우, 공백으로 출력한다.

NULL의 값도 표기하고 싶다면 !

😶예시를 통해 파악하기!

SQL> SELECT empno, dept, deptno, dname
FROM emp, dept
WHERE emp.deptno=dept.deptno(+)

  • (+) 연산자 대신, LEFT|RIGHT|FULL 키워드를 이용하며 한 쪽 테이블 또는 양쪽테이블 지정이 모두 가능하다!

문법

select 테이블1.컬럼, 테이블2.컬럼
from 테이블1 
LEFT|RIGHT|FULL outer join 테이블2
on 조인조건 |  using(컬럼);

😶예시를 통해 파악하기!

사원번호,부서번호,부서명을 출력하세요!
단, 사원이 근무하지 않는 부서명도 같이 출력해보세요!

근무를 하지않는 40번 부서의 값도 출력.
부서의 번호가 오른쪽에 있기 때문에 'right outer join'을 사용




😶 의문점 ⁉

하나의 테이블로 관리하지 않고 , 왜 두개의 테이블로 관리를 할까요 ?
현재 내가 연습 중이 ROW의 개수는 12개인데 만약에 그 ROW의 갯수가 12000개라면?
예를들어 부서별로 정리한 테이블이 따로 있다면, 부서테이블의 부서명만 변경하면 되는데
하나의 테이블로 관리한다면 변경된 부서명을 ROW의 개수만큼 변경해주어야 하겠지? 😂
따라서! 한개의 테이블로 전체를 관리하면 SELECT 할때는 편하겠지만, 관리하기가 어렵기때문에
두개의 테이블로 관리하는 것이 훨 ~~~ 씬 편하기 때문이다 !

profile
새니의 뒤죽박죽 개발 일기📝

0개의 댓글