개발자 끄적끄적

join, intersect, connect by, main query, sub query 본문

MySQL

join, intersect, connect by, main query, sub query

햏치 2023. 3. 8. 00:31

<해시 조인(HASH JOIN)>
- 해시 조인은 먼저 선행 테이블을 결정하고 선행 테이블에서 주어진 조건(WHERE구)에 해당하는 행을 선택한다
- 해당 행이 선택되면 조인 키(JOIN KEY)를 기준으로 해시 함수를 사용해서 해시 테이블을 메인 메모리(MAIN MEMORY)에 생성하고
  후행 테이블에서 주어진 조건에 만족하는 행을 찾는다
- 후행 테이블의 조인 키를 사용해서 해시 함수를 적용하여 해당 버킷을 검색한다
- 해시 조인은 EQUI JOIN만 사용 가능한 방법이다
- 해시 함수는 테이블을 해시 메모리에 적재한 후에 해시 함수로써 연결하는 방법이다


<INTERSECT 연산>
- INTERSECT 연산은 두 개의 테이블에서 교집합을 조회한다
- 즉, 두 개 테이블에서 공통된 값을 조회한다


<Non-EQUI(비등가) JOIN>
- Non-EQUI는 두 개의 테이블 간에 조인하는 경우 "="을 사용하지 않고
  ">", "<", ">=", "<=" 등을 사용한다
- 즉, Non-EQUI JOIN은 정확하게 일치하지 않는 것을 조인하는 것이다


<OUTER JOIN>
- 두 개의 테이블 간에 교집합(EQUI JOIN)을 조회하고 한쪽 테이블에만 있는 데이터도 포함시켜서 조회한다
- 이 때, 왼쪽 테이블에만 있는 행도 포함하면 LEFT OUTER JOIN이라고 하고 오른쪽 테이블의 행만 포함시키면
  RIGHT OUTER JOIN이라고 한다
- FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN 모두를 하는 것이다
- ORACLE 데이터베이스에서는 OUTER JOIN을 할 때 "(+)" 기호를 사용해서 할 수 있다



<CROSS JOIN>
- 조인 조건구 없이 2개의 테이블을 하나로 조인한다
- 조인구가 없기 때문에 카테시안의 곱이 발생한다
- CROSS JOIN은 FROM 절에 "CROSS JOIN" 구를 사용하면 된다
ex) SELECT * FROM EMP CROSS JOIN DEPT;


<UNOIN> - 중복제거
- 두 개의 테이블을 하나로 만드는 연산이다
- 즉, 2개의 테이블을 하나로 합치는 것이다
  주의사항은 두 개의 테이블의 칼럼 수, 칼럼의 데이터 형식 모두가 일치해야 한다
  만약 두 개의 테이블에 UNION 연산이 사용될 때 칼럼 수 혹은 데이터 형식이 다르다면 오류가 발생한다
- UNION 연산은 두 개의 테이블을 하나로 합치면서 중복된 데이터를 제거한다
- UNION은 정렬(Sort) 과정을 발생시킨다


<UNION ALL> - 중복제거X
- 두 개의 테이블을 하나로 합치는 것이며 UNION처럼 중복을 제거하거나 정렬을 유발하지 않는다


<차집합을 만드는 MINUS>
- 두 개의 테이블에서 차집합을 조회한다
  즉, 먼저 쓴 SELECT문에는 있고 뒤에 쓰는 SELECT문에는 없는 집합을 조회하는 것이다
ex) SELECT DEPTNO FROM DEPT //10, 20, 30, 40 데이터가 존재
     MINUS
     SELECT DEPTNO FROM EMP; //10, 20, 30 데이터가 존재
  => DEPT 테이블의 DEPTNO 중 40만 조회되었다. 즉, EMP 테이블에는 DEPTNO 40이 없다



<계층형 조회(CONNECT BY)>
- 계층형 조회는 Oracle 데이터베이스에서 지원하는 것으로 계층형으로 데이터를 조회할 수 있다
- CONNECT BY는 트리(Tree) 형태의 구조로 질의를 수행하는 것으로 START WITH구는 시작 조건을 의미하고
  CONNECT BY PRIOR는 조인 조건이다
  Root 노드로부터 하위 노드의 질의를 실행한다
- 계층형 조회에서 MAX(LEVEL)을 사용하여 최대 계층 수를 구할 수 있다
  즉, 계층형 구조에서 마지막 Leaf Node의 계층값을 구한다


<계층형 조회>
1. START WITH 조건 : 계층 전개의 시작 위치를 지정하는 것이다
2. PRIOR 자식 = 부모 : 부모에서 자식방향으로 검색을 수행하는 순방향 전개이다
3. PRIOR 부모 = 자식 : 자식에서 부모방향으로 검색을 수행하는 역방향 전개이다
4. NOCYCLE : 데이터를 전개하면서 이미 조회된 테이터를 다시 조회되면 CYCLE이 형성된다
                 이 때, NOCYCLE은 사이클이 발생되지 않게 한다
5. Order siblings by 컬럼명 : 동일한 LEVEL인 형제노드 사이에서 정렬을 수행한다


<Main query | Sub query>
- SUB QUERY는 SELECT문 내에 다시 SELECT문을 사용하는 SQL문이다
- SUB QUERY의 형태는 FROM구에 SELECT문을 사용하는 인라인 뷰(Inline View)와 SELECT문에 SUB QUERY를 사용하는
  스칼라 서브쿼리(SCALA SUBQUERY)등이 있다
- WHERE구에 SELECT문을 사용하면 서브쿼리(SUB QUERY)라고 한다
ex) SELECT *
    FROM EMP
    WHERE DEPTNO = //Main Query
                             (SELECT DEPTNO FROM DEPT
                             WHERE DEPTN=10) //Sub Query
=> WHERE구에 있는 SELECT문은 서브쿼리(SUB QUERY)이고 괄호 내에 SELECT문을 사용한다
     서브쿼리 밖에 있는 SELECT문은 메인쿼리(MAIN QUERY)이다

ex) SELECT * 
     FROM (SELECT FOWNUM NUM, ENAME
              FROM EMP) a
              WHERE NUM < 5;
=> FROM구에 있는 SELECT문을 인라인 뷰(Inline View)라고 한다
=> FROM구에 SELECT문을 사용하여 가상의 테이블을 만드는 효과를 얻을 수 있다


<단일 행 서브쿼리와 다중 행 서브쿼리>
- 서브쿼리(SUB QUERY)는 반환하는 행 수가 한 개인 것과 여러 개인 것에 따라서 단일 행 서브쿼리와 멀티 행 서브쿼리로 분류된다
- 단일 행 서브쿼리는 단 하나의 행만 반환하는 서브쿼리로 비교 연산자(=, <, <=, >=, <>)를 사용한다
- 다중 행 서브쿼리는 여러 개의 행을 반환하는 것으로 IN, ANY, ALL, EXISTS를 사용해야한다
  1. IN(SUB QUERY) 
   - MAIN QUERY의 비교조건이 SUB QUERY의 결과 중 하나만 동일하면 참이 된다(OR 조건)
  2. ALL(SUB QUERY)
   - MAIN QUERY와 SUB QUERY의 결과가 모두 동일하면 참이 된다
  3. ANY(SUB QUERY)
   - MAIN QUERY의 비교조건이 SUB QUERY의 결과 중 하나 이상 동일하면 참이 된다
  4. EXISTS(SUB QUERY)
   - MAIN QUERY와 SUB QUERY의 결과가 하나라도 존재하면 참이 된다