Database/Oracle
[Oracle] 서브쿼리
best
2016. 2. 16. 15:27
서브쿼리 : 쿼리 안의 쿼리
- 조회하려는 대상을 알지 못할 때
- 조회하려는 대상이 너무 많을 때
- 조회하려는 대상이 유동적일 때 사용한다.
SELECT [COLUMN], [SUB QUERY]
FROM [TABLE]
WHERE [COLUMN OPER SUBQUERY]
WHERE 안에 서브쿼리를 만드는 실습들
실습1 - SALARY가 최소인 사원을 조회하고 싶을 때
1
2
3
4
5
6
7 |
SELECT *
FROM EMPLOYEES
WHERE SALARY = (
SELECT MIN(SALARY)
FROM EMPLOYEES
)
; |
cs |
결과가 하나일때는 WHERE 절에서 = 를 쓰지만, 여러 개의 결과를 얻고 싶을 땐 IN을 써서 조건을 만든다.
실습2 - 평균 연봉의 +- 500인 사원들을 조회한다.
1
2
3
4
5
6
7
8
9
10
11 |
SELECT *
FROM EMPLOYEES
WHERE SALARY > (
SELECT AVG(SALARY) - 500
FROM EMPLOYEES
)
AND SALARY < (
SELECT AVG(SALARY) + 500
FROM EMPLOYEES
)
; |
cs |
실습3 - 회사 전체 평균 연봉 보다 더 버는 사원들 중 LAST_NAME 에 u 가 있는 사원들이
근무하는 부서에서 근무하는 사원들의 사번, LAST_NAME 및 연봉을 조회한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
SELECT EMPLOYEE_ID
, LAST_NAME
, SALARY
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN ( -- 결과가 여러개 이므로 IN을 사용한다.
SELECT DEPARTMENT_ID
FROM EMPLOYEES
WHERE LAST_NAME LIKE '%u%'
AND SALARY > (
SELECT AVG(SALARY)
FROM EMPLOYEES
)
)
; |
cs |
서브쿼리 안의 서브쿼리
SELECT절 안에서 서브쿼리 만드는 경우
그 서브쿼리의 결과가 하나이어야 한다는 제약조건이 존재한다.
실습1
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
SELECT DEPARTMENT_ID
, LAST_NAME
, (
SELECT SUM(SALARY)
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 40 -- 이부분의 결과가 하나여야한다.
)
FROM EMPLOYEES
WHERE LAST_NAME LIKE '%u%'
AND SALARY > (
SELECT AVG(SALARY)
FROM EMPLOYEES
)
; |
cs |