TIL/서브쿼리

flobeeee·2022년 7월 25일
0

Today I Learned

목록 보기
26/35

☁️ 1. 서브쿼리란

하나의 SQL 문에 포함되어 있는 또 다른 SQL 문

☁️2. 서브쿼리를 쓰는 이유

장점

서브쿼리는 쿼리를 구조화시키므로, 쿼리의 각 부분을 명확히 구분할 수 있게 해준다.
서브쿼리는 복잡한 JOIN이나 UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공
서브쿼리는 복잡한 JOIN이나 UNION 보다 좀 더 읽기 편함 (가독성이 좋음)

☁️ 3. 서브쿼리의 분류

where 절에서 쓰는 서브쿼리가 가장 일반적인 형태이다.

3-1. 단일행 서브쿼리

비교 연산자(=, <, <=, >, >=, <>)와 함께 사용할 때, 반드시 결과건수가 1건이어야 함.
서브쿼리의 결과가 2건 이상인 경우 에러 발생
그룹함수를 사용하는 경우 결과가 1건이라서 사용가능

SELECT C1, C2, C3
FROM T1
WHERE C1 = (SELECT C1
  FROM T2
  WHERE C2 = '3')


SELECT C1, C2, C3
FROM T1
WHERE C1 <= (SELECT AVG(C1)
  FROM T2
   WHERE C2 = '3')

3-2. 다중행 서브쿼리

서브쿼리의 결과가 2건 이상 반환하면, 반드시 다중 행 비교 연산자(IN, ALL, ANY, SOME)와 함께 사용해야 함.

SELECT C1, C2, C3
FROM T1
WHERE C1 IN (SELECT C1
  FROM T2
  WHERE C2 = '3')

3-3. 다중컬럼 서브쿼리

여러 개의 컬럼을 반환해 메인쿼리의 조건과 동시에 비교함.

SELECT C1, C2, C3
FROM T1
WHERE (C1, C2) IN (SELECT C1, C2
  FROM T2
  WHERE C2 = '3')

3-4. 연관 서브쿼리

메인쿼리의 컬럼을 서브쿼리에서 사용.

SELECT T1.C1, T1.C2, T1.C3
FROM T1 T1
WHERE (T1.C1, T1.C2) IN (SELECT T2.C1, T2.C2
  FROM T2 T2
  WHERE T2.C2 = T1.C2)

3-5. 그 밖에 위치에서 사용하는 서브쿼리

  • select 절에서 사용(스칼라 서브쿼리)
    한 행, 한 컬럼만을 반환하는 서브쿼리
    데이터의 양이 많을수록 실행속도가 느려져서 거의 사용하지 않는다.
SELECT T1.C1, (SELECT AVG(T2.C1) FROM T2 T2)
FROM T1 T1;
  • from 절에서 사용(인라인 뷰)
    하나의 테이블처럼 사용한다. 꼭 AS 별칭을 명시해줘야 한다.
    동적으로 조인 방식을 사용하는 것 비슷
SELECT T1.C1, T2.C1, T2.C2
FROM T1 T1,
     (SELECT C1, C2 FROM T2) T2
WHERE T1.C1 = T2.C1;
  • having 절에서 사용
    그룹함수와 함께 사용될 때 그룹핑된 결과에 대해 부가적인 조건을 주기 위해 사용
SELECT T1.C1, T2.C1, T2.C2
FROM T1 T1, T2 T2
WHERE T1.C1 = T2.C1
GROUP BY T1.C1, T2.C1, T2.C2
HAVING AVG(T1.C1) < (SELECT AVG(C1)
                     FROM T2 );

☁️ 4. union vs union all

  • union :
    쿼리의 결과를 합친다. (distinct)

  • union all :
    쿼리의 결과를 합친다. (중복 O)
    중복을 제거하지 않아서 더 빠르다.


profile
기록하는 백엔드 개발자

0개의 댓글