[DB_SQL활용] 조인

예지성준·2024년 5월 10일

DB

목록 보기
9/19
post-thumbnail

여러 테이블을 하나의 테이블처럼 사용하는 조인

조인

1. 집합 연산자와 조인의 차이점

조인(join)은 두 개 이상의 테이블을 연결하여 하나의 테이블 처럼 출력할 때 사용하는 방식입니다. 집합 연산자를 사용한 결과와 비슷하게 느낄 수도 있습니다. 차이점은 집합 연산자를 사용한 결과는 두 개 이상 SELECT문의 결과 값을 세로로 연결한 것이고 조인을 사용한 결과는 두 개 이상의 테이블 데이터를 가로로 연결한 것이라고 볼수 있습니다.

2. 여러 테이블을 사용할 때의 FROM절

  • FROM 절에는 여러 개 테이블을 지정하는 것이 가능합니다. 꼭 테이블이 아니더라도 테이블 형태, 즉 열과 행으로 구성된 뷰(view), 서브 쿼리(subquery)등과 같은 데이터 집합이면 모두 FROM절에 지정 가능합니다.

  • SELECT절의 여러 열을 구분할 때와 마찬가지로 FROM절에 여러 테이블을 명시할 떄 쉼표(,)를 구분자로 사용하여 지정합니다. 그리고 WHERE, GROUP BY, ORDER BY절 등 다른 절도 그대로 사용할 수 있습니다.

FROM 테이블명, 테이블명 ...

  • 모든 행을 조합하기 때문에 사원 데이터와 부서 데이터가 정확히 맞아 떨어지지 않는 데이터도 함께 출력됩니다.

ex)
SELECT * FROM EMP, DEPT
ORDER BY EMPNO;

카티젼 프로덕트, 데카르트 곱: 무작위 순서쌍

3. 테이블의 별칭 설정

FROM 테이블명 "별칭"
FROM 테이블명 별칭

  • 큰따옴표(")는 한 단어로 구성된 경우는 생략 가능
  • 여러 단어로 구성된 경우( 띄어쓰기 있는 경우 ) 생략 불가

  • SELECT 절에서 출력할 열을 *로 표현하면 어떤 열이 어떤 순서로 출력될지 명확히 알 수 없을 뿐만 아니라 특정 열이 새로 생기거나 삭제되거나 또는 어떤 이유로 인해 수정되었을 경우에 그 변화의 감지 및 변화에 따른 프로그램 수정이 쉽지 않을 수도 있습니다.
    • 🔸조회할 컬럼명이 명확할때 직접 SELECT문에 출력할 각 열을 하나하나 열거하여 표시 가능
    • 🔹DEPTNO열은 두 테이블에 모두 존재하는 열이므로 어느 테이블에 속해 있는 열인지 반드시 명시해야 합니다. DEPTNO 열을 제외한 EMP 테이블 열과 DEPT 테이블 열은 이름이 겹치지 않으므로 어느 테이블의 열인지 명시하지 않아도 상관없습니다.
    • 두 테이블에 중복되는 열 존재시 별칭으로 해결 가능함
    • 열 이름에 각각의 테이블 이름도 함께 명시 (별칭)

조인 종류

1. 등가 조인

  • 공통적인 값의 일치 조건을 가지고 테이블을 결합하는 방식
  • 동등 조인, 내부 조인

EMP테이블의 DEPTNODEPT테이블에 DEPTNO에 공통적인 값이 존재
-> 직원이 속해 있는 부서 정보
-> 어떤 테이블의 값인지 구분 할 필요가 있다.

EMP.DEPTNO = DEPT.DEPTNO

같은 항목이있을때 헷갈릴 수 있으니 명확하게 출처를 밝혀야 한다.

🔽같은 값을 가지고 접근 => 등가 조인/ 동등 조인/ 내부 조인

공통적인 값을 가지고 테이블을 연결시킴
컬럼명이 달라도 같은 값이면 조인이 가능하다.

2. 비등가 조인

  • 등가 조인이 아닌 조인, 암묵적 조인
    • 같은 값을 가지고 하는 조인이 아님
  • 범위에 대한 조회

LOSAL보다 높고 HISAL보다 낮을때의 SAL
GRADE: SAL에 대한 등급

  • 등급 범위는 SALGRADE테이블에 지정되어있다.

3. 자체 조인

  • 같은 테이블 내에서 조인

🔼같은 테이블 내에서 같은 정보 참조

EMPNO: 직원번호 MGR: 해당 직원의 관리자 번호
EMPNO와 MGR이 같을때 자체 조인

같은테이블끼리 조회하기 때문에 테이블 출처 구분을 위해 별칭을 반드시 넣어줘야한다.

SMITH의 직원번호는 7902이고, 직원번호 7369인 FORD를 관리한다.

4. 외부 조인

조인 수행에서 조인 기준 열의 어느 한쪽이 NULL 이어도 강제로 출력하는 방식을 외부 조인(outer join)이라고 한다.

외부 조인은 좌우를 따로 나누어 지정하는데 WHERE절에 조인 기준 열 중 한쪽에 (+) 기호를 붙여준다.

외부 조인은 조인 기준 열의 NULL을 처리하는 것을 목적으로 자주 사용하는 조인 방식. 하지만 (+) 기호를 붙이는 외부 조인 방식으로는 양쪽 모든 열이 외부 조인되는 '전체 외부 조인(full outer join)' 사용은 불가능하다.


새로운 테이블 만들기

데이터 추가

추가완료!

등가조인 -> 같은값만 나오므로 새로 추가한 데이터는 나오지 않고있음


외부조인 사용해보기

  • 한쪽 테이블은 전체 모든 데이터를 조회
    나머지 테이블은 공통적인 값이 있는 테이블만 추가적으로 조회

📌왼쪽 외부조인

EMP테이블의 데이터는 전체 다 나오고, DEPT쪽 테이블은 공통적인 것만 출력 -> 없으면 NULL로 출력
위에 데이터에서는 공통적인 것이 없어서 다 NULL로 출력되었다.

📌오른쪽 외부조인

EMP테이블에서는 공통적인것만 출력되고(없으니 NULL로만) 부서 정보는 전체 데이터 다 출력

SQL-99 표준 문법으로 배우는 조인

- 등가조인(INNER JOIN)

  1. NATUAL JOIN
  • 공통적인 값을 가진 컬럼명이 서로 동일, 1개만 있는 경우
SELECT * FROM EMP E NATURAL JOIN DEPT;

  1. [INNER]JOIN ~ USING
  • 공통적인 값을 가진 컬럼명이 서로 동일, 1개 이상인 경우 - 직접 선택
    USING(공통 컬럼)
SELECT * FROM EMP JOIN DEPT USING(DEPTNO);

-- SELECT * FROM EMP INNER JOIN DEPT USING(DEPTNO);
-- 앞에 INNER가 생략되어있다.


SELECT E.EMPNO, E.ENAME, E.JOB,
	DEPTNO, D.NAME, D.LOC
FROM EMP INNER JOIN DEPT USING(DEPTNO);

JOIN ~ USING을 사용하여 조인하기

SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, 
	DEPNO, D.DNAME, D.LOC 
FROM EMP E JOIN DEPT D USING (DEPTNO)
WHERE SAL >= 3000
ORDER BY DEPTNO, E.EMPNO;
  1. [INNER]JOIN ~ ON
  • 공통적인 값을 가진 컬럼명이 서로 동일하지 않은 경우

JOIN ~ ON으로 등가조인

SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, 
	E.DEPTNO,
	D.DNAME, D.LOC 
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO) 
WHERE SAL <= 3000
ORDER BY E.DEPTNO, EMPNO;

- 외부조인(OUTER JOIN)

  1. 왼쪽 외부조인 LEFT [OUTER] JOIN
SELECT * FROM EMP_JOIN E
	LEFT JOIN DEPT_JOIN D ON E.DEPTNO = D.DEPTNO;
-- 왼쪽은 다 나오고 오른쪽은 있는 것만 나옴
  1. 오른쪽 외부조인 RIGHT [OUTER] JOIN
SELECT * FROM EMP_JOIN E
	RIGHT JOIN DEPT_JOIN D ON E.DEPTNO = D.DEPTNO;
-- 오른쪽은 다 나오고 왼쪽은 있는 것만 나옴
  • FULL OUTER JOIN
    중복 x

    참고) MySQL은 지원X

profile
꽁꽁 얼어붙은 한강 위로 😺

0개의 댓글