day04
- Main Query에 반대되는 개념으로 이름을 붙인것
- 메인쿼리를 구성하는 소단위 쿼리
- select, insert, delete, update 절에서 모두 사용 가능
- 서브쿼리의 결과 집합을 메인 쿼리가 중간 결과
값으로 사용- 서브쿼리자체는 일반 쿼리와 다를 바가 없다.
-- 6462
SELECT ROUND(AVG(SALARY)) FROM EMPLOYEES e ;
SELECT * FROM EMPLOYEES e WHERE SALARY < 6462 ;
위 2개는 같은 결과값
- 아래와 같은 쿼리문은 전체 사원의 평균 급여값보다 낮은사람을 구하는 것 이다.
SELECT * FROM EMPLOYEES e WHERE SALARY < ( SELECT ROUND(AVG(SALARY)) -- ( ) 안에 들어간게 서브쿼리 FROM EMPLOYEES e ) ;
여기서 조건은 평균급여값보다 낮은사람이며 WHERE문의 ( )문에 들어간 쿼리문이 서브 쿼리문이며 이 쿼리문이 평균 급여값이다. 그래서 WHERE문은 SALARY < 평균급여값이 된다고 볼수 있다.
SELECT LOCATION_ID FROM LOCATIONS l WHERE COUNTRY_ID = 'US' ;
SELECT * FROM DEPARTMENTS d WHERE LOCATION_ID in (1400, 1500, 1600, 1700) ;
SELECT * FROM DEPARTMENTS d WHERE LOCATION_ID in (SELECT LOCATION_ID FROM LOCATIONS l WHERE COUNTRY_ID = 'US') ;
위의 쿼리문은 다 같은 값이다.
월급이 가장 적은 사원
SELECT * FROM EMPLOYEES e WHERE e.SALARY = (SELECT MIN(SALARY) FROM EMPLOYEES e2) ;
급여 = ( ) 구문의 값은 급여가 제일 낮은사람
따라서 월급이 가장 적은 사원이 출력이 된다.
월급이 가장 많은 사원
SELECT * FROM EMPLOYEES e WHERE e.SALARY = (SELECT MAX(SALARY) FROM EMPLOYEES e2) ;
위와 비슷한 구문이다.
EMPLOYEES 테이블에서 Kochhar의 급여보다 많은 사원의
정보를 사원번호,이름,담당업무,급여를 출력하라.
SELECT EMPLOYEE_ID , FIRST_NAME, JOB_ID , SALARY FROM EMPLOYEES e WHERE SALARY > (SELECT SALARY FROM EMPLOYEES e2 WHERE LAST_NAME = 'Kochhar') ;
💡 KeyPoint
조건문 = 급여 > kochhar의 급여
-> Kochhar의 급여보다 많은 사원
EMPLOYEES 테이블에서 급여의 평균보다 적은 사원의
사원번호,이름,담당업무,급여,부서번호를 출력하여라.
SELECT EMPLOYEE_ID , FIRST_NAME , JOB_ID , SALARY , DEPARTMENT_ID FROM EMPLOYEES e WHERE SALARY < ( SELECT AVG(SALARY) FROM EMPLOYEES e2 ) ;
💡 KeyPoint
조건문 = 급여 < 회사 전체 급여평균
-> 급여의 평균보다 적은 사원
EMPLOYEES 테이블에서 100번 부서의
최소 급여보다 최소 급여가 많은 다른 모든 부서를 출력하라
SELECT DEPARTMENT_ID ,MIN(SALARY) FROM EMPLOYEES e GROUP BY DEPARTMENT_ID HAVING MIN(SALARY) > ( SELECT MIN(SALARY) FROM EMPLOYEES e2 WHERE DEPARTMENT_ID = '100' ) ;
💡 KeyPoint
부서가 중복되서 출력되면 안돼기에 중복 제거 GROUP BY문을 썼다.
Having으로 조건문이 시작된다.최소급여 > 100번 부서의 최소급여
-> 100번 부서의 최소 급여보다 최소 급여가 많은 다른 모든 부서
업무별로 최소 급여를 받는 사원의 정보를 사원번호,이름,업무,부서번호를 출력하여라.
단 업무별로 정렬하여라.
SELECT EMPLOYEE_ID , FIRST_NAME , JOB_ID , DEPARTMENT_ID FROM EMPLOYEES e WHERE (JOB_ID,SALARY) IN (SELECT JOB_ID,MIN(SALARY) FROM EMPLOYEES e2 GROUP BY JOB_ID) ORDER BY JOB_ID ;
💡 KeyPoint
업무별로 = (JOB_ID,SALARY)
최소 급여를 받는 = 서브쿼리문단 업무별로 정렬하여라.
-> 서브쿼리문에서 GROUP BY를 썼다.
EMPLOYEES 테이블에서
(사원번호가 123인 사원의 직업)과 같고
(사원번호가 192인 사원의 급여(SAL)) 보다 많은
사원의 사원번호,이름,직업,급여를 출력하라.
SELECT EMPLOYEE_ID , FIRST_NAME , JOB_ID , SALARY FROM EMPLOYEES e WHERE JOB_ID = ( SELECT JOB_ID FROM EMPLOYEES e2 WHERE EMPLOYEE_ID = '123') AND SALARY > ( SELECT SALARY FROM EMPLOYEES e3 WHERE EMPLOYEE_ID = '192')
💡 KeyPoint
1번째 조건
JOB_ID (사원번호) = 사원번호가 123인 사원
사원번호가 123인 사원의 직업과 같고
2번쨰 조건
SALARY(급여) > 사원번호가 192인 사원의 급여
사원번호가 192인 사원보다 급여가 많다.
EMPLOYEES 테이블에서 (50번 부서의 최소 급여)를
받는 사원보다 많은 급여를 받는 사원의 사원번호,이름,업무,입사일자,급여,부서번호를 출력하라.
단, 50번은 제외
SELECT EMPLOYEE_ID , FIRST_NAME , JOB_ID , HIRE_DATE , SALARY , DEPARTMENT_ID FROM EMPLOYEES e WHERE SALARY > ( SELECT MIN(SALARY) FROM EMPLOYEES e2 WHERE DEPARTMENT_ID = '50') AND DEPARTMENT_ID != '50' ORDER BY DEPARTMENT_ID ;
💡 KeyPoint
1번째 조건
급여 > 50번 부서의 최소 급여
= 50번 부서의 최소 급여보다 많은 급여를 받는 사원
2번째 조건
단, 50번은 제외