subselect 쿼리 예
다음 예에서는 subselect 쿼리를 설명합니다.
- 예 1 - EMPLOYEE 테이블에서 모든 컬럼 및 행을 선택합니다.
SELECT * FROM EMPLOYEE - 예 2 - EMP_ACT 및 EMPLOYEE 테이블을 조인하고, EMP_ACT 테이블에서 모든 컬럼을 선택하고, EMPLOYEE 테이블에서 직원의 성(LASTNAME)을 결과의 각 행에 추가합니다.
SELECT EMP_ACT.*, LASTNAME FROM EMP_ACT, EMPLOYEE WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO - 예 3 - EMPLOYEE 및 DEPARTMENT 테이블을 조인하고, 1955년 이전(생년월일)에 태어난 모든 직원의 직원 번호(EMPNO), 직원의 성(LASTNAME), 부서 번호(직원 테이블의 WORK DEPTNO), 부서 이름(DEPTNAME)을 선택합니다.
SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME FROM EMPLOYEE, DEPARTMENT WHERE WORKDEPT = DEPTNO AND YEAR(BIRTHDATE) < 1955 - 예 4 - EMPLOYEE 테이블에서 동일한 작업 코드를 가진 각 행 그룹에 대해 작업(JOB)과 최소 및 최대 급여(SALARY)를 선택합니다. 단, 행이 두 개 이상이고 최대 급여가 27000 이상인 그룹에 대해서만 선택합니다.
SELECT JOB, MIN(SALARY), MAX(SALARY) FROM EMPLOYEE GROUP BY JOB HAVING COUNT(*) > 1 AND MAX(SALARY) >= 27000 - 예 5 - 부서(WORKDEPT) 'E11'에 있는 직원(EMPNO)에 대한 EMP_ACT 테이블의 모든 행을 선택합니다. (직원 부서 번호는
EMPLOYEE 테이블에 표시됨).
SELECT * FROM EMP_ACT WHERE EMPNO IN (SELECT EMPNO FROM EMPLOYEE WHERE WORKDEPT = 'E11') - 예 6 - EMPLOYEE 테이블에서 최대 급여가 모든 직원의 평균 급여보다 작은 모든 부서에 대해 부서 번호(WORKDEPT)와 최대 부서 급여(SALARY)를 선택합니다.
이 예에서는 HAVING절의 서브쿼리가 한 번 실행됩니다.SELECT WORKDEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE) - 예 7 - EMPLOYEE 테이블을 사용하여 최대 급여가 다른 모든 부서의 평균 급여보다 작은 모든 부서에 대해 부서 번호(WORKDEPT)와 최대 부서 급여(SALARY)를 선택합니다.
SELECT WORKDEPT, MAX(SALARY) FROM EMPLOYEE EMP_COR GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)예 6과 대조적으로, HAVING절의 서브쿼리는 각 그룹에 대해 실행됩니다.
- 예 8 - 부서의 평균 급여 및 인원수와 함께 영업 사원의 직원 수 및 급여를 판별합니다.이 쿼리는 먼저 중첩된 테이블 표현식(DINFO)을 작성하여 AVGSALARY 및 EMPCOUNT 컬럼과 WHERE절에서 사용되는 DEPTNO 컬럼을 가져와야 합니다.
SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY, DINFO.AVGSALARY, DINFO.EMPCOUNT FROM EMPLOYEE THIS_EMP, (SELECT OTHERS.WORKDEPT AS DEPTNO, AVG(OTHERS.SALARY) AS AVGSALARY, COUNT(*) AS EMPCOUNT FROM EMPLOYEE OTHERS GROUP BY OTHERS.WORKDEPT ) AS DINFO WHERE THIS_EMP.JOB = 'SALESREP' AND THIS_EMP.WORKDEPT = DINFO.DEPTNO이 경우에 중첩된 테이블 표현식을 사용하면 DINFO 뷰를 일반 뷰로 작성하는 처리 자원이 절약됩니다. 명령문 준비 중에, 뷰에 대한 카탈로그에 액세스하는 것이 방지됩니다. 나머지 쿼리 컨텍스트로 인해 뷰에서는 영업 담당자 부서의 행만 고려합니다.
- 예 9 - 직원의 무작위 그룹 5개에 대한 평균 교육 수준과 급여를 표시합니다.이 쿼리에서는 나중에 GROUP BY 절에서 사용할 수 있도록 각 직원에 대해 무작위 값을 설정하기 위해 중첩 테이블 표현식을 사용해야 합니다.
SELECT RANDID , AVG(EDLEVEL), AVG(SALARY) FROM ( SELECT EDLEVEL, SALARY, INTEGER(RAND()*5) AS RANDID FROM EMPLOYEE ) AS EMPRAND GROUP BY RANDID - 예 10 - EMP_ACT 테이블을 쿼리하고 급여가 모든 직원의 상위 10위 안에 드는 직원이 있는 프로젝트 번호를 리턴합니다.
SELECT EMP_ACT.EMPNO,PROJNO FROM EMP_ACT WHERE EMP_ACT.EMPNO IN (SELECT EMPLOYEE.EMPNO FROM EMPLOYEE ORDER BY SALARY DESC FETCH FIRST 10 ROWS ONLY) - 예 11 - PHONES 및 IDS가 동일한 카디널리티의 배열 값을 가진 두 개의 SQL 변수라고 가정하고 이러한 배열을 3개의 컬럼(각 배열에 대해 하나씩, 위치에 대해 하나)과 배열 요소당 하나의 행이 있는 테이블로 바꿉니다.
SELECT T.PHONE, T.ID, T.INDEX FROM UNNEST(PHONES, IDS) WITH ORDINALITY AS T(PHONE, ID, INDEX) ORDER BY T.INDEX