본문 바로가기

진리는어디에

[MySQL] 서브(Sub) 쿼리

서브쿼리란?

하나의 테이블에서 검색한 결과를 다른 테이블에 전달하여 새로운 결과를 검색하는 것입니다. 예를 들어 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
염일웅
전은지
백미선

보다 더 간단해 지지요? 프로그램을 짤 때는 이것만큼 고마운게 없답니다.

부록 1. 같이 읽으면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!