서브쿼리
2019. 4. 12. 10:34서브 쿼리
하나의 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; |