조인: 여러개의 테이블에서 필요한 데이터 모아서 수집
=>단점: 여러 개의
서브쿼리: 여러개의 SQL문장을 한개로 통합
DML 전체에서 사용이 가능
= 종류
1) 단일행 서브쿼리 : 서브쿼리의 결과값이 1개
2) 다중행 서브쿼리 : 서브쿼리의 결과가 여러 개
3) 인라인 뷰 : FROM (SELECT~)
4) 스칼라 서브쿼리 : 컬럼 대신 사용
SELECT empno,ename,(SELECT ~ ) as dname
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
-- SCOTT => scott가 근무하는 부서에 같이 근무하는 사원의 모든 정보 출력
1)
SELECT deptno FROM emp WHERE ename='SCOTT';
2)
SELECT * FROM emp WHERE deptno=20;
1+2=>
SELECT * FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE ename='SCOTT');
/* 단일행 서브쿼리의 연산자
=> 비교연산자
= , !=(<>) , <= , >= , < , >
*/
SELECT * FROM emp WHERE deptno=(SELECT deptno FROM emp); --불가능한 문장: 하나의 값만 반환 가능
SELECT DISTINCT deptno FROM emp;
-- GROUP BY
-- 사원의 평균 급여 보다 높은 부서의 부서번호,인원수를 출력
SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno
HAVING AVG(sal)<(SELECT AVG(sal) FROM emp);
-- 스칼라 서브쿼리 => 결과값이 한개(컬럼)
-- SELECT empno,(SELECT~),(SELECT~) FROM emp
SELECT * FROM emp;
SELECT * FROM dept;
SELECT empno,ename,job,dname,loc
FROM emp,dept
WHERE emp.deptno=dept.deptno;
-- 서브쿼리
SELECT empno,ename,job,(SELECT dname FROM dept d WHERE d.deptno=e.deptno) as dname,
(SELECT loc FROM dept d WHERE d.deptno=e.deptno) as loc
FROM emp e;
SELECT empno,ename,job,sal,grade
FROM emp,salgrade
WHERE sal BETWEEN losal AND hisal;
SELECT empno,ename,job,sal,(SELECT grade FROM salgrade WHERE sal BETWEEN losal AND hisal) as grade
FROM emp;
-- 사원 정보 : 사번,이름,직위,입사일,부서명,근무지,급여등급 ==> KING사원과 같은 부서의 사원 출력
SELECT empno,ename,job,hiredate,sal,(SELECT dname FROM dept d WHERE d.deptno=e.deptno) as dname,
(SELECT loc FROM dept d WHERE d.deptno=e.deptno) as loc,
(SELECT grade FROM salgrade WHERE sal BETWEEN losal AND hisal) as grade
FROM emp e
WHERE deptno=(SELECT deptno FROM emp WHERE ename='KING');
-- 다중행 서브쿼리
SELECT deptno FROM dept;
/*
데이터가 여러개인 경우
= 데이터 전체를 처리 ==> IN
= 최대값 => ALL , MAX()
= 최소값 => ANY , MIN() , SOME()
=> >ANY() => 수행된 결과중에 최소값 >ANY(SELECT deptno FROM dept) ANY(10,20,30,40,50) => 10
(SELECT MIN(deptno)_FROM dept)
(SELECT MAX(deptno)_FROM dept)
<ANY() => 수행된 결과중에 최대값 >ANY(SELECT deptno FROM dept) ANY(10,20,30,40,50) => 50
>ALL() => 수행된 결과중에 최대값 >ALL(SELECT deptno FROM dept) ALL(10,20,30,40,50) => 50
<ALL() => 수행된 결과중에 최소값 >ALL(SELECT deptno FROM dept) ALL(10,20,30,40,50) => 10
*/
-- IN (10,20,30,40)
SELECT empno,ename,job,deptno
FROM emp
WHERE deptno IN(SELECT DISTINCT deptno FROM emp);
-- deptno=10 OR detpno=20 OR deptno=30
SELECT DISTINCT deptno FROM emp;
SELECT empno,ename,job,deptno
FROM emp
WHERE deptno>ANY(SELECT DISTINCT deptno FROM emp); --최소값 (10,20,30) => 10
SELECT empno,ename,job,deptno
FROM emp
WHERE deptno<ANY(SELECT DISTINCT deptno FROM emp); --최대값 (10,20,30) => 30
SELECT empno,ename,job,deptno
FROM emp
WHERE deptno<(SELECT NAX(deptno) FROM emp);
SELECT empno,ename,job,deptno
FROM emp
WHERE deptno>(SELECT MIN(deptno) FROM emp);
SELECT empno,ename,job,deptno
FROM emp
WHERE deptno<ALL(SELECT DISTINCT deptno FROM emp); --최소값 (10,20,30) => 30
SELECT empno,ename,job,deptno
FROM emp
WHERE deptno>ALL(SELECT DISTINCT deptno FROM emp); --최대값 (10,20,30) => 30
-- 인라인뷰 , TOP-N(rownum)=> 중간에 데이터를 자를 수 없다
-- 인기순위,베스트댓글
SELECT ename,job,sal,rownum FROM emp;
SELECT ename,job,sal,rownum FROM emp
WHERE rownum<=5;
SELECT ename,job,sal,rownum FROM emp
WHERE rownum BETWEEN 5 AND 10;
-- 5개 => 급여가 많은 사람
SELECT ename,job,sal,rownum FROM (SELECT ename,job,sal FROM emp ORDER BY sal DESC)
WHERE rownum<=5
ORDER BY sal DESC;
-- 인라인 뷰 => 페이징 기법
SELECT ename,job,sal,num
FROM (SELECT ename,job,sal,rownum as num
FROM (SELECT ename,job,sal FROM emp ORDER BY sal DESC))
WHERE num BETWEEN 5 AND 10;
|
cs |
'SQL(Oracle) > Oracle 이론 정리' 카테고리의 다른 글
[Oracle] SEQUENCE (0) | 2020.08.24 |
---|---|
[Oracle] JOIN (0) | 2020.08.12 |
[Oracle] 정규식 함수/그룹함수 (2) | 2020.08.10 |
[Oracle] 단일행 함수 (1) | 2020.08.06 |
[Oracle] SELECT / WHERE / GROUP BY / HAVING / ORDER BY (0) | 2020.08.05 |
댓글