2020041005 / sub-query(서브 쿼리)
- ORACLE
- 2020. 4. 30.
-- 단일 행 서브쿼리문
-- 오라클 sql 문 : 서브쿼리(sub-query)
-- SQL : Structured Query Language
-- 서브 쿼리(sub-query) : 하나의 select 문장의 절안에 포한된 또 하나의 select 문장이다.
-- ex) scott 이 근무하는 부서명, 지역 출력 (서로 다른 테이블에 데이터가 존재)
select deptno from emp
where ename = 'SCOTT';
-- 아래의 실행과 동일한 결과
select dname, loc from dept
where deptno = 20;
-- 위의 실행과 동일한 결과
-- 서브뤄리는 비교 연산자(=)의 오른쪽에 기술해야 되고 반드시 괄호로 둘러 쌓아 먼저 실행되어야 한다
select dname, loc from dept -- 메인 쿼리문
where deptno = (select deptno from emp -- 서브 궈리문 주의사항은 항상 서브 쿼리문이 우선 순위로 실행한다
where ename = 'SCOTT'); -- 연사자 우선 순위 = 와 ( ) 가 동작한다
-- [예제] scott와 동일한 직급(job)을 가진 사원을 출력하는 sql문을 서브쿼리를 이요해서 작성해 보자
-- SCOTT의 직급확인 이부분이 서브쿼리 안에 들어갈 문장이 된다
select job
from emp
where ename = 'SCOTT';
-- 최종 실행문
select ename, job -- 메인쿼리문
from emp
where job = (select job
from emp
where ename = 'SCOTT' ); -- 서브쿼리문
-- [예제] scott의 급여와 동일하거나 더 많이 받는 사원 이름과 급여를 출력해 보자
select ename, job, sal
from emp
where sal >= (select sal
from emp
where ename = 'SCOTT'
);
-- [서브쿼리 & 그룹함수]
-- [예제] 전체 사원 평균 급여보다 더 많은 급여를 받는 사원 을 출력해 보자
-- 그룹함수를 사용 할 때는 group by
-- 평균 급여
select avg (sal)
from emp;
--실행문
select ename, sal, -- avg(sal) 을 추가할 수 없다 그룹함수를 개별적으로 출력할 수 없다
from emp
where sal > (select avg(sal)
from emp);
==============================
-- 다중 행 서브쿼리문
-- [예제] 급여를 3000 이상 받는 사원이 소속된 부서와 동일한 부서에서 근무하는 사원들의 정보를 출력해 보자
-- 3000 이상인 사람부터 확인
select * from emp;
-- 3000 이상인 부서 확인
select deptno
from emp
where sal >= 3000;
-- error 실행문---
select ename, sal, deptno
from emp
where deptno = (select deptno --error 연산을 할 때에는 1 vs 1 매칭이 되어야 하는데 복수개와 비교 할 수 없다
from emp
where sal >= 3000);
-- 동작 실행문---
select ename, sal, deptno
from emp
where deptno in (select deptno --error 연산을 할 때에는 1 vs 1 매칭이 되어야 하는데 복수개와 비교 할 수 없다
from emp
where sal >= 3000);
-- 다중 행연산자(Multiple Row Operator)와 함께 사용해야 한다
-- 1) [in 연산자]
-- 메인 쿼리의 비교 조건 ( ' = ' 연산자로비교할 경우)이 서브쿼리이 결과 중에서 하나라도 일치(or)하면 참이다
-- 2) [all 연산자]
-- 2-1) 메인 쿼리의 비교 조건이 서브쿼리의 검색결과와 모든 값이 일치하면 참이다
-- 2-2) 찾아진 값에 대해서 and 연산을 해서 모두 참이면 참이 되는 셈이 된다
-- 2-3) > all 은 '모든 비교 값 보다 크냐?' 라고 묻는 것이 되므로 최대값보다 더 크면 참이 된다
-- 3) [any 연산자]
-- 3-1) any 조건은 메인 쿼리의 비교 조건이 서브쿼리의 검색 결과와 하나 이상만 일치하면 참이다
-- 3-2) > any는 찾아진값에 대해서 하나라도 크면 참이 된다
-- 3-3) 그러므로 찾아진 값에서 가장 작은 값 즉 최소값 보다 크면 참이 된다
'ORACLE' 카테고리의 다른 글
2020041306 / 뷰(view) 옵션 whit check option (0) | 2020.04.30 |
---|---|
2020040906 / [7] Check 제약 조건 설정 (0) | 2020.04.30 |
2020040905 / Foreign key(외래키) 제약 조건 (0) | 2020.04.30 |
2020041004 / [3] ansi join (0) | 2020.04.30 |
2020041004 / 5) outer join (0) | 2020.04.30 |