SELECT * FROM (SELECT ROWNUM NUM, SNAME FROM STUDENT) a WHERE NUM < 5
SELECT * FROM STUDENT WHERE MAJORNO = (SELECT MAJORNO FROM MAJOR WHERE MAJORNO=10);
서브쿼리 종류 | 설명 |
---|---|
단일 행 서브쿼리 | - 서브쿼리를 실행하면 그 결과는 반드시 한 행만 조회된다. - 비교 연산자인 =, <, <=, >, >=, <>를 사용한다. |
다중 행 서브쿼리 | - 서브쿼리를 실행하면 그 결과는 여러 개의 행이 조회된다. - 다중 행 비교 연산자인 IN, ANY, ALL, EXISTS를 사용한다. |
단일 행 연산 | 설명 |
---|---|
스칼라(Scala) Subquery | - 스칼라 서브쿼리는 반드시 한 행과 한 컬럼만 반환하는 서브쿼리이다. - 만약 여러 행이 반환되면 오류가 발생한다. |
다중 행 연산 | 설명 |
---|---|
IN(Subquery) | Main Query의 비교조건이 Subquery의 결과 중 하나만 동일하면 참이 된다. |
ALL(Subquery) | - Main Query와 Subquery의 결과가 모두 동일하면 참이 된다. - < ALL: 최솟값을 반환한다. - > ALL: 최댓값을 반환한다. |
ANY(Subquery) | - Main Query의 비교 조건이 Subquery의 결과 중 하나 이상 동일하면 참이 된다. - < ANY: 하나라도 크게 되면 참이된다. - > ANY: 하나라도 작게 되면 참이 된다. |
EXISTS(Subquery) | - Main Query와 Sub Query의 결과가 하나라도 존재하면 참이 된다. - EXISTS의 결과는 참과 거짓이 반환된다. |
연관(Correlated) Subquery | - 연관 Subquery는 Subquery 내에서 Main Query 내의 칼럼을 사용하는 것을 의미한다. |
SELECT ENAME, DNAME, SAL
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND EMP.EMPNO
IN(SELECT EMPNO FROM EMP WHERE SAL>20000);
SELECT * FROM EMP
WHERE DEPTNO <= ALL(20, 30);
SELECT ENAME, DNAME, SAL
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
AND EXISTS(SELECT 1 FROM EMP WHERE SAL>2000);
SELECT ENAME AS "name", SAL AS "SALARY",
(SELECT AVG(SAL) FROME MP) AS "AVERAGE"
FROM EMP
WHERE EMPNO = 1000;
FROM EMP a
FROM a.DEPTNO =
(SELECT DEPTNO FROM DEPT b
WHERE b.DEPTNO = a.DEPTNO);