서브쿼리
서브쿼리의 종류
서브쿼리 종류 | 설명 |
---|---|
단일 행 서브쿼리 | 하나의 행을 검색하는 서브쿼리 |
다중 행 서브쿼리 | 하나 이상의 행을 검색하는 서브쿼리 |
다중 열 서브쿼리 | 하나 이상의 열을 검색하는 서브쿼리 |
서브쿼리의 종류에 따라 사용하는 연산자의 종류
연산자 구분 | 종류 | 사용처 |
---|---|---|
단일 행 연산자 | =, >, >=, <, <=, <>, != | 단일 행 서브쿼리, 다중 열 서브쿼리 |
다중 행 연산자 | IN, NOT IN, EXISTS, ANY, ALL | 다중 행 서브쿼리, 다중 열 서브쿼리 |
단일 행 서브쿼리
employees 테이블의 last_name이 ‘De Haan’인 직원과 salary가 동일한 직원에는 누가 있는지 단일 행 서브쿼리를 이용해서 출력하기
SELECT *
FROM DEMPLOYEES
WHERE SALARY = (SELECT SALARY FROM EMPLOYEES WHERE LAST_NAME = 'De Haan');
다중 행 서브쿼리
다중 행 연산자의 종류
다중 행 연산자 | 설명 | 예 |
---|---|---|
IN | 같은 값 | IN(10, 20) → 10이나 20이 포함 |
NOT IN | 같은 값이 아님 | NOT IN(10, 20) → 10이나 20이 포함되지 않음 |
EXISTS | 값이 있으면 반환 | EXISTS(10) → 10이 존재하면 참 |
ANY | 최소한 하나라도 만족하는 것(OR) | |
<, = 등 비교 연산자와 같이 사용 | ANY(10, 20) → 10이나 20이 포함 | |
ALL | 모두 만족하는 것 (AND) | |
<, = 등 비교 연산자와 같이 사용 | ALL(10, 20) → 10과 20이 포 |
employees 테이블에서 department_id별로 가장 낮은 salary가 얼마인지 찾아보고, 찾아낸 salay에 해당하는 직원이 누구인지 다중행 서브쿼리를 이용해 찾아보기
SELECT *
FROM EMPLOYEES A
WHERE A.SALARY IN (SELECT MIN(SALARY) 최저급여 FROM EMPLOYEES GROUP BY DEPARTMENT_ID)
ORDER BY A.SALARY DESC;
그룹 함수 MIN을 이용해서 DEPARTMENT_ID별 최저 SALARY를 조회하는 서브쿼리를 이용하여 다중행을 조회한 다음 메인 쿼리로 전달함
다중 행 서브쿼리이므로 등호(=) 연산자를 사용하지 않고 다중 행 연산자인 IN을 사용함
IN 연산자는 하나 이상의 행을 받아 처리하는 연산자
메인 쿼리에서는 다중 행의 SALARY 값을 결과값이자 조건식으로 받아 일치하는 직원을 출력함
다중 열 서브쿼리
employees 테이블에서 job_id별로 가장 낮은 salary가 얼마인지 찾아보고, 찾아낸 job_id별 salary에 해당하는 직원이 누구인지 다중열 서브쿼리를 이용해 찾아보기
SELECT *
FROM EMPLOYEES A
WHERE (A.JOB_ID, A.SALARY) IN (SELECT JOB_ID, MIN(SALARY) 그룹별급여 FROM EMPLOYEES GROUP BY JOB_ID)
ORDER BY A.SALARY DESC;
그룹 함수 MIN을 사용하여 JOB_ID별 최저 SALARY를 찾아내고 해당 값을 다중 열 서브쿼리를 통해 메인 쿼리에 전달하여 해당 직원이 누구인지 찾는 SELECT 문
다중 열이자 다중 행이기 때문에 조건식에 IN 연산자를 사용함
다중 열 서브쿼리를 사용하려면 조건식의 메인 쿼리와 서브쿼리의 각 열이 일대일로 대응해야 하며 데이터 타입도 동일해야 함
SELECT *
FROM EMPLOYEES AS A, (SELECT DEPARTMENT_ID FROM DEPARTMENTS WHERE DEPARTMENT_NAME = 'IT') AS B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID
departments 테이블에서 department_name이 IT인 데이터 값을 조회하는 SELECT 문을 마치 테이블처럼 FROM 절에 기술함 이는 department_id가 60이라는 데이터 값을 갖는 테이블과 같다고 할 수 있음 서브쿼리에 B라는 별칭을 줘서 employees 테이블과 department_id로 동등 조인하였고, 이로서 IT부서에 속한 모든 직원을 출력함 이처럼 서브쿼리를 FROM 절에 기술하면 SELECT 문을 정교하게 작성할 수 있음