반응형

서브 쿼리

 하나의 SELECT 문의 여러 절안에 포함되어 있는 SELECT 문장
 서브 쿼리는 소괄호로 묶여있어야한다
 서브 쿼리 구문에는 ORDER BY 절은 포함할 수 없다(의미가 없다)
 GRUOUP BY 절은 사용할 수 없다
 서브쿼리에서 사용할 수 있는 연산자 
 ㄴ 단일행 연산자 (=, >, >=, <, <=, <>, !=)
 ㄴ 복수행 연산자 (IN, ANY, ALL, NOT IN, ...)

 

 

서브쿼리로 할 수 있는 3가지

 

1. 단일행 서브트리

 SUB => MAIN로 전달되는 행이 하나인경우, 단일행 연산자 사용하자!!

 

SMITH와 같은 부서인 사람들의 이름, 직책, 부서번호를 조회하시오

1
2
3
4
5
SELECT ename, job, deptno
FROM emp
WHERE deptno = (SELECT deptno
            FROM emp
            WHERE ename = 'SMITH' );

 

 

SMITH와 같은 직책을 가지는 사람들의 이름, 급여, 직책을 출력하되, 급여가 적은 사원부터 출력하시오

1
2
3
4
5
6
SELECT ename, sal, job
FROM emp
WHERE job = (SELECT job
            FROM emp
            WHERE ename = 'SMITH')
ORDER BY sal;

 

 

 

전체 직원의 평균급여보다 적은 급여를 받는 사원의 이름, 급여를 조회

1
2
3
4
5
SELECT ename, sal
FROM emp
WHERE sal < (SELECT avg(sal)
            FROM emp);
 

 

 

그룹함수를 쓸려면 SELECT를 써줘야함
지역명이 CHICAGO 에 위치한 부서에 속한 사원의 이름과 부서 id 출력

emp e로하면 성능이 약간 더 빠르다!

1
2
3
4
5
SELECT e.ename, e.deptno
from emp AS e
where e.deptno = (SELECT d.deptno
                FROM dept AS d
                WHERE d.loc = 'CHICAGO');

 

 

2. 복수행 서브쿼리

 서브쿼리에서 메인쿼리로 전달하는 행이 여러개인 경우 복수행 연산자를 사용해야 한다.
 지역명 CHICAGO가 아닌곳에 위치한 부서에 속한 사원의 이름과 부서id 출력
 =은 하나의 행만 리턴이 됐을 때 쓸 수있다.
 그래서 e.deptno = (...)는 오류가 난다.
 그래서 in을 써줘야한다.

1
2
3
4
5
SELECT e.ename, e.deptno
from emp AS e
where e.deptno IN (SELECT d.deptno
                FROM dept AS d
                WHERE d.loc != 'CHICAGO');

 

 

ANY는 그중에 한 놈만이라도 만족하면 OK!

sal < ANY(1,2,....) : 최대값 보다 작은 것을 말한다.

sal > ANY(1,2,....) : 최소값 보다 큰 것을 말한다.

sal = ANY(1,2,...) : IN() 연산자와 동일

ANY, SOME 같은 의미로 사용됨

 

sal < ALL(1,2,) : 최소값 보다 작은 것

sal > ALL(1,2,) : 최대값 보다 큰 것

 

 

직책이 SALESMAN인 사원의 어느 한사람보다도 적은 급여를 받는 사원의 이름, 급여, 직책 출력

1
2
3
4
5
SELECT ename, sal, job
    from emp AS e
    where sal < ANY (SELECT sal
                FROM emp
                WHERE job = 'SALESMAN');

 

 

 

직책이 SALESMAN인 모든 사원의 급여보다 적게 급여를 받는 사원의 이름, 급여, 직책 출력

1
2
3
4
5
SELECT ename, sal, job
    from emp AS e
    where sal < ALL (SELECT sal
                FROM emp
                WHERE job = 'SALESMAN');

 

 

 

 

3. scalar 서브쿼리

하나의 행(값)을 리턴하는 서브쿼리

단일행 서브쿼리와 동일하지만 사용되는 위치가 SELECT의 컬럼명의로 사용한다.

 

 

 

각 사원의 이름, 급여, 전체사원의 평균급여를 출력하시오

1
2
3
SELECT ename, sal, (SELECT AVG(sal) FROM emp) AS '평균급여'
FROM emp;
 

 

 

 

반응형

'데이터베이스' 카테고리의 다른 글

JOIN  (0) 2019.04.12