[PostgreSQL] 31~35강까지의 내용 정리

bacccine·2022년 3월 11일
0

PostgreSQL

목록 보기
6/9

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

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 문의 결과를 그때그때 사용하여 비교할 경우
-쿼리 결과를 재사용하여 본문을 완성시켜야 할 때 사용
-조인의 대체 연산
-테이블을 한 번 스캔하는 것으로 표현이 불가능한 정보를 출력

-반드시 ()로 묶어줘야 함

-서브쿼리의 형태(사용되는 절에 따라)
(1) 스칼라 서브쿼리
select 절에 사용, 컬럼의 대체 표현식

select 컬럼명, (select ~)

(2) 인라인 뷰
from 절에 사용, 테이블의 대체 표현식(조인 필요)

from 테이블,(select ~)

(3) 일반 서브쿼리
where 절에 사용, 상수의 대체 표현식

where 컬럼 = (select~)

-서브쿼리의 형태(서브쿼리 결과에 따라)
(1) 단일행 서브쿼리
서브쿼리 결과가 단 하나의 행을 갖는 경우, =>< 연산자 사용 가능
(2) 다중행 서브쿼리
서브쿼리 결과가 두 개 이상의 행을 갖는 경우, =>< 연산자 사용 불가, IN ANY ALL 연산자 사용 가능
(3) 다중 컬럼 서브쿼리
서브 쿼리 결과가 두 개 이상의 컬럼을 갖는 경우, 주로 group by 연산 결과를 조건으로 사용할 경우 사용

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

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

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

다중컬럼 서브쿼리

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

0개의 댓글