서브쿼리
쿼리 안에 있는 쿼리
SELECT 문 중 SELECT,FROM,WHERE,HAVING 절에서 사용 가능(GROUP BY, ORDER BY 불가능)
한 행만 읽었을 때 가져올 수 없는 결과를 더 가져오기 위해서 사용.
EX. 사원 중 급여가 평균 이상인 사원을 뽑고 싶다? -> 급여 평균을 먼저 구해야하기에 서브쿼리 사용.
서브쿼리의 분류 (위치에 따라)
스칼라 서브쿼리 : SELECT문 칼럼 입력 위치
인라인 뷰 : FROM절의 테이블 입력 위치
중첩 서브쿼리 : WHERE절, HAVING절의 칼럼 또는 테이블 입력 위치.
단일 행 서브쿼리
서브쿼리 결과가 하나의 행이기에 단순비교연산자(=,>,< 등) 사용 가능
행이 하나 ! 예를 들면 사원의 급여 평균, 합
다중 행 서브쿼리
결과가 둘 이상의 행이기에 단순비교 사용 불가. IN, ANY, ALL 등의 연산자 사용 가능 (ALL은 최대, ANY는 최소)
행이 두 개 이상! 예를 들면 급여가 1000 이하인 행의 부서 번호들
다중 컬럼 서브쿼리
컬럼이 두 개 이상! 예를 들면 직업 별 최대 급여
서브쿼리의 분류 (메인쿼리 칼럼 사용 여부에 따라)
연관 서브쿼리 : 메인쿼리의 칼럼을 서브쿼리에서 사용
비연관 서브쿼리 : 메인쿼리의 칼럼을 서브쿼리엣 사용하지 않음
SELECT 절에서의 서브쿼리 목적 : 계산된 값을 표현하기 위해.
SELECT 이름,
(SELECT COUNT(*)
FROM 프로젝트참여
WHERE 프로젝트참여.직원ID = 직원.직원ID) AS 참여프로젝트수
FROM 직원;
설명: 각 직원이 참여한 프로젝트 수를 함께 보여줌
FROM 절에서의 서브쿼리 목적 : 서브쿼리 결과를 하나의 테이블로 이용하기 위해.
SELECT 부서명, 평균급여
FROM (
SELECT 부서ID, AVG(급여) AS 평균급여
FROM 직원
GROUP BY 부서ID
) AS 부서별급여
JOIN 부서 ON 부서.부서ID = 부서별급여.부서ID;
설명: 부서별 평균 급여를 먼저 구한 뒤, 부서명과 함께 출력
WHERE 절에서의 서브쿼리 목적 : 조건에 맞는 데이터를 찾기위해.
SELECT 이름
FROM 직원
WHERE 부서ID = (
SELECT 부서ID
FROM 부서
WHERE 부서명 = '영업부'
);
설명: ‘영업부’의 부서ID를 서브쿼리로 먼저 찾고, 그 부서에 속한 직원들의 이름을 가져옴