네이버클라우드 캠프 5기/학습내용 정리

14. ORACLE - Join & SubQuery

박세류 2023. 4. 13. 16:29

1. Join

1. RDB(Relational Data Base)

  1. RDB는 관계형 데이터 베이스를 의미하는 단어로 데이터의 이상현상을 방지하고 무결성을 보장하기 위해 정규화과정을 통해서 여러개의 테이블에 데이터를 분산시키고 그 데이터들의 관계를 형성해주는 데이터 베이스
  2. RDB에서 분산되어 있는 데이터들을 함께 조회할 때 Join을 사용해서 두 개 이상의 테이블에서 데이터를 조회한다.
  3. Join의 종류
    • Inner Join : 두 테이블의 교집합, 공통된 값의 데이터를 조회
    • Outer Join
      • Left Outer Join : 기준이 되는 테이블의 교집합을 뺀 부분과 교집합이 되는 부분을 동시에 조회. 차집합 + 교집합
      • Right Outer Join : 조인되는 테이블의 교집합을 뺀 부분 과 교집합이 되는 부분을 동시에 조회
      • 게시판 테이블과 첨부파일 테이블이 존재할 때 첨부파일이 있는 게시글과 첨부파일 없는 게시글을 동시에 가져올 때 OUTER JOIN을 이용한다.
      • FULL OUTER JOIN : LEFT + RIGTH OUTER JOIN을 한 결과다. 서로의 차집합 + 교집합.

2. INNER JOIN

  1. INNER JOIN은 두 테이블의 공통된 데이터를 조회
    • FROM 테이블A
      (INNER) JOIN 테이블B
      ON 테이블A의 공통컬럼 = 테이블B의 공통컬럼
    • ON절은 조인 조건 공통된 데이터를 찾는 조건 -> 공통된 컬럼을 지정
    • INNER JOIN의 다른 형태
      FROM 테이블A
      , 테이블B
      WHERE ON절의 조인조건
  2. ANSI 표준
    • 어떤 DBMS에서도 실행되는 쿼리의 형태
    • DBMS을 변경해도 문제없이 쿼리가 실행된다.
    • 오라클에서 DB 비즈니스버전 판매에 고가정책을 펼치고 있기 때문에 중소기업들에서 탈 오라클하는 추세가 이어지고 있다.
    • LEFT OUTER JOIN => WHERE 테이블A.공통컬럼 = 테이블B.공통컬럼(+) : 오라클에서만 가능한 outer조인 방식
  3. JOIN 시 주의점
    • 항상 어떤 테이블의 어떤 컬럼을 사용할 지 명시한다.
    • 공통된 컬럼은 하나의 테이블에서만 조회할 수 있도록 한다.
  4. 등가조인과 비등가조인
    • 등가조인은 조인조건에서 공통된 컬럼의 값이 같은(=) 조건에 해당하는 조인
    • 비등가조인은 조인조건에서 값의 의미가 동일한 데이터들의 대소비교를 해주는 형식의 조인(>, <, >=, <=)
  5. 잘못된 조인(Cross Join)
    • 두 개 이상의 테이블을 사용하여 조인할 때 조인 조건을 명시하지 않으면 Cross Join상태가 된다.
    • 테이블들의 모든 행들이 1:1로 교차되어 의미가 없어진 결과값이 조회된다.
  6. 셀프조인
    • FROM절의 테이블과 조인되는 테이블이 같을 경우 셀프조인이라고 부른다.
    • 셀프조인할 때 조인되는 테이블에 무조건 별칭을 붙여야한다.

3. Outer Join

  1. INNER JOIN + 기준 테이블에서 INNER JOIN의 데이터를 제외한 데이터를 찾아서 조회 => 교집합 + 차집합
  2. LEFT OUTER JOIN
    • FROM 테이블A
      LEFT (OUTER) JOIN 테이블B
      ON 조인조건 : 테이블A에서 INNER JOIN한 데이터를 제외한 데이터가 존재하는 지 찾아서 INNER JOIN 데이터와 함께 조회
  3. RIGHT OUTER JOIN
    • FROM 테이블A
      RIGHT (OUTER) JOIN 테이블B
      ON 조인조건 : 테이블B에서 INNER JOIN한 데이터를 제외한 데이터가 존재하는 지 찾아서 INNER JOIN 데이터와 함께 조회
  4. 오라클에서만 지원하는 LEFT/RIGHT OUTER JOIN
    • LEFT OUTER JOIN : WHERE 테이블A의 컬럼 = 테이블B의 컬럼(+)
    • RIGHT OUTER JOIN : WHERE 테이블A의 컬럼(+) = 테이블B의 컬럼
  5. FULL OUTER JOIN
    • FROM 테이블A
      FULL OUTER JOIN 테이블B
      ON 조인조건 : 양 쪽 테이블에서 INNER JOIN한 데이터를 제외한 데이터가 존재하는 지 찾아서 INNER JOIN한 데이터와 함께 조회

4. 다중 테이블 조인

  1. 세 개이상의 테이블이 조인될 때는 조인조건1 테이블A = 테이블B => 테이블A와 테이블B의 관계가 형성된 상태
  2. 테이블A, 테이블B 중에서 세 번째 테이블C와 관련있는 컬럼을 가지고 있는 테이블로 다시 조인. 조인조건2 테이블B = 테이블C => 테이블B와 테이블C의 관계 형성 => 테이블A와 테이블C는 자동으로 관계가 형성된다.
  3. 다중 조인
    • ANSI SQL방식
      FROM 테이블A
      JOIN 테이블B
      ON 조건1
      JOIN 테이블C
      ON 조건2
      ...
    • FROM 테이블A
      , 테이블B
      , 테이블C
      .....
      WHERE 조건1(A = B)
      AND 조건2(A = C)
      .... => 조건의 테이블 관계 형성 순서는 정해져있지 않고 아무 관계나 먼저 생성해도 된다.

1. SubQuery

1. SubQuery

  1. 서브쿼리는 다수의 쿼리를 결합하여 하나의 쿼리로 표현
  2. () 묶어서 하나의 쿼리를 마치 가상의 테이블처럼 사용
  3. SELECT절, FROM절, WHERE절에 사용할 수 있다.
  4. 서브쿼리는 단일 행 서브쿼리, 다중 행 서브쿼리, 다중 열 서브쿼리 세 개로 분류한다.
    • 단일 행 서브쿼리 : 서브쿼리의 결과가 하나의 행만 가져오는 쿼리. 테이블로도 사용가능하고 WHERE절에서 조건으로도 SELECT절에서 조회할 컬럼으로도 사용이 가능하다. WHERE절에서 사용할 때 단일연산자(=, !=, >, <, >=, <=...)와 주로 사용된다. 단일연산자 오른쪽에 작성.
    • 다중 행 서브쿼리 : 서브쿼리의 결과가 여러개의 행을 가져오는 쿼리. 테이블이나 WHERE절의 조건으로만 사용가능(IN절).
    • 다중 열 서브쿼리 : 서브쿼리의 결과가 여러개의 열을 가져오는 쿼리.

2. 집합 연산자

  1. 집합연산자는 테이블의 합집합, 교집합, 차집합을 구해주는 함수(오라클내에 구현되어 있는 펑션)
  2. 합집합 연산자, 교집합 연산자, 차집합 연산자 세 개로 분류
    • 합집합 연산자 : UNION, UNION ALL
    • 교집합 연산자 : INTERSECT
    • 차집합 연산자 : MINUS
  3. 합집합 연산자
    • UNION : 중복된 데이터가 삭제된 상태로 합집합 연산. 각각의 쿼리에서 조회된 결과를 합쳐주는 역할.
    • UNION ALL : 중복제거 없이 각각의 쿼리에서 조회된 결과를 합쳐주는 역할.
    • 조회쿼리1
      UNION/UNION ALL/MINUS/INTERSECT
      조회쿼리2
    • 데이터 결과의 컬럼 개수는 조회쿼리1에서 결정된다.
    • 데이터 결과의 컬럼 개수, 컬럼 타입, 컬럼의 명칭은 조회쿼리1에서 결정된다.
    • 조회쿼리1과 조회쿼리2의 결과의 컬럼 개수, 데이터 타입일치해야 된다.
  4. 차집합 연산자
    • MINUS : 위의 쿼리의 결과에서 아래 쿼리의 결과를 제외한 데이터를 조회
    • 조회쿼리1
      MINUS
      조회쿼리2
  5. 교집합 연산자
    • INTERSECT : 조회쿼리1의 결과와 조회쿼리2의 결과중 중복된 데이터만 조회.

1. 추가적인 조인 방식

1. Natural Join

  1. 두 테이블을 조인할 때 조인될 칼럼을 명시하지 않아도 조인될 컬럼을 자동으로 추적하여 두 테이블을 조인해주는 방식의 조인
  2. SELECT
    FROM 테이블A
    NATURAL JOIN 테이블B;

2. JOIN ~ USING(==ON)

  1. FROM 테이블 A
    JOIN 테이블 B
    USING 조인될 컬럼(컬럼 하나만 명시)
  2. 조인될 컬럼에는 테이블의 별칭을 사용할 수 없다.

2. 다중 컬럼 IN

1. IN

  1. 컬럼 하나를 여러개의 데이터와 비교할 때 사용하는 구문
  2. DNO IN('10', '20', '30') => DNO = '10' or DNO = '20' or DNO = '30'

2. 다중 컬럼 IN

  1. 컬럼 여러개를 여러개의 데이터와 비교해주는 구문
  2. (컬럼1, 컬럼2) IN ((컬럼1의 데이터1, 컬럼2의 데이터1), (컬럼1의 데이터2, 컬럼2의 데이터2) ......) => (컬럼1 = 컬럼1의 데이터1 and 컬럼2 = 컬럼2의 데이터1) or (컬럼1 = 컬럼1의 데이터2 and 컬럼2 = 컬럼2의 데이터2)...
  3. 컬럼1 IN(데이터1, 데이터2) AND 컬럼2 IN (데이터1, 데이터2) => 데이터1 and 컬럼2 = 데이터1 or 컬럼1 = 데이터1 and 컬럼2 = 데이터2.......

3. 가상테이블을 WITH절

1. WITH절

  1. 서브쿼리로 테이블을 만들어서 사용하기에는 데이터가 너무 많거나 현재 작업에 불필요한 열이 많아서 일부 행과 일부 열만 사용하고자 할 때 사용하는 구문
  2. 가상의 테이블을 만들어주는 역할을 하는 구문이다.
  3. 본문 SELECT 구문 전에 작성
    WITH
     가상테이블의 별칭1 AS (가상테이블로 사용할 쿼리1),
     가상테이블의 별칭2 AS (가상테이블로 사용할 쿼리2),
     ....
     가상테이블의 별칭N AS (가상테이블로 사용할 쿼리N)
    본문 SELECT 구문
     FROM 별칭1, 별칭2, ..., 별칭N
반응형

'네이버클라우드 캠프 5기 > 학습내용 정리' 카테고리의 다른 글

16. ORACLE - DDL  (0) 2023.05.02
15. ORACLE - DML  (0) 2023.05.02
13. ORACLE - Select  (0) 2023.04.13
12. Oracle - SQL  (0) 2023.04.12
11. Oracle - Database  (0) 2023.04.12