표준 조인

한준수·2023년 5월 31일
0

SQLD

목록 보기
24/31

집합 연산자

  • 두 개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회할 때 사용한다.
  • SELECT 절의 칼럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환 가능할 때 사용가능 하다.

일반 집합 연산자

연산자 설명
UNION 합집합(중복행 1개로) 정렬
UNION ALL 합집합(중복 행도 표시)정렬 X
INTERSECTION 교집합(중복행 1개로)
MINUS/EXCEPT(DIFFRENCE) 차집합(중복행 1개로)
NOT EXISTS, NOT IN 서브쿼리로 변경가능
CROSS JOIN 곱집합(PRODUCT)
NOT EXISTS, NOT IN 서브쿼리로 변경가능
ALIAS는 처음 테이블, 정렬은 마지막 테이블 기준

UNION과 UNION ALL의 결과가 같다면 정렬 작업이 없어 속도가 빠른 UNION ALL을 사용하는 것이 좋다.


순수 관계 연산자

관계형 데이터베이스를 구현하기 위해 새롭게 만들어진 연산자

  • SELECT절은 행을 추출 -> WHERE절로 구현
  • PROJECT절은 열을 추출 -> SELECT절로 구현
  • (NATURAL)JOIN 연산은 다양한 JOIN 기능으로 구현
  • DIVIDE 는 현재 거의 사용하지 않음

ANSI/ISO SQL에서 표시하는 FROM절의 JOIN

INNER JOIN 
NATURAL JOIN
USING 조건절
ON 조건절
CROSS JOIN
OUTER JOIN

INNER JOIN

  • JOIN 조건에서 동일한 값이 있는 행만 반환
  • USING이나 ON절이 필수이다.
  • EX) INNER JOIN을 통한 부서별 직원 정보 조회
SELECT D.DEPTNO, D.DNAME, E.ENAME
FROM DEPT D
INNER JOIN EMP E ON D.DEPTNO = E.DEPTNO;

NATURAL JOIN

  • 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN 수행.
  • NATURAL JOIN이 명시되면 추가로 USING, ON, WHERE절에서 JOIN 조건을 정의할 수 없다.
  • SQL Server는 지원하지 않음
  • EX) EMP테이블과 DEPT 테이블 NATURAL JOIN을 통해 직원 및 부서정보 조회
SELECT *
FROM EMP
NATURAL JOIN DEPT;

USING 조건절

  • 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있다.
  • JOIN 칼럼에 대해서 ALIAS나 테이블 이름과 같은 접두사를 붙일 수 없다.
  • SQL Server는 지원하지 않음
    SELECT *
    FROM DEPT
    JOIN EMP USING(DEPTNO);

ON 조건절

  • JOIN 서술부(ON 조건절)와 비 JOIN 서술부(WHERE 조건절)를 분리하여 이해가 쉽다.
  • 칼럼명이 다르더라도 JOIN 조건을 사용할 수 있는 장점이 있다.
  • 두 테이블간 특정 컬럼으로 EQUI JOIN 수행
  • 테이블 접두어를 명시해야 한다.
------WHERE절 혼용-------
SELECT E.ENAME, E.MGR,D.DEPTNO,D.DNAME
FROM EMP E JOIN DEPT D
ON(E.DEPTNO=D.DEPTNO)
WHERE E.MGR=7698;

------WHERE 혼용X-------------
SELECT E.ENAME,E.MGR,D.DEPTNO,D.DNAME
FROM EMP E JOIN DEPT D
ON(E.DEPTNO=D.DEPTNO AND E.MGR = 7698);

--------다중 테이블 JOIN---------------
--두 개의 쿼리문 결과 같음--
SELECT E.EMPNO, D.DEPTNO, D.DNAME, T.DNAME New_DNAME
FROM EMP E, DEPT D, DEPT_TEMP T
WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = T.DEPTNO;


SELECT E.EMPNO, D.DEPTNO,D.DNAME,T.DNAME NEW_DNAME
FROM EMP E 
JOIN DEPT D ON(E.DEPTNO = D.DEPTNO)
JOIN DEPT_TEMP T ON(E.DEPTNO = T.DEPTNO);

ON 조건절에 JOIN 조건 외에도 데이터 검색 조건을 추가할 수는 있으나, 검색 조건 목적인 경우는 WHERE 절을 사용할 것을 권고한다. (다만, 아우터 조인에서 조인의 대상을 제한하기 위한 목적으로 사용되는 추가 조건의 경우는 ON 절에 표기되어야 한다.)


CROSS JOIN

카타시안 곱 양쪽 집합의 M*N건의 데이터 조합이 발생

SELECT *
FROM EMP,DEPT;

위 쿼리문을 실행하면
EMP 테이블에 11개의 칼럼
DEPT 테이블에 3개의 칼럼이 존재하므로
14개의 칼럼이 생성되고

EMP 테이블에 12개의 행
DEPT 테이블에 4개의 행이 있어
총 48행의 데이터가 출력된다.


OUTER JOIN(LEFT,RIGHT,FULL)

  • JOIN 조건에서 동일한 값이 없는 행도 반환 가능하다.
  • SQL (+)기호를 조인 조건에서 정보가 부족한 칼럼 이름 뒤에 덧붙이는데 , (+) 안붙은 쪽으로 JOIN한다.
SELECT EMPLOYEE.ENAME || ‘의 매니저는 ’
          || MANAGER.ENAME || ‘입니다.FROM EMP EMPLOYEE, EMP MANAGER
WHERE EMPLOYEE.MGR = MANAGER.EMPNO(+);

-> 실행 결과

LEFT OUTER JOIN

  • 먼저 표기된 좌측 테이블에 해당하는 데이터를 읽은 후, 나중 표기된 우측 테이블에서 JOIN 대상 데이터를 읽어 온다.
  • 우측 값에서 같은 값이 없는 경우 NULL 값으로 채움.

EX) EMP테이블과 JOB테이블을 LEFT OUTER JOIN 하여 직원의 직무 정보를 조회

SELECT D.DEPTNO, D.DNAME,E.ENAME
FROM DEPT D
LEFT OUTER JOIN EMP E ON D.DEPTNO = E.DEPTNO;

RIGHTOUTER JOIN

LEFT OUTER JOIN의 반대임

EX) LEFT에서 한 예제를 RIGHT로

-- 위와 결과 같음--
SELECT D.DEPTNO, D.DNAME,E.ENAME
FROM EMP E
RIGHT OUTER JOIN DEPT D ON D.DEPTNO = E.DEPTNO

EX) DEPT에 등록된 부서 중에는 사원이 없는 부서도 있다. DEPT와 EMP를 조인하되 사원이 없는 부서 정보도 같이 출력하도록 한다.

SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E
RIGHT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;

FULL OUTER JOIN

  • 좌우측 테이블의 모든 데이터를 읽어 JOIN하여 결과를 생성한다
  • 중복된 데이터는 삭제한다.

EX) DEPT테이블과 DEPT_TEMP테이블을 DEPTNO 컬럼을 기준으로 FULL OUTER JOIN

SELECT *
FROM DEPT
FULL OUTER JOIN DEPT_TEMP ON DEPT.DEPTNO=DEPT_TEMP.DEPTNO;

INNER vs OUTER vs CROSS JOIN 비교

  • INNER JOIN - > 2건
    B-B, C-C
  • RIGHT OUTER JOIN -> 3건
    NULL-A, B-B,C-C
  • LEFT OUTER JOIN -> 4건
    B-B, C-C, D-NULL, E-NULL
  • FULL OUTER JOIN -> 5건
    NULL-A, B-B, C-C, D-NULL, E-NULL
  • CARTESIAN PRODUCT -> 12건
    B-A, B-B, B-C, C-A, C-B, C-C, D-A, D-B, D-C, E-A, E-B, E-C
profile
응애에요

0개의 댓글