1. 서브쿼리(subquery)
특징
a. 서브쿼리는 연산자와 같은 비교 또는 조회 대상의 오른쪽에 놓이며 괄호()로 묶어서 사용합니다.
b. 특수한 몇몇 경우를 제외한 대부분의 서브쿼리에서는 ORDER BY 절을 사용할 수 없습니다.
c. 서브쿼리의 SELECT절에 명시한 열은 메인쿼리의 비교 대상과 같은 자료형과 같은 개수로 지정해야 합니다. 즉 메인쿼리의 비교 대상 데이터가 하나라면 서브쿼리의 SELECT절 역시 같은 자료형인 열을 하나 지정해야 합니다.
d. 서브쿼리에 있는 SELECT문의 결과 행수는 함께 사용하는 메인쿼리의 연산자 종류와 호환가능해야 합니다. 예를 들어 메인쿼리에 사용한 연산자가 단 하나의 데이터로만 연산이 가능한 연산자라면 서브쿼리의 결과 행 수는 반드시 하나여야 합니다.
2. 다중행 서브쿼리(multiple-row subquery)
다중행 연산자 |
설명 |
IN |
메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 true |
ANY, SOME |
메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 true |
ALL |
메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 true |
EXISTS |
서브쿼리의 결과가 존재하면(즉, 행이 1개 이상일 경우) true |
A. IN연산자
결과)
EMPNO |
ENAME |
JOB |
MGR |
HIREDATE |
SAL |
COMM |
DEPTNO |
7698 |
BLAKE |
MANAGER |
7839 |
01-May-81 |
2850 |
- |
30 |
7566 |
JONES |
MANAGER |
7839 |
02-Apr-81 |
2975 |
- |
20 |
7788 |
SCOTT |
ANALYST |
7566 |
19-Apr-87 |
3000 |
- |
20 |
7902 |
FORD |
ANALYST |
7566 |
03-Dec-81 |
3000 |
- |
20 |
7369 |
SMITH |
CLERK |
7902 |
17-Dec-80 |
800 |
- |
20 |
7499 |
ALLEN |
SALESMAN |
7698 |
20-Feb-81 |
1600 |
300 |
30 |
7521 |
WARD |
SALESMAN |
7698 |
22-Feb-81 |
1250 |
500 |
30 |
7654 |
MARTIN |
SALESMAN |
7698 |
28-Sep-81 |
1250 |
1400 |
30 |
7844 |
TURNER |
SALESMAN |
7698 |
08-Sep-81 |
1500 |
0 |
30 |
7876 |
ADAMS |
CLERK |
7788 |
23-May-87 |
1100 |
- |
20 |
7900 |
JAMES |
CLERK |
7698 |
03-Dec-81 |
950 |
- |
30 |
B. ANY / SOME 연산자
결과)
EMPNO |
ENAME |
JOB |
MGR |
HIREDATE |
SAL |
COMM |
DEPTNO |
7839 |
KING |
PRESIDENT |
- |
17-Nov-81 |
5000 |
- |
10 |
7698 |
BLAKE |
MANAGER |
7839 |
01-May-81 |
2850 |
- |
30 |
7788 |
SCOTT |
ANALYST |
7566 |
19-Apr-87 |
3000 |
- |
20 |
7902 |
FORD |
ANALYST |
7566 |
03-Dec-81 |
3000 |
- |
20 |
C. ALL 연산자
결과)
EMPNO |
ENAME |
JOB |
MGR |
HIREDATE |
SAL |
COMM |
DEPTNO |
7369 |
SMITH |
CLERK |
7902 |
17-Dec-80 |
800 |
- |
20 |
D. EXISTS 연산자
3. 다중열 서브 쿼리
결과)
EMPNO |
ENAME |
JOB |
MGR |
HIREDATE |
SAL |
COMM |
DEPTNO |
7839 |
KING |
PRESIDENT |
- |
17-Nov-81 |
5000 |
- |
10 |
7698 |
BLAKE |
MANAGER |
7839 |
01-May-81 |
2850 |
- |
30 |
7788 |
SCOTT |
ANALYST |
7566 |
19-Apr-87 |
3000 |
- |
20 |
7902 |
FORD |
ANALYST |
7566 |
03-Dec-81 |
3000 |
- |
20 |
4. 인라인 뷰(inline view)
- 특정 테이블 전체 데이터가 아닌 SELECT문을 통해 일부 데이터를 먼저 추출해 온 후 별칭을 준다
결과)
EMPNO |
ENAME |
DEPTNO |
DNAME |
LOC |
7839 |
KING |
10 |
ACCOUNTING |
NEW YORK |
7782 |
CLARK |
10 |
ACCOUNTING |
NEW YORK |
7934 |
MILLER |
10 |
ACCOUNTING |
NEW YORK |
- 이 방식은 FROM절에 직접 테이블을 명시하여 사용하기에는 테이블 내 데이터 규모가 너무 크거나 현재 작업에 불필요한 열이 너무 많아 일부 행과 열만 사용하고자 할 때 유용
- 오라클 9i부터 제공한다.
※ 상호 연관 서브쿼리 : 메인쿼리에 사용한 데이터를 서브쿼리에서 사용하고 서브쿼리의 결과 값을 다시 메인쿼리로 돌려주는 방식인 상호연관 서브쿼리(correlated subquery)
5. 스칼라 서브쿼리(scalar subquery)
- SELECT절에도 서브쿼리를 사용
결과)
EMPNO |
ENAME |
JOB |
SAL |
SALGRADE |
DEPTNO |
DNAME |
7839 |
KING |
PRESIDENT |
5000 |
5 |
10 |
ACCOUNTING |
7698 |
BLAKE |
MANAGER |
2850 |
3 |
30 |
SALES |
7782 |
CLARK |
MANAGER |
2450 |
3 |
10 |
ACCOUNTING |
7566 |
JONES |
MANAGER |
2975 |
3 |
20 |
RESEARCH |
7788 |
SCOTT |
ANALYST |
3000 |
3 |
20 |
RESEARCH |
7902 |
FORD |
ANALYST |
3000 |
3 |
20 |
RESEARCH |
7369 |
SMITH |
CLERK |
800 |
1 |
20 |
RESEARCH |
7499 |
ALLEN |
SALESMAN |
1600 |
2 |
30 |
SALES |
7521 |
WARD |
SALESMAN |
1250 |
2 |
30 |
SALES |
7654 |
MARTIN |
SALESMAN |
1250 |
2 |
30 |
SALES |
7844 |
TURNER |
SALESMAN |
1500 |
2 |
30 |
SALES |
7876 |
ADAMS |
CLERK |
1100 |
2 |
20 |
RESEARCH |
7900 |
JAMES |
CLERK |
950 |
1 |
30 |
SALES |
7934 |
MILLER |
CLERK |
1300 |
2 |
10 |
ACCOUNTING |
'DB > 오라클(Oracle) 입문' 카테고리의 다른 글
오라클 설치없이 쿼리 연습하는 사이트 목록 (0) | 2019.04.20 |
---|---|
DML(Data Manipulation Language), 세션과 읽기 일관성 (0) | 2019.04.01 |
조인종류 & SQL-99 표준문법 (0) | 2019.04.01 |
데이터 그룹화2(LISTAGG, PIVOT, UNPIVOT) (0) | 2019.03.31 |
다중행 함수와 데이터 그룹화1 (0) | 2019.03.31 |