오라클, SQL, 스칼라서브쿼리, Scalar SubQuery
http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=616
5.4 Scalar SubQuery
하나의 단일값을 나타내기 위해 SELECT구문을 SELECT LIST, WHERE절, ORDER BY절, DML등에 사용하는 서브쿼리를 지칭하며 데이터건수가 적을 경우 조인 방식보다 유리하다. 유효한 수식이 사용될 수 있는 곳이라면 어디든 사용가능하며 반드시 하나의 결과만 되돌려야 한다.
--사원테이블과 부서테이블을 조인하여 사번, 사원명, 부서코드, 부서명을 추출한다고 하자. SQL> select empno, ename, emp.deptno, dname from emp, dept 2 where emp.deptno = dept.deptno;
EMPNO ENAME DEPTNO DNAME ---------- ---------- ------ -------------- 7782 CLARK 10 ACCOUNTING …… 7654 MARTIN 30 SALES
14 개의 행이 선택되었습니다.
-- 스칼라 서브쿼리로 바꾸면 SQL> select empno, ename, deptno, (select dname from dept where emp.deptno = dept.deptno) 2 from emp;
EMPNO ENAME DEPTNO (SELECTDNAMEFR ---------- ---------- ------ -------------- 7369 SMITH 20 RESEARCH …… 7934 MILLER 10 ACCOUNTING
14 개의 행이 선택되었습니다.
-- 부서별로 사원수를 출력하는 쿼리를 스칼라 서브쿼리를 이용해 보자. SQL> select deptno, dname, 2 (select nvl(count(*),0) from emp where emp.deptno = dept.deptno) emp_cnt 3 from dept ;
DEPTNO DNAME EMP_CNT ------ -------------- ---------- 10 ACCOUNTING 3 20 RESEARCH 5 30 SALES 6 40 OPERATIONS 0
-- insert 구문에 스칼라 서브쿼리를 사용해보자. SQL> create table emp_summary ( 2 sum_sal number, 3 avg_sal number, 4 max_sal number, 5 min_sal number 6 );
테이블이 생성되었습니다.
SQL> insert into emp_summary ( 2 sum_sal, 3 avg_sal, 4 max_sal, 5 min_sal ) 6 values ( 7 (select sum(sal) from emp), 8 (select avg(sal) from emp), 9 (select max(sal) from emp), 10 (select min(sal) from emp) 11 );
1 개의 행이 만들어졌습니다.
SQL> commit;
-- 아래처럼 order by절에서도 사용 가능하다. EMP테이블에서 부서이름으로 정렬 SQL> select empno, ename, sal 2 from emp e 3 order by ( select dname from dept d 4 where e.deptno = d.deptno);
EMPNO ENAME SAL ---------- ---------- ---------- 7782 CLARK 2450 7839 KING 5000 7934 MILLER 1300 7566 JONES 2975 …… |
댓글 없음:
댓글 쓰기