C#,Delphi,Oracle,MSSQL 개발자블로그
[Oracle/기본]7. 다중 열 서브쿼리(Subquery) 본문
● 다중열 서브 쿼리
여러개의 컬럼을 검색하는 서브 쿼리
- 서브 쿼리의 SELECT 문에 여러 개의 컬럼을 검색한다.
- 반드시 비교 대상 컬럼과 1:1 대응돼야 한다.
- 다중 열 서브쿼리는 주로 IN을 사용하지만 '='사용도 가능하다. IN의 사용이 권장된다.
Ex. 각 부서별로 최소 급여를 받는 사원의 정보를 검색. (Pairwise 방식)
SELECT dept_ID, employeeID, first_name, salary
FROM emp
WHERE (dept_ID, salary) IN (SELECT dept_ID, MIN(salary)
FROM emp
GROUP BY dept_ID)
● 다중 열 서브쿼리에서의 열 비교
- Pairwise 방식.
SELECT empno, sal, deptno
FROM emp
WHERE (sal, deptno) IN (SELECT sal, deptno
FROM emp
WHERE deptno = 30
AND comm is NOT NULL);
☞ 서브쿼리의 조건에 대하여 교집합의 개념
- Non Pairwise 방식.
SELECT empno, sal, deptno
FROM emp
WHERE sal IN (SELECT sal
FROM emp
WHERE deptno = 30
AND comm is NOT NULL)
AND deptno IN (SELECT deptno
FROM emp
WHERE deptno = 30
AND comm is NOT NULL);
☞ 서브쿼리의 조건에 대하여 합집합의 개념 (두 서브쿼리의 조건이 서로 다를 수도 있음)
예를들어, 서브쿼리의 결과가 (1, a), (2, b) 의 2건이 나오면,
Pairwise 쿼리는, (1, a), (2, b) 가 나온다.
NonPairwise 쿼리는, (1, a), (1, b), (2, a), (2, b)가 나올 수 있다.
● 서브쿼리에서의 NULL 값
NOT IN 연산자로 이어지는 서브쿼리의 결과값 중 하나라도 NULL값이면, 행이 없다고 리턴한다.
따라서, 서브쿼리의 결과값 중 하나라도 NULL인 값이 있으면 NOT IN 연산자를 사용하면 안된다. (IN은 가능)
● FROM 절에서의 서브쿼리 사용.
Ex. SELECT a.ename, a.sal, a.deptno, b.salavg
FROM emp a, (SELECT deptno, avg(sal) salavg
FROM emp
GROUP BY deptno) b
WHERE a.deptno = b.deptno
AND a.sal > b.salavg;
부서의 평균 급여 이상을 받는 모든 종업원에 대해서 종업원 이름, 급여, 부서번호, 평균급여를 디스플레이한다.
'Programming > Oracle 공부' 카테고리의 다른 글
[Oracle/기본]10. 테이블 생성과 관리 (0) | 2017.05.23 |
---|---|
[Oracle/기본]9. 데이터 조작 (0) | 2017.05.23 |
[Oracle/기본]6. 서브쿼리(Subquery) (0) | 2017.05.23 |
[Oracle/기본]5. 그룹 함수를 사용한 데이터 집계 (2) | 2017.05.22 |
[Oracle/기본]4. 다중 테이블로부터 데이터 디스플레이 (0) | 2017.05.22 |