메인쿼리에 포함되는 하위쿼리를 서브쿼리라고 한다.서브쿼리를 먼저 실행해서 그 결과를 메인쿼리에 전달한다.SELECT 절 : 스칼라 서브쿼리FROM 절 : 인라인 뷰 (INLINE VIEW)WHERE 절 : 단일 행 서브쿼리 (결과가 1개), 다중 행 서브쿼리 (결과가 N개)WHERE 절에서 사용한 칼럼이 PK 또는 UNIQUE 칼럼인 경우통계 함수를 사용한 경우=, !=, >, >=, <, <=-- 사원번호가 101인 사원의 직업과 동일한 직업을 가진 사원을 조회하기 -- SELECT * -- FROM EMPLOYEES -- WHERE JOB_ID = (사원번호가 101인 사원의 직업); SELECT * FROM EMPLOYEES WHERE JOB_ID = (SELECT JOB_ID FROM EMPLOYEES WHERE EMPLOYEE_ID = 101);
- 서브쿼리 결과로 내주는 값이 메인쿼리에 있어야 함 (JOB_ID)
IN 서브쿼리의 결과 중에서 하나라도 일치하면 참ANY 서브쿼리의 결과들과 비교한 결과가 하나라도 일치하면 참ALL 서브쿼리의 결과들과 비교한 결과가 모두 일치하면 참EXISTS 서브쿼리의 검색 결과가 하나라도 존재하면 참-- 부서명이 'IT'인 부서에 근무하는 사원 조회하기 -- SELECT * -- FROM EMPLOYEES -- WHERE DEPARTMENT_ID IN (부서명이 'IT'인 부서의 부서번호); SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID FROM DEPARTMENTS WHERE DEPARTMENT_NAME = 'IT'); -- 서브쿼리의 DEPARTMENT_NAME 칼럼은 중복이 있을 수 있으므로 다중 행 서브쿼리로 처리 (IN)
-- 'Seattle'에서 근무하는 사원 조회하기 SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID FROM DEPARTMENTS WHERE LOCATION_ID IN (SELECT LOCATION_ID FROM LOCATIONS WHERE CITY = 'Seattle'));
-- 연봉 가장 높은 사원 조회하기 SELECT * FROM EMPLOYEES WHERE SALARY = (SELECT MAX(SALARY) FROM EMPLOYEES);
실행 순서--연봉 11 ~ 20번째 사원 조회하기 SELECT RN, EMPLOYEE_ID FROM (SELECT ROW_NUMBER() OVER(ORDER BY SALARY DESC) AS RN, EMPLOYEE_ID FROM EMPLOYEES) WHERE RN BETWEEN 11 AND 20;
-- 부서번호가 50인 부서에 근무하는 사원번호, 사원명, 부서명 조회하기 (비상관) SELECT EMPLOYEE_ID , FIRST_NAME , LAST_NAME , (SELECT DEPARTMENT_NAME FROM DEPARTMENTS WHERE DEPARTMENT_ID = 50) AS DEPT_NAME FROM EMPLOYEES WHERE DEPARTMENT_ID = 50; -- 부서번호가 50인 부서에 근무하는 사원번호, 사원명, 부서명 조회하기 (상관) SELECT E.EMPLOYEE_ID , E.FIRST_NAME , E.LAST_NAME , (SELECT D.DEPARTMENT_NAME FROM DEPARTMENTS D WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID AND D.DEPARTMENT_ID = 50) AS DEPT_NAME FROM EMPLOYEES E;
WITH 절의 코드 블록으로 등록시켜 놓을 수 있다.임시로 저장되기 때문에 곧바로 사용해야 한다.-- 부서별 부서번호, 부서명, 연봉총액을 조회하기 -- 1) 조인 SELECT MY.DEPARTMENT_ID , MY.TOTAL_SALARY , D.DEPARTMENT_NAME FROM DEPARTMENTS D INNER JOIN (SELECT DEPARTMENT_ID, SUM(SALARY) AS TOTAL_SALARY FROM EMPLOYEES GROUP BY DEPARTMENT_ID) MY ON D.DEPARTMENT_ID = MY.DEPARTMENT_ID; -- 2) WITH WITH MY_SUBQUERY AS ( SELECT DEPARTMENT_ID, SUM(SALARY) AS TOTAL_SALARY FROM EMPLOYEES GROUP BY DEPARTMENT_ID ) SELECT MY.DEPARTMENT_ID , MY.TOTAL_SALARY , D.DEPARTMENT_NAME FROM DEPARTMENTS D INNER JOIN MY_SUBQUERY MY ON D.DEPARTMENT_ID = MY.DEPARTMENT_ID;
🟢 구디아카데미후기 IT국비지원 민경태 강사님 수업 8일차! 🟢
조인이랑 서브쿼리 재밌네 ㅋㅋㅋ 처음엔 헷갈렸는데 하면 할수록 재밌다 (아직까지는)