ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 221226. DB 4. 서브쿼리
    스타터스 백엔드 3기 2022. 12. 26. 18:22

    하루입니다.

     


     

     


     

    서브쿼리란?

    • 쿼리문 안에 다른 쿼리문이 포함된 구문이다. 
    • 단일행 / 다중행 / 다중행 열 서브쿼리
    • 독립 서브쿼리 / 연관 서브쿼리
    • DB엔진은 괄호 안의 서브쿼리를 먼저 시행한다. 그리고 서브쿼리를 포함하는 외부쿼리를 실행하여 서브쿼리와 같은(혹은 조건에 맞는) 것을 조사하여 출력한다. 일반 언어에서 함수 호출을 중첩하는 것과 같다.

     

     

    서브쿼리 예시

    1. 단일행 서브쿼리

    • 행이 하나만 return 되기에 = 연산자를 사용해도 된다.

     

     

     

    • 단일행 서브쿼리의 결과는 1개의 행을 리턴해야 한다. peter는 50번, 80번 두 개 부서에 존재한다.
    • 그렇지 않아서 생기는 오류이다.
    • WHERE department_id = 50, 80이 된다.

     

     

     

    2. 다중행 서브쿼리

    • WHERE department_id in (50, 80) 이 된다.
    • 서브쿼리의 결과가 여러개인 것을 다중행 서브쿼리라고 한다.
    • IN 연산자를 사용해야 한다. =는 RETURN값이 하나일 때 사용한다.

     

     

     

    3. 다중열 서브쿼리

    • 결과의 컬럼도 여러개이며, 여러개의 값과 비교하는 것이다.

     

     

     


     

     

    서브쿼리 연산자 : ANY, ALL

    • any: 하나라도 만족하는 값이 있어야 한다. (or)
    • all : 조건을 모두 만족해야 한다. (and)

     

    위는 최댓값, 밑은 최소값

     

     

     


     

     

     

    연관 서브쿼리

    • 이때까지의 서브쿼리들은 서브쿼리만 실행할 수 있었다.
    • 하지만 연관 서브쿼리는 서브쿼리만 실행할 수 없다. 
    • 조인처럼 테이블에 별칭을 붙여서 서브쿼리 내에서 사용하기 때문이다. 서브쿼리만 실행하려 해도 별칭이 필요하기에 실행 불가하다.
    • 연관 서브쿼리는 외부필드의 필드값을 참조하며, 단독 실행 불가하다.
    • 독립 서브쿼리는 외부쿼리에 값을 제공하는 역할을 한다.
    • 흠 그런데 왜 굳이 조인 안 사용하고 이걸 사용하지? 효율이 좋나? 조인을 쿼리로 바꾼 느낌이다. 
    • 출력 결과가 단순할 때 조인문 대신 간편하게 쓸 수 있다고 한다. 
    • select에서 e.를 사용하면 연관 서브쿼리, where에서 e.를 사용하면 조인문이 되는 느낌

     

     

     

     

     


     

     

    인라인뷰

    • 서브쿼리는 주로 아래의 세 군데에서 사용한다.
    • where : 조건에 사용할 을 찾는다.
    • select : 출력할 을 찾는다.
    • from : 출력 대상 테이블을 생성한다.
    • 이 중 FROM절의 서브쿼리를 인라인뷰라고 한다.
    • 뷰는 테이블의 정보를 가지는 DB 오브젝트이다. 
    • 서브쿼리에서 잠시 만들어졌다 사라지는 뷰라서 INLINE VIEW라고 한다.
    • 인라인뷰를 사용하기 위해서는 더 복잡하고 골치 아픈 문제가 제격이다.
    • 가상 테이블을 만들고 그 테이블을 사용하는! 큰 문제를 작은 문제로(복합조건) 만드는 것!
    • 사용되고 사라질 거라 이름이 없다. 별칭을 주자.

     

     

     

     


     

     

    CASE WHEN ELSE END,  IFNULL

    • CASE. SWITCH 느낌 !!
    • 위는 조건을 하나하나 주었다.
    • 밑은 인라인뷰를 사용해서 이름과 임시월급계산을 IMSITABLE에 넣는다.
    • IMSISAL에는 임시월급계산값이 있기에, 위의 식 대신 INSISAL을 넣어도 동일하게 동작한다.
    • IFNULL은 만약 값이 NULL일 경우에 값을 지정하는 것이다.
    • IFNULL(지정 컬럼명, 데이터)

     

     


     

     

    서브쿼리 중첩 (join?)

     

     

     


     

     

     

    테이블 조합 

    • 2개의 물리적인 테이블로 나뉘어잇다가 select시 합쳐서 조회한다.
    • 조합 테이블의 컬럼, 갯수, 타입, 순서가 일치해야한다.
    • 서브쿼리보다는 멀티쿼리 개념으로 보자.

     

    1. UNION (all)

    • 합집합이다.
    • UNION은 중복값이 나오지 않는다.

     

     

    • UNION ALL은 중복값도 포함한다.

     

     

    2. INTERSECT

    교집합이다.

     

     

     

     

    3. MINUS (except)

    마리아db에서는 except이다.

    차집합이다.

     

     

     

    4. MERGE

    • 바뀐건 UPDATE하고 지워진건 INSERT한다.
    • UPSERT라고도 한다.

     

     

     


     

     

Designed by Tistory.