: SQL문을 실행하는데 필요한 데이터를 추가로 조회하기 위해 추가로 넣는 SQL문
: 특정 데이터의 값을 기준으로 비교할 때 사용.
//이름이 JONES 인 사원의급여
select sal from emp
where ename = 'JONES';
+
//급여가 2975보다 높은 사원의 정보
select *from emp
where sal >2975;
↓
//JONES의 급여보다 높은 사원
select * from emp
where sal>(select sal from emp where ename = 'JONES');
//각 부서별 최고 급여와 동일한 급여를 받는 사람
select deptno, ename
from emp
where sal in (select max(sal) from emp group by deptno) //서브: 그룹별 최고급여 (10= A, 20=B, 30=C..)
order by deptno; 사원들 급여가 최고급여들(A,B,C..) 중 하나에 속한다면 출력.
select deptno, ename from emp
where sal= any (select max(sal) from emp group by deptno)
order by deptno;
==> IN 사용했을때와 같은 결과.
select deptno, ename from emp
where sal= some (select max(sal) from emp group by deptno)
order by deptno;
select *from emp
where sal = any (1000,2000,3000); // 1000,2000,3000 중에
where sal > any (1000,2000,3000); // 최소인 1000 보다 큰값
where sal >= any (1000,2000,3000); // 1000을 포함하며 1000보다 큰값
where sal < any (1000,2000,3000); // 최대인 3000 보다 작은값
where sal =< any (1000,2000,3000); // 3000을 포함하며 3000보다 작은값
where sal <> any (1000,2000,3000); // 다나와 이상해
ex)
select *from emp
where sal = all (1000,2000,3000); // 안나와
where sal > all (1000,2000,3000); // 최대인 3000보다 큰값만
where sal >= all (1000,2000,3000); // 3000을 포함하고 3000보다 큰값만
where sal < all (1000,2000,3000); // 최소인 1000보다 작은값만
where sal =< all (1000,2000,3000); // 1000을 포함하고 1000보다 작은값만
where sal <> any (1000,2000,3000); // 1000,2000,3000만 제외한 나머지값만
//10번 부서의 사람들보다 입사일이 빠른사람
select * from emp
where hiredate < all(select hiredate from emp where deptno =10);
ex)
select * from emp
where exists (select sal from emp where deptno = 30); //==> 30번 부서의급여가 존재하므로 출력.
select * from emp
where exists (select sal from emp where deptno = 50); //==> 50번 부서는 존재하지 않으므로 불가.
뷰
: 사용자에게 맞춤형으로 제공되는 가상의 테이블
인라인 뷰
: from 절에 직접 테이블명을 명시하고 테이블 내의 데이터 규모가 클때 데이터의 일부만 필요할 때 효율성을 높이기 위해 사용.
ex)
//부서번호 10번의 사원정보와 부서정보를 출력
select e10.empno, e10.ename, e10.deptno, d.dname, d.loc
from (select *from emp where deptno= 10) e10, //10번 부서의 직원들 정보만있는 e10이라는 가상 테이블 생성.
(select *from dept) d
where e10.deptno =d.deptno;
: select 문 앞에서 먼저 객체테이블을 생성해서 변수로 쓸수 있게 해줌.
ex)
//부서번호 10번의 사원정보와 부서정보를 출력
WITH e10 as (select * from emp where deptno = 10), //select 문 앞에서 e10 과 d 라는 객체를 먼저 생성.
d as (select * from dept)
select e10.empno, e10.ename, e10.deptno, d.dname, d.loc
from e10,d
where e10.deptno= d.deptno;
ex)
//emp 테이블에 없는 급여등급과 부서 이름을 포함하여 출력.
select empno, ename, job,sal,
(select grade from salgrade where e.sal between losal and hisal )as SALGRADE ,
deptno, (select dname from dept where e.deptno= dept.deptno) as DNAME
from emp e;
==> salgrade 테이블에 있는 정보로 얻은 결과를 하나의 행으로 가져옴.