이 두 개념은 하나의 쿼리 안에 메인 쿼리(A 테이블)와 서브 쿼리(B 테이블)가 나눠져 있다는 가정 하에 정의된다. 이를 중첩 서브 쿼리라고 한다.
서로 상충되는 이 개념은 서브 쿼리의 출력 여부로 차이가 발생한다.
세미 조인(SEMI JOIN)
B 테이블에 존재하는 데이터만 A 테이블에서 출력한다. 조회 조건에서 IN 이나 EXISTS 연산자를 사용한다.
즉 IN 혹은 EXISTS 뒤에 오는 조건에 부합하는 A 테이블의 Row만 가져와 출력하는 것이다.
EX) mgr_start_date가 80년대인 부서에 속하는 employee의 정보를 출력하라.
select * from employee a, department b
-> where a.dno = b.dnumber and a.dno
-> in (select dnumber from department where date(mgr_start_date) between '1980-01-01' and '1990-01-01');
80년대에 만들어진 부서인 1, 5번 부서에 일하는 직원인 John, Franklin, Joyce, Ramesh, James의 employee 정보와 해당 department 정보가 잘 출력되었다.
안티 조인(ANTI JOIN)
B 테이블에는 없는 A 테이블의 데이터만 추출하여 출력한다. 조회 조건에서 NOT IN 이나 NOT EXISTS 연산자를 사용한다.
즉 NOT IN 혹은 NOT EXISTS 뒤에 오는 쿼리문에 의해 불러온 Row들을 제외하고 A 테이블의 결괏값을 출력하는 것이다.
Ex) 80년대에 만들어지지 않은 부서에 속한 employee의 정보를 출력하라.
select * from employee a, department b
-> where a.dno=b.dnumber and a.dno
-> not in (select dnumber from department where date(mgr_start_date) between '1980-01-01' and '1990-01-01');
'Major Study > Database Design' 카테고리의 다른 글
데이터베이스 설계 Query 작성 예제 33제 모음(WHERE, JOIN, EXISTS, GROUP BY 등) (0) | 2022.10.23 |
---|---|
내부 조인/외부 조인의 종류와 분류 (0) | 2022.10.21 |