728x90
SUBQUERY (서브쿼리)
하나의 주된 SQL문(SELECT, INSERT, UPDATE, DELETE, CREATE, ...) 안에
포함된 또 하나의 쿼리문. 메인 SQL문의 보조역할을 하는 쿼리문
>> 특정 사원과 같은 부서인 사원들을 조회화기
-- 홍길동 사원과 같은 부서인 사원들
-- 1) 홍길동 사원의 부서코드 조회
SELECT DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME = '홍길동'; -- D1
-- 2) 부서코드가 D1인 사원들 조회
SELECT EMP_NAME
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1';
-- 두 쿼리문 합치기
SELECT EMP_NAME
FROM EMPLOYEE
WHERE DEPT_CODE = (SELECT DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME = '홍길동');
728x90
>> 전체 사원의 평균급여보다 더 많은 급여를 받고 있는 사람들의 정보 조회하기
--전체 사원의 평균급여보다 더 많은 급여를 받고 있는 사원들의 사번, 이름, 직급코드 조회
-- 1) 전체 사원의 평균 급여
SELECT ROUND(AVG(SALARY))
FROM EMPLOYEE; --3,047,663
--2) 급여가 평균 이상인 사원들 조회
SELECT EMP_ID 사번,
, EMP_NAME 이름
, JOB_CODE 직급코드
FROM EMPLOYEE
WHERE SALARY >= 3047633;
-- 1) + 2) 쿼리 합치기
SELECT EMP_ID 사번,
, EMP_NAME 이름
, JOB_CODE 직급코드
FROM EMPLOYEE
WHERE SALARY > (SELECT ROUND(AVG(SALARY))
FROM EMPLOYEE);
서브쿼리 구분
서브쿼리를 수행한 결과값이 몇 행 몇 열이냐에 따라서 분류한다
- 단일행 (단일열) 서브쿼리 : 서브쿼리를 수행한 결과값이 오로지 1개일 때
- 다중행 (단일열) 서브쿼리
- (단일행) 다중열 서브쿼리
- 다중행 다중열 서브쿼리
단일행 서브쿼리 (SINGLE ROW SUBQUERY)
일반연산자 (=, !=, <=, < ... ) 사용 가능
>> 전체 직원의 평균 급여보다 적게 받는 사원들의 정보 조회하기
SELECT EMP_NAME
, JOB_CODE
, SALARY
FROM EMPLOYEE
WHERE SALARY < (SELECT AVG(SALARY)
FROM EMPLOYEE);
>> 최저급여를 받는 사원의 정보 조회하기
SELECT EMP_ID
, EMP_NAME
, JOB_CODE
, SALARY
FROM EMPLOYEE
WHERE SALARY = (SELECT MIN(SALARY)
FROM EMPLOYEE);
>> 특정사원의 급여보다 더 많은 받는 사원들의 정보 조회
SELECT EMP_ID
, EMP_NAME
, SALARY
FROM EMPLOYEE
WHERE SALARY > ( SELECT SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE '홍길동');
>> 특정사원관 같은 부서 사원들의 정보 조회
--홍길동과 같은 부서인 사원들의 사번, 사원명, 직급명 조회( 단, 홍길동은 제외)
-- 1) ORACLE
SELECT E.EMP_ID
, E.EMP_NAME
, J.JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE
AND E.DEPT_CODE = (SELECT DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME = '홍길동')
AND E.EMP_NAME != '홍길동';
-- 2) ANSI
SELECT E.EMP_ID
, E.EMP_NAME
, J.JOB_NAME
FROM EMPLOYEE E
JOIN JOB USIUNG (JOB_CODE)
WHERE DEPT_CODE = (SELECT DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME = '홍길동')
AND DEPT_NAME != '홍길동';
>> 부서별 급여의 합이 가장 큰 부서 조회
SELECT DEPT_CODE
, DEPT_TITLE
, SUM(SALARY)
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
GROUP BY DEPT_CODE, DEPT_TITLE
HAVING SUM(SALARY) = (SELECT MAX(SUM(SALARY))
FROM EMPLOYEE
GROUP BY DEPT_CODE);
728x90
'Programming > SQL' 카테고리의 다른 글
[Oracle] 서브쿼리 (SUBQUERY) / 다중열 서브쿼리 / 다중행 다중열 서브쿼리 (0) | 2024.02.20 |
---|---|
[Oracle] 서브쿼리 (SUBQUERY) / 다중행 서브쿼리(MULTI ROW SUBQUERY) (0) | 2024.02.20 |
[Oracle] GROUP BY / HAVING절 / 집합 연산자 SET OPERATOR (UNION/ALL/INTERSECT/MINUS) (0) | 2024.02.15 |
[Oracle] 조인(JOIN) : 자체조인(SELF JOIN) / 다중 JOIN (1) | 2024.02.13 |
[Oracle] 조인(JOIN) : 카테시안 곱(CARTESIAN PRODUCT) / 교차(CROSS)조인 / 비등가 조인(NON EQUAL JOIN) (0) | 2024.02.13 |