서브쿼리란?
하나의 테이블에서 검색한 결과를 다른 테이블에 전달하여 새로운 결과를 검색하는 것입니다. 예를 들어 A라는 테이블에서 검색해 나온 결과만을 대상으로 다시 한번 더 쿼리를 날린다는 것입니다. 참고로 하나 이상의 테이블을 연결하여 검색하는 기능은 조인(Join) 쿼리라고 합니다.
기본 문법
SELECT coulmn_name FROM table_name WHERE column_name = (
SELECT column_name FROM table_name WHERE column_name = some_value
);
생각 보다 간단하지 않나요? 기본적인 것은 일반 쿼리와 동일 합니다. 다만, where 에 조건으로 오는 것이 일반 컬럼이 아니라 또 다른 쿼리라는 것이 차이점 입니다. 실행 순서는 괄호 안에 있는 쿼리를 먼저 실행 하고 해당 쿼리에서 나오는 결과를 이용해 괄호 바깥쪽의 쿼리를 실행 합니다. 물론, 서브 쿼리 안에 또 다른 서브 쿼리를 얼마든지 중첩해서 쓸 수 있습니다. 다만 쿼리가 좀 복잡 해지겠지요
예를 들어 볼까요?
professor라는 테이블이 있다고 생각 해 봅시다. 이 테이블에는 교수의 지위(정교수, 부교수, 시간강사, 전임강사 등등..)와 각 교수들의 이름이 들어 있습니다. 이 테이블을 대상으로 'kukuta'라는 사람의 지위와 같은 위치에 있는 사람들을 검색하고 싶다..라고 상황을 만들어 봅시다. 만일 서브 쿼리가 없다면 아래와 같이 쿼리를 두 번 작성 하겠지요 :
SQL> SELECT position FROM professor WHERE name = 'kukuta';
POSITION
--------------------
전임강사
SQL> SELECT name FROM professor WHERE position = '전임강사';
NAME
----------
kukuta
염일웅
전은지
백미선
사람이 직접 한다면야 눈으로 보고 첫 번째 쿼리의 결과를 기억했다가 두 번째 쿼리를 만들면 됩니다만...프로그램(C/C++ API 같은..)을 이용 한다면 첫번째 결과를 어딘가에 저장했다가 두 번째 쿼리를 만들 때 넣어 줘야만 합니다. 마냥 불편 하지요.
하지만 서브 쿼리가 있다면 다음 처럼 한번의 쿼리로 모든 것을 해결 할 수 있습니다 :
SQL> SELECT name FROM professor WHERE position = (
SELECT position FROM professor WHERE name = 'kukuta'
);
NAME
----------
kukuta
염일웅
전은지
백미선
보다 더 간단해 지지요? 프로그램을 짤 때는 이것만큼 고마운게 없답니다.