: 하나의 SQL문 안에 포함된 또다른 SQL(SELECT)문
: 메인쿼리(기존쿼리)를 위해 보조 역할을 하는 쿼리문
: SELECT, FROM, WHERE, HAVGIN 절에서 사용가능
-- 부서코드가 노옹철 사원과 같은 소속의 직원의
-- 이름, 부서코드 조회하기
-- 전 직원의 평균 급여보다 많은 급여를 받고 있는 직원의
-- 사번, 이름, 직급코드, 급여 조회
: 서브쿼리의 조회 결과 값의 개수가 1개인 서브쿼리
: *단일행 서브쿼리 앞에는 비교 연산자 사용 가능 (<, >, <=, >=, =, !=/^=/<> )
전 직원의 급여 평균보다 많은(초과) 급여를 받는 직원의 이름, 직급, 부서, 급여를 직급 순으로 정렬하여 조회
가장 적은 급여를 받는 직원의 사번, 이름, 직급, 부서코드, 급여, 입사일을 조회
노옹철 사원의 급여보다 많이 받는 직원의 사번, 이름, 부서, 직급, 급여를 조회
부서별(부서가 없는 사람 포함) 급여의 합계 중 가장 큰 부서의 부서명, 급여 합계를 조회
: 서브쿼리 앞에는 일반 비교연산자 사용 x
: 서브쿼리의 조회 결과 값의 개수가 여러행일 때
: 아래 함수와 사용 가능
-> IN / NOT IN : 여러 개의 결과값 중에서 한 개라도 일치하는 값이 있다면 혹은 없다면 이라는 의미(가장 많이 사용!)
-> ANY, < ANY : 여러개의 결과값 중에서 한개라도 큰 / 작은 경우, 가장 작은 값보다 큰가? / 가장 큰 값 보다 작은가?
-> ALL, < ALL : 여러개의 결과값의 모든 값보다 큰 / 작은 경우, 가장 큰 값 보다 큰가? / 가장 작은 값 보다 작은가?
-> EXISTS / NOT EXISTS : 값이 존재하는가? / 존재하지 않는가?
부서별 최고 급여를 받는 직원의 이름, 직급, 부서, 급여를 부서 순으로 정렬하여 조회
사수에 해당하는 직원에 대해 조회, 사번, 이름, 부서명, 직급명, 구분(사수 / 직원)
대리 직급의 직원들 중에서 과장 직급의 최소 급여보다 많이 받는 직원의 사번, 이름, 직급, 급여를 조회하세요. 단, > ANY 혹은 < ANY 연산자를 사용하세요
차장 직급의 급여의 가장 큰 값보다 많이 받는 과장 직급의 직원 사번, 이름, 직급, 급여를 조회하세요. 단, > ALL 혹은 < ALL 연산자를 사용하세요
LOCATION 테이블에서 NATIONAL_CODE가 KO인 경우의 LOCAL_CODE와 / DEPARTMENT 테이블의 LOCATION_ID와 동일한 DEPT_ID가 / EMPLOYEE테이블의 DEPT_CODE와 동일한 사원을 구하시오.
: 서브쿼리 SELECT 절에 나열된 컬럼 수가 여러개 일 때
퇴사한 여직원과 같은 부서, 같은 직급에 해당하는 사원의 이름, 직급, 부서, 입사일을 조회
노옹철 사원과 같은 부서, 같은 직급인 사원을 조회하시오. (단, 노옹철 사원은 제외) 사번, 이름, 부서코드, 직급코드, 부서명, 직급명
2000년도에 입사한 사원의 부서와 직급이 같은 사원을 조회하시오. 사번, 이름, 부서코드, 직급코드, 고용일
77년생 여자 사원과 동일한 부서이면서 동일한 사수를 가지고 있는 사원을 조회하시오. 사번, 이름, 부서코드, 사수번호, 주민번호, 고용일
: 서브쿼리 조회 결과 행 수와 열 수가 여러개 일 때
본인 직급의 평균 급여를 받고 있는 직원의 사번, 이름, 직급, 급여를 조회하세요. 단, 급여와 급여 평균은 만원단위로 계산하세요 TRUNC(컬럼명, -4)
: 상관 쿼리는 메인쿼리가 사용하는 테이블값을 서브쿼리가 이용해서 결과를 만듦.
: 메인쿼리의 테이블값이 변경되면 서브쿼리의 결과값도 바뀌게 되는 구조임
: 상관쿼리는 먼저 메인쿼리 한 행을 조회하고, 해당 행이 서브쿼리의 조건을 충족하는지 확인하여 SELECT를 진행함
: [해석 순서]
메인쿼리 1행 -> 1행에 대한 서브쿼리
메인쿼리 2행 -> 2행에 대한 서브쿼리
...
메인쿼리의 행의 수 만큼 서브쿼리가 생성되어 진행됨
직급별 급여 평균보다 급여를 많이 받는 직원의 이름, 직급코드, 급여 조회
부서별 입사일이 가장 빠른 사원의 사번, 이름, 부서명(NULL이면 '소속없음'), 직급명, 입사일을 조회하고 입사일이 빠른 순으로 조회하세요. 단, 퇴사한 직원은 제외하고 조회하세요.
: SELECT절에 사용되는 서브쿼리 결과로 1행만 반환
: SQL에서 단일 값을 가르켜 '스칼라'라고 함
-->SELECT절에 작성되는 단일행 서브쿼리
모든 직원의 이름, 직급, 급여, 전체 사원 중 가장 높은 급여와의 차
각 직원들이 속한 직급의 급여 평균 조회 (스칼라 + 상관 쿼리)
모든 사원의 사번, 이름, 관리자사번, 관리자명을 조회. 단, 관리자가 없는 경우 '없음'으로 표시 (스칼라 + 상관 쿼리)
인라인뷰를 활용한 TOP-N분석 전 직원 중 급여가 높은 상위 5명의 순위, 이름, 급여 조회
급여 평균이 3위 안에 드는 부서의 부서코드와 부서명, 평균급여를 조회
: 서브쿼리에 이름을 붙여주고 사용시 이름을 사용하게 함
: 인라인뷰로 사용될 서브쿼리에 주로 사용됨
: 실행 속도도 빨라진다는 장점이 있다.
전 직원의 급여 순위 순위, 이름, 급여 조회
: 동일한 순위 이후의 등수를 동일한 인원 수 만큼 건너뛰고 순위 계산
EX) 공동 1위가 2명이면 다음 순위는 2위가 아니라 3위
: 동일한 순위 이후의 등수를 이후의 순위로 계산
EX) 공동 1위가 2명이어도 다음 순위는 2위
사원별 급여 순위 / ROWNUM
RANK() OVER(정렬순서)
DENSE_RANK() OVER
전지연 사원이 속해있는 부서원들을 조회하시오 (단, 전지연은 제외)
사번, 사원명, 전화번호, 고용일, 부서명
고용일이 2000년도 이후인 사원들 중 급여가 가장 높은 사원의
사번, 사원명, 전화번호, 급여, 직급명을 조회하시오.
노옹철 사원과 같은 부서, 같은 직급인 사원을 조회하시오. (단, 노옹철 사원은 제외)
사번, 이름, 부서코드, 직급코드, 부서명, 직급명
2000년도에 입사한 사원과 부서와 직급이 같은 사원을 조회하시오
사번, 이름, 부서코드, 직급코드, 고용일
77년생 여자 사원과 동일한 부서이면서 동일한 사수를 가지고 있는 사원을 조회하시오
사번, 이름, 부서코드, 사수번호, 주민번호, 고용일
부서별 입사일이 가장 빠른 사원의 사번, 이름, 부서명(NULL이면 '소속없음'), 직급명, 입사일을 조회하고 입사일이 빠른 순으로 조회하시오. 단, 퇴사한 직원은 제외하고 조회
직급별 나이가 가장 어린 직원의 사번, 이름, 직급명, 나이, 보너스 포함 연봉을 조회하고 나이순으로 내림차순 정렬하세요. 단, 연봉은 \124,800,000 으로 출력되게 하세요. (\ : 원 단위 기호)