Oracle Database - 1) SUBQUERY
https://kwanghyung.tistory.com/entry/Oracle-Database-2JOIN
Oracle Database - 2)JOIN
https://kwanghyung.tistory.com/entry/Oracle-Database-1JOIN Oracle Database - 1)JOIN https://kwanghyung.tistory.com/entry/Oracle-Database-JOIN Oracle Database- JOIN https://kwanghyung.tistory.com/ent..
kwanghyung.tistory.com
<SUBQUERY (서브쿼리)>
하나의 주된 SQL(SELECT, CREATE, INSERT, UPDATE,..) 안에 포함된 또 하나의 SELECT문
메인 SQL문을 위해 보조 역할을 하는 SELECT문
간단 서브쿼리 예시
노옹철 사원과 같은 부서인 사원들
1)먼저 노옹철 사원의 부서코드를 조회
SELECT DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME ='노옹철'; --노옹철 사원의 부서코드는 D9
2)부서코드가 D9인 사원들 조회
SELECT EMP_NAME
FROM EMPLOYEE
WHERE DEPT_CODE='D9'; --선동일, 송중기, 노옹철
위에 두 단계를 합쳐보자.
SELECT EMP_NAME
FROM EMPLOYEE
WHERE DEPT_CODE = (SELECT DEPT_CODE FROM EMPLOYEE WHERE EMP_NAME='노옹철');--D9 노옹철사원 부서코드
간단 서브쿼리 예시2
전체 사원의 평균 급여보다 더 많은 급여를 받고 있는 사원들의 사번, 이름 , 직급코드 조회
1) 전체 사원의 평균 급여를 구하기
SELECT FLOOR(AVG(SALARY))
FROM EMPLOYEE; --3047662
2)급여가 3047662 원 보다 많은 사원들의 사번,이름,직급코드를 조회해보자
SELECT EMP_ID,EMP_NAME,JOB_CODE
FROM EMPLOYEE
WHERE SALARY >3047662;
위의 두단계를 하나의 쿼리문으로 합쳐보자(서브쿼리)
SELECT EMP_ID,EMP_NAME,JOB_CODE
FROM EMPLOYEE
WHERE SALARY >(SELECT FLOOR(AVG(SALARY))
FROM EMPLOYEE);
서브쿼리 구문
서브쿼리를 수행한 결과값이 몇행 몇알이냐에 따라서 분류
-단일행(단일열) 서브쿼리 : 서브쿼리를 수행한 결과값이 오로지 1개일 때 (한칸의 컬럼값으로 나올때)
-다중행(단일열) 서브쿼리 : 서브쿼리를 수행한 결과값이 여러 행일때
-(단일행) 다중열서브쿼리 : 서브쿼리를 수행한 결과값이 여러 열일때
-다중행 다중열 서브쿼리 : 서브쿼리를 수행한 결과값이 여러 행 여러 열일때
-> 서브쿼리를 수행한 결과값이 몇행 몇열이냐에 따라서 사용 가능한 연산자가 달라진다.
1.단일행 (단일열) 서브쿼리 (SINGLE ROW SUBQUERY)
서브쿼리의 조회 결과값이 1개일때
일반 연산자 사용가능 (=,!=,>,<,<=,>=,..)
전 직원의 평균 급여보다 더 적게 받는 사원들의 사원명 직급코드 급여를 조회해보자
SELECT FLOOR(AVG(SALARY))
FROM EMPLOYEE; --평균급여 3047662
SELECT EMP_NAME,JOB_CODE,SALARY
FROM EMPLOYEE
WHERE SALARY <3047662; -- 전 직원 평균 급여보다 적게 받는 사원 조회
SELECT EMP_NAME,JOB_CODE,SALARY
FROM EMPLOYEE
WHERE SALARY < (SELECT FLOOR(AVG(SALARY))
FROM EMPLOYEE);--결과 값은 1행 1열 오직 1개의 값
최저급여를 받는 사원의 사번,사원명, 직급코드,급여,입사일을 조회해보자.
최저급여를 조회해보자
SELECT MIN(SALARY)
FROM EMPLOYEE; --최저급여 1380000
최저급여를 받는 사람을 조회하자
SELECT EMP_ID,EMP_NAME,JOB_CODE,SALARY,HIRE_DATE
FROM EMPLOYEE
WHERE SALARY = 1380000;
서브쿼리로 합쳐보기
SELECT EMP_ID,EMP_NAME,JOB_CODE,SALARY,HIRE_DATE
FROM EMPLOYEE
WHERE SALARY = (SELECT MIN(SALARY)
FROM EMPLOYEE);
노옹철 사원의 급여보다 더 많이 받는 사원들의 사번, 이름, 부서코드, 급여 조회를 해보자.
SELECT EMP_ID,EMP_NAME,DEPT_CODE,SALARY
FROM EMPLOYEE
WHERE SALARY > (SELECT SALARY FROM
EMPLOYEE WHERE EMP_NAME = '노옹철');
노옹철 사원의 급여보다 더 많이 받는 사원들의 사번,이름,부서명,급여 조회해보기
SELECT EMP_ID,EMP_NAME,DEPT_TITLE,SALARY
FROM EMPLOYEE E , DEPARTMENT D
WHERE E.DEPT_CODE=D.DEPT_ID
AND SALARY > (SELECT SALARY FROM
EMPLOYEE WHERE EMP_NAME ='노옹철');
SELECT EMP_ID,EMP_NAME,DEPT_TITLE,SALARY
FROM EMPLOYEE E
LEFT JOIN DEPARTMENT D ON(DEPT_CODE=DEPT_ID)
AND SALARY > (SELECT SALARY FROM
EMPLOYEE WHERE EMP_NAME ='노옹철');
부서별 급여 합이 가장 큰 부서 하나만을 조회,부서코드,부서명,급여의 합(서브쿼리+GROUP BY +HAVING)
SELECT DEPT_CODE,DEPT_TITLE,(SUM(SALARY))
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DEPT_CODE=D.DEPT_ID
GROUP BY DEPT_CODE,DEPT_TITLE
HAVING SUM(SALARY)= (SELECT MAX(SUM(SALARY))
FROM EMPLOYEE
GROUP BY DEPT_CODE); --부서별 급여합중 가장 큰값