서브쿼리
단일행 서브쿼리
서브쿼리는 where이나 having 조건에서 테이블 내의 고유값을 비교하기 위해서 사용한다.
(ex. 'KING'보다 급여가 많은 사람을 출력하시오)
직접 테이블을 확인하여 KING의 급여를 본 다음 코딩을 해도 되지만,
select *
from emp
where sal > 5000
이런 식의 코드는 KING의 급여가 변동되는 경우에는 바람직하지 않다.
따라서 서브쿼리를 이용하여 유연한 코드를 작성해야한다.
select *
from emp
where sal>(select sal from emp where ename='KING');
괄호 안에 비교하고 싶은 값을 SELECT 형식으로 작성하면 된다.
select *
from emp
where sal>(select min(sal) from emp where deptno=20 group by deptno);
서브 쿼리는 이런 식으로 그룹함수를 SELECT 하여 사용할 수 도 있으며
select deptno, min(sal)
from emp
group by deptno
having min(sal)>(select min(sal) from emp where deptno=20 group by deptno);
HAVING 절을 활용해서 그룹함수끼리 비교도 가능하다.
다중행 서브쿼리
두 개 이상의 행을 반환하는 서브쿼리를 다중행 서브쿼리라고 한다.
SELECT MIN(sal)
FROM emp
GROUP BY deptno;
해당 쿼리는 두개이상의 행을 반환한다.
총 3개의 행을 반환하므로 이 다중 행 서브쿼리를 활용하여 연산을 하려면
IN, ANY, ALL과 같은 다중행 비교 연산자를 사용해야한다.
select *
from emp
where
sal in (SELECT MIN(sal)
FROM emp
GROUP BY deptno);
IN은 반환된 세 개의 행 중 하나라도 일치하면 출력하는 연산자이다.
즉 SAL이 950 이거나 1100 이거나 1300인 사람들의 데이터가 출력될 것이다.
쉽게 이해하자면 where sal =950 or sal=1100 or sal=1300 으로 표현할 수 있다.
select *
from emp
where
sal > ANY (SELECT MIN(sal)
FROM emp
GROUP BY deptno);
ANY는 부등호(=,!=,<,>,<=,>=)연산자가 앞에 존재해야 사용 가능하다.
ANY는 반환된 다중 행을 조건에 대입하여 하나라도 일치하면 출력하는 연산자이다.
(IN과 유사)(sal = any는 in과 같은 기능)
즉 sal >950 이거나 sal >1100 이거나 sal >1300인 사람들의 데이터가 출력될 것이다.
where sal >950 or sal >1100 or sal >1300 으로 표현할 수 있다.
select *
from emp
where
sal > ALL (SELECT MIN(sal)
FROM emp
GROUP BY deptno);
ALL 또한 부등호(=,!=,<,>,<=,>=)연산자가 앞에 존재해야 사용 가능하다.
ALL은 반환된 다중 행을 조건에 대입했을때 모두 일치한 경우에만 출력하는 연산자이다.
즉 sal>950, sal>1100, sal>1300의 조건을 모두 만족시켜야한다 (결국 sal>최대값은 1300)
where sal >950 and sal>1100 and sal>1300 으로 표현할 수 있다.
'SQL' 카테고리의 다른 글
(SQL 문법) DML (INSERT, UPDATE, DELETE) (0) | 2022.01.05 |
---|---|
(SQL 문법) 집합 연산 (0) | 2022.01.05 |
(SQL 문법) JOIN (0) | 2022.01.05 |
(SQL 문법) SQL 함수 (그룹 함수) (0) | 2022.01.05 |
(SQL 문법) SQL 함수 (단일행 함수) (0) | 2022.01.05 |
댓글