Day04-2. 서브쿼리 (SubQuery)

이하연·2023년 2월 13일

DBMS 교육

목록 보기
14/22
post-thumbnail

레스토랑에 가면 메인과 함께 사이드 메뉴가 같이 딸려나오는 때가 있죠. 주인공도 서브 캐릭터가 있듯이요. 이는 SQL에게도 똑같이 작용합니다.

쿼리문에게도, 서브는 존재합니다.

서브쿼리(SubQuery)


(출처: Advanced SQL Querieshttps://bit.ly/40RZYy0)

사실 우리가 여태까지 쓰고 있던 쿼리문은 메인 쿼리문입니다. 이를 돕기 위하여 서브쿼리(SubQuery)라는 것이 또 존재하는데요.

이는 메인 쿼리를 구성하는 소단위의 쿼리입니다. SQL의 모든 절(select, insert, delete, update)에서 사용이 가능하며, 서브쿼리의 집합 결과를 메인 쿼리는 중간 결과 값으로 사용하게 됩니다. 그러나, 방식이 다르지는 않습니다.

메인 쿼리와 서브 쿼리는 딱히 다를 바가 없거든요.

1. 작성 방법

(쿼리문)

작성 방법도 간단합니다. 이는 단순히 () 소괄호 안에 쿼리문을 작성해주시면 됩니다.

쓰는 방식도, select ~ from 도 메인 쿼리를 작성하는 것과 완전히 똑같습니다.

코드로 볼까요?

위의 예시는 WHERE에서 원하는 결과 값을 받아오기 위해 (평균보다 낮은 연봉을 받는 사람들) 서브쿼리문을 더해준 모습입니다. 서브쿼리로 평균 연봉을 받아온 후, 직원들의 연봉을 계산해주는 것이죠.

그리하면 아래와 같이 평균보다 낮은 연봉을 받고 있는 사원들이 나타납니다.

IN 문을 사용할 수도 있습니다.

위의 서브쿼리문은 ID를 조회하지 않고도 나라 아이디가 US(미국)인 사원들을 받아오기 위해 조건문과 함께 설정해준 결과입니다.

그럼 결과 값을 볼까요?

위와 같이 미국에 있는 사원들을 조회한 것을 보실 수 있습니다. Having 문을 통해서도 접근할 수 있어 유용히 사용됩니다.

2. *개인적으로 어려웠던 문제 풀이

위의 예시들과 더불어서 오늘 교육 중 가장 어려웠던 (개인 생각) 문제를 하나 들고 와봤습니다. 풀이해두는게 제게도 더 도움이 될테니까요.

우선, 문제는 이렇습니다.

업무별로 최소 급여를 받는 사원의 정보를
-- 사원번호,이름,업무,부서번호를 출력하여라.
-- 단 업무별로 정렬하여라.

문제만 봐서는 쉬운 듯, 어려운 듯 해서 우선 쿼리부터 짜놓고 생각했습니다.

제가 생각했던 절차는 이렇습니다.

  1. Select 문으로 사원 번호, 이름, 업무, 부서 번호 출력
  2. From 문에 Employees 테이블 가져오기
  3. Where 문 통해 직원의 급여(Salary) 는(=) 서브쿼리 문으로 업무별(Group by) 최소 금액(MIN 함수에 Salary) 조회
  4. 출력!

하지만.. 그는 아니었습니다.

안 불려집니다..


문법 오류는 없어보이는데... SQL 커맨드가 제대로 안 끝났다고 뭐라뭐라 하네요.

암만 봐도.. 없으니 이건 그냥 잘못 짰다는 거겠지. 근데 새로 하면 똑같은 오류가 반복되어 결국 타임아웃이 되었습니다.

이제부터 정확한 풀이를 하겠습니다.

큰 틀은... 대충 맞았습니다. 이걸 한 끗 차이라고 해야 할지, 두 끗 차이라고 해야 할지. 애매하지만 얼추 맞긴 한데 놓친 부분이 있었습니다.

우선, 정확한 절차는 이러합니다.

1. (From 문까지 위의 것과 일치)
2. WHERE 문으로 ()괄호 통해 급여와 업무 둘다 조회
3. 이어서 IN문에 서브쿼리로 업무(JOB_ID)와 최소 급여 Group by로 업무별 조회
4. 출력!

(feat. 그냥 반을 틀린 것 같기도?)

위의 절차에 따라 코드를 짜면 이렇게 됩니다.


전혀 생각치도 못했던 쿼리였지만, 하나씩 뜯어보니 이해는 되었습니다.

그리하여, 이로 인한 결과 값은 아래처럼 나옵니다.

최소 급여들을 받는 사원들이 보이죠? 이런 데이터가 나오면 성공하신 겁니다.

끝!

이로서 DBMS의 서브쿼리(SubQuery) 문의 설명을 마칩니다. 다음 포스팅에서 뵙겠습니다.

profile
애옹.

0개의 댓글