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