서브쿼리는 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 의미합니다.
SQL 에 포함된 또 다른 SQL을 서브쿼리라고 합니다. 서브쿼리는 SELECT절, FROM절, WHERE절, HAVING절에 사용될 수 있습니다.
서브쿼리는 메인 쿼리가 실행되기 전에 먼저 실행되며 서브쿼리에서는 메인 쿼리의 모든 컬럼을 참조할 수 있지만 메인 쿼리에서는 서브쿼리의 컬럼을 참조할 수 없습니다.
SELECT select_list
FROM table_name
WHERE 표현식 연산자 (SELECT select_list
FROM table_name
WHERE 조건식);
employee 테이블에서 gildong보다 급여를 많이 받는 사원을 출력하시오.
iSQL> SELECT ename, salary
FROM employee
WHERE salary > (SELECT salary
FROM employee
WHERE ename = 'gildong') ;
WHERE 절에서 사용된 서브쿼리에서 한 개의 결과 값만 반환할 경우 사용하는 연산자는 다음과 같습니다. 이 외의 연산자를 사용할 경우 에러가 발생할 수 있습니다.
연산자 | 의미 |
---|---|
= | 같음 |
> | 보다 큼 |
>= | 크가나 같음 |
< | 보다 작음 |
<= | 작거나 같음 |
, != | 같지 않음 |
20번 사원과 같은 부서에서 일하는 사원을 출력하시오.
iSQL> SELECT ename, dno
FROM employee
WHERE dno = (SELECT dno
FROM employee
WHERE eno = 20) ;
다중 행 subquery를 이용하여 데이터를 비교할 경우에는 다중 행 연산자를 사용합니다. 만약 다중 행 subquery에 단일 행 연산자를 사용한다면, 다음과 같은 오류가 발생합니다.
"A single-row subquery returns more than one row"
연산자 | 의미 |
---|---|
IN | subquery 결과에 존재하는 임의의 값과 일치 |
ANY | subquery 결과에 존재하는 어느 하나의 값이라도 만족 |
ALL | subquery 결과에 존재하는 모든 값에 만족 |
EXISTS | subquery 결과를 만족하는 값이 존재하는지 여부를 확인 |
각 부서에서 급여를 가장 적게 받는 사원들을 출력하시오
iSQL> SELECT dno, ename, salary FROM employee WHERE salary = (SELECT MIN(salary) FROM employee GROUP BY dno); [ERR-31002 : A single-row subquery returns more than one row.] iSQL> SELECT dno, ename, salary FROM employee WHERE salary IN (SELECT MIN(salary) FROM employee GROUP BY dno) ; 10 rows selected.
SELECT 의 target 절에서 사용하는 서브쿼리를 스칼라 서브쿼리라고 합니다.
스칼라 서브쿼리는 메인 서브쿼리의 row수 만큼 반복되어 실행이 되고, 만약 조건에 만족하는 스칼라 서브쿼리의 결과가 없다면 NULL 을 리턴하게 됩니다.
사원 정보와 각 사원이 속한 부서의 평균 급여를 함께 출력하시오.
iSQL> SELECT ename, salary, (SELECT AVG(salary) FROM employee WHERE dno = e.dno) avg_sal FROM employee e; ENAME SALARY AVG_SAL ------------------------------------------- HSCHOI 2000000 2150000 KSKIM 1800000 1800000
SELECT 의 FROM 절에서 사용하는 서브쿼리를 inline view라고 합니다. view와는 달리 inline view에서 사용하는 SELECT문을 저장하지 않기 때문에 dynamic view 라고도 부릅니다.
다른 서브쿼리와는 다르게 inline view에서 질의하는 칼럼들을 메인 서브쿼리에서 사용할 수 있습니다.
사원 정보와 각 사원이 속한 부서의 평균 급여를 함께 출력하라.
iSQL> SELECT e.ename, e.salary, a.avg_sal FROM employee e, (SELECT dno, AVG(salary) avg_sal FROM employee GROUP BY dno) a WHERE e.dno = a.dno; ENAME SALARY AVG_SAL ----------------------------------------- HSCHOI 2000000 2150000 JHCHOI 2300000 2150000 HYCHOI 1700000 1340000 KWKIM 980000 1340000 YHBAE 4000000 2438250 …
- 강좌 URL : http://www.gurubee.net/lecture/2179
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.