-- '이순신' 의 데이터를 가져오되 그 부서의 평균 연봉을 가져오라.
-- 출처: https://aljjabaegi.tistory.com/14 [알짜배기 프로그래머]
SELECT T1.*,
(SELECT Avg(salary)
FROM amt_mst_test S1
WHERE S1.dept_cd = T1.dept_cd) AS AVG_SALARY
FROM amt_mst_test T1
WHERE T1.emp_nm = '이순신'
-- '이순신' 의 데이터를 가져오되 그 부서의 평균 연봉을 가져오라.
-- 출처: https://aljjabaegi.tistory.com/14 [알짜배기 프로그래머]
SELECT T1.*,
(SELECT Avg(salary)
FROM amt_mst_test S1
WHERE S1.dept_cd = T1.dept_cd) AS AVG_SALARY
FROM amt_mst_test T1
WHERE T1.emp_nm IN '이순신'
SELECT c1,
c2,
c3
FROM t1
WHERE c1 IN (SELECT c1 -- Where 조건문에 IN을 사용한다.
FROM t2
WHERE c2 = '3')
🥕 다중 칼럼 서브쿼리
-- 형태
SELECT c1,
c2,
c3
FROM t1
WHERE ( c1, c2 ) IN (SELECT c1,
c2
FROM t2
WHERE c2 = '3')
-- 괄호는 t2 테이블에서 c2값이 3인 c1c2컬럼을 가져와라
-- 부서별로 가장 작은 급여(sal)를 받는 직원을 조회
SELECT deptno,
ename,
sal
FROM emp
WHERE ( deptno, sal ) IN (SELECT deptno,
Min(sal)
FROM emp
GROUP BY deptno)
ORDER BY deptno;
💡 DEPTNO ENAME SAL
---------- -------------------- ----------
10 MILLER 1300
20 SMITH 800
30 JAMES 950
🥕 연관 서브쿼리
SELECT ename,
sal,
deptno
FROM emp
ORDER BY deptno,
sal;
ENAME sal deptno
-------------------- ---------- ----------
miller 1300 10
clark 2450 10
king 5000 10
smith 800 20
adams 1100 20
jones 2975 20
scott 3000 20
ford 3000 20
james 950 30
martin 1250 30
ward 1250 30
turner 1500 30
allen 1600 30
blake 2850 30
14 개의 행이 선택되었습니다.
------------------------------------------------------------
-- 부서별 평균 sal
SELECT deptno,
Avg(sal)
FROM emp
GROUP BY deptno;
DEPTNO avg(sal)
------------------------------------------------------------
30 1566.66667
20 2175
10 2916.66667
---------------------------------------------------------------------------
SELECT ename,
deptno,
sal
FROM emp e1
WHERE sal >
(
SELECT avg(sal)
FROM emp e2
WHERE e2.deptno=e1.deptno)
ORDER BY deptno;
ENAME deptno sal
------------------------------------------------------------
king 10 5000
jones 20 2975
scott 20 3000
ford 20 3000
allen 30 1600
blake 30 2850
6 개의 행이 선택되었습니다.
--------------------------------------------------
-- 1) 메인쿼리에서 부서번호(e1.deptno)를 읽어서 서브쿼리로 전달
-- 2) 서브쿼리는 메인쿼리에서 받은 부서번호로 평균 급여 계산
-- 3) 다시 메인쿼리는 서브쿼리의 평균 급여보다 큰 급여의 직원 출력
🥕 FROM 절에 사용하는 서브쿼리
SELECT t1.c1,
T2.c1,
T2.c2
FROM t1 T1,
(SELECT c1,
c2
FROM t2) T2
WHERE t1.c1 = T2.c1;
즉, FROM 절에 서브쿼리를 사용하면 특정 조건식을 갖는 SELECT 문을 테이블처럼 사용할 수 있습니다.
이를 통해 SELECT 문을 효율적이고 간결하게 작성할 수 있습니다.
이는 마치 가상 테이블, 즉 뷰(view)2와 같은 역할을 한다고 해서 인라인 뷰(inline view)라고도 부릅니다.
뷰
뷰 사용의 장점 | 설명 |
---|---|
독립성 | 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 된다. |
편리성 | 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수 있다. |
보안성 | 숨기고 싶은 정보가 존재하는 경우, 뷰를 생성할 때 해당 컬럼을 빼고 생성하여 정보를 숨길 수 있다. |