postgresql - Union 부터 다중컬럼 서브 쿼리 까지

강신찬·2023년 5월 10일
0

UNION과 UNION ALL

  • 집합 연산자

    • 두 개 이상의 SELECT 결과(집합)에 대한 처리를 가능하게 하는 연산자, 두 집합 사이에 작성한다
    • 두 집합의 컬럼 수, 각 컬럼마다의 데이터 타입이 일치해야 가능
  • UNION / UNION ALL은 두 집합의 합집합을 나타내는 연산자

  • UNION vs UNION ALL

    • union
      • 중복된 값을 제거하여 하나만 출력, 중복을 제거하기 위해 정렬을 동반하기 때문에 쿼리 수행속도가 저하됨.
    • union all
      • 중복된 값 모두 출력

INTERSECT와 EXCEPT

  • intersect는 여러 집합의 교집합을 출력
  • except는 두 집합의 차집합을 출력하며, 타 framework(ex. oracle, mySQL)에선 MINUS에 해당한다.
  • 한 쪽 집합에만 표현된 정보를 집합 연산자를 통해 출력해야 하는 경우
select position, deptno
from emp
where deptno = 10
union
select '' as position, 100 as deptno
from emp
where deptno = 20

// '' as position, 100 as deptno와 같이 표현 가능, 이 때 기존 컬럼값이 아닌 as 앞의 갚이 대체되어 출력된다

서브쿼리

  • 상수를 대체하기 위해 서브쿼리 사용
  • select문의 결과를 그때그때 사용하여 비교할 경우
  • 쿼리 결과를 재사용하여 본문을 완성시켜야 할 때 사용
  • 조인의 대체 연산
  • 테이블을 한 번 스캔하는 것으로 표현이 불가능한 정보를 출력
  • 반드시 0으로 묶어줘야 함
  • 서브쿼리의 형태(사용되는 절에 따라)
    • 스칼라 서브 쿼리
      • select 절에 사용, 컬럼의 대체 표현식
      • select 컬럼명, (select ~)
    • 인라인 뷰
      • from 절에 사용, 테이블의 대체 표현식(조인 필요)
      • from 테이블, (select ~ )
    • 일반 서브쿼리
      • where 절에 사용, 상수의 대체 표현식
      • where 컬럼 = (select~)
  • 서브 쿼리의 형태(서브쿼리 결과에 따라)
    • 단일행 서브쿼리
      • 서브쿼리 결과가 단 하나의 행을 갖는 경우, =><연산자 사용 가능
    • 다중행 서브쿼리
      • 서브쿼리 결과가 두 개 이상의 행을 갖는 경우, =><연산자 사용 불가능, IN ANY ALL연산자 사용 가능
    • 다중 컬럼 서브쿼리
      • 서브 쿼리 결과가 두 개 이상의 컬럼을 갖는 경우, 주로 group by 연산 결과를 조건으로 사용할 경우 사용

다중행 서브쿼리(ANY, ALL)

  • ALL 연산자는 나열된 조건을 모두 만족하는 연산자
  • 크다, 작다 중 어느 조건과 결합하는지에 따라 서로 다른 의미
  • ex) ALL(100, 200)인 경우
    • 모두 보다 '크다' -> 200보다 큰 영역
    • 모두 보다 '작다' -> 100보다 작은 영역
  • ANY 연산자는 나열된 조건 중 하나만 만족해도 되는 연산자
  • 크다, 작다 중 어느 조건과 결합하는지에 따라 서로 다른 의미
  • ex) ANY(100, 200)인 경우
    • 100 보다 '크거나' 200보다 '크다' -> 100보다 큰 영역
    • 100 보다 '작거나' 200보다 '작다' -> 200보다 작은 영역

다중컬럼 서브쿼리

  • 단일 행, 다중 행 모두 가능
  • 비교하고자 하는 컬럼을 (컬럼1, 컬럼2)의 형태로 묶어서 전달
    • ex) where (deptno, pay) in (select deptno, min(pay) from p group by deptno);
  • 대소비교 불가

출처: https://velog.io/@bacccine/PostgreSQL-3135%EA%B0%95%EA%B9%8C%EC%A7%80%EC%9D%98-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC

profile
꾸준히 공부하는 백엔드 개발자

0개의 댓글

관련 채용 정보