[DB] 서브쿼리
** MySQL 서브쿼리 참고
[DBMS] order by, limit, distinct, group by, 서브쿼리, 다중조건문
[order by] select * from 테이블명 order by 컬럼명 desc/asc; select문 사용 시 테이블에 입력된 순서대로 출력되는 것이 기본 내림차순(desc), 오름차순(asc) 정렬 필요할 때 사용 기본사용 select * from city order b
studywithjw.tistory.com
서브쿼리
SQL문에 또다른 SQL문을 삽입해 검색에 이용
서브쿼리 사용가능 위치
- WHERE, HAVING 절
- SELECT, DELETE문의 FROM 절
- UPDATE문의 SET 절
- INSERT문의 INTO
--사원테이블에서 이름이 'Michael'이고 직종이 'MK_MAN'인 사원의 급여보다 많이받는 사원들의 사번, 이름, 직종, 급여 순으로 출력
--1단계) Michael이 받는 급여?
SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME = 'Michael' AND JOB_ID = 'MK_MAN'; --13000
--2단계) 13000보다 급여를 많이받는 사원들 조회
SELECT EMPLOYEE_ID, FIRST_NAME, JOB_ID, SALARY FROM EMPLOYEES WHERE SALARY >13000;
--3단계) 1)과 2)를 한 구문으로 합치기
SELECT EMPLOYEE_ID, FIRST_NAME, JOB_ID, SALARY FROM EMPLOYEES
WHERE SALARY > (SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME = 'Michael' AND JOB_ID = 'MK_MAN');

--회사의 평균급여 이상 받는 사람들의 이름과 급여를 조회
SELECT FIRST_NAME, SALARY FROM EMPLOYEES
WHERE SALARY >= (SELECT AVG(SALARY) FROM EMPLOYEES);
--사번이 111인 사원과 직종이 같고 사번이 159인 사원의 급여보다 많이 받는 사원들의 정보를 사번, 이름, 직종, 급여 순으로 출력
SELECT EMPLOYEE_ID, FIRST_NAME, JOB_ID, SALARY FROM EMPLOYEES
WHERE JOB_ID = (SELECT JOB_ID FROM EMPLOYEES WHERE EMPLOYEE_ID = 111) --FI_ACCOUNT
AND
SALARY > (SELECT SALARY FROM EMPLOYEES WHERE EMPLOYEE_ID = 159); --8000

--직종, 평균급여를 출력하되 평균급여가 Bruce사원의 급여보다 큰 경우만 조회
SELECT JOB_ID, AVG(SALARY) FROM EMPLOYEES
GROUP BY JOB_ID HAVING AVG(SALARY) > (SELECT SALARY FROM EMPLOYEES WHERE FIRST_NAME = 'Bruce');
--사원테이블에서 성에 'Bat'이라는 단어를 포함하는 사원과 같은 부서에서 근무하는 사원의 부서번호, 이름을 출력
SELECT DEPARTMENT_ID, FIRST_NAME FROM EMPLOYEES
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID FROM EMPLOYEES WHERE LAST_NAME LIKE '%Bat%');
--사원테이블에서 성이 'Kochhar'인 사람의 급여보다 많이 받는 사원들의 사번, 성, 직종, 급여 출력
SELECT EMPLOYEE_ID, LAST_NAME, JOB_ID, SALARY FROM EMPLOYEES
WHERE SALARY > (SELECT SALARY FROM EMPLOYEES WHERE LAST_NAME LIKE 'Kochhar');
--사원테이블에서 급여가 가장 적은 사람의 사번, 이름, 급여를 출력
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM EMPLOYEES
WHERE SALARY = (SELECT MIN(SALARY) FROM EMPLOYEES);
SET절에서의 서브쿼리
--사원번호가 100번인 사람의 이름을 150번 사원의 이름으로 바꾸기
UPDATE EMPLOYEES SET FIRST_NAME = (SELECT FIRST_NAME FROM EMPLOYEES WHERE EMPLOYEE_ID = 150)
WHERE EMPLOYEE_ID = 100;


SELECT문 자체에서의 서브쿼리 (SCARLAR)
--사원테이블에서 전체평균급여와 부서별 평균급여 구하기
SELECT DEPARTMENT_ID, AVG(SALARY) AS "부서별 평균급여", (SELECT AVG(SALARY) FROM EMPLOYEES) AS "전체평균"
FROM EMPLOYEES GROUP BY DEPARTMENT_ID;

FROM절에서의 서브쿼리 (INLINE VIEW)
--사원테이블에서 부서번호가 80인 사원들 중 직종이 'SA_MAN'인 사원들의 정보 조회하기
SELECT * FROM (SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID = 80) WHERE JOB_ID = 'SA_MAN';

서브쿼리의 위치에 따른 이름 참고
흔히 WHERE절에서의 서브쿼리 : SUB QUERY _ 하나의 변수처럼 사용되는 쿼리문
FROM절에서의 서브쿼리 : INLINE VIEW _ 쿼리문으로 출력되는 결과를 테이블처럼 사용
SELECT절에서의 서브쿼리 : SCALAR _ 하나의 컬럼처럼 사용되는 쿼리문