본문 바로가기

SQL

SQL [13] - SUB QUERY 서브 쿼리 (단일행, 다중행)

<SUB QUERY>
select 구문 내부에 select를 사용하는 것입니다.


(1) 단일행 서브쿼리 : 서브쿼리의 결과가 1개인 경우.
사용 가능 연산자 : = , > , < , >= , <= 

 

-- Quiz, emp 테이블에서 'scott'보다 급여가 많은 사람의 이름과 급여를 출력하기

 

1단계 : scott의 급여를 select로 구하기 (단일행 서브쿼리)

select sal from emp where ename = 'SCOTT';

처음부터 조건으로 '3000보다 급여가 큰 사람'으로 나오면 '>= 3000'을 where 조건에 넣어주면 좋겠지만,

그렇지 않을 경우는 '>= (select sal from emp where ename = 'SCOTT')'를 where 조건에 넣어줘야 합니다.

 

2단계 : 위의 구문을 where 조건에 이용하여 위의 데이터 조회하기 (서브쿼리식은 괄호로 묶어줘야합니다.)

select ename, sal

from emp

where sal >= (select sal from emp where ename = 'SCOTT')

;

 

 

-- Quiz. 김진욱 학생보다 높은 학년의 이름, 학년, 학과번호, 학과명 출력하기

 

1단계 : 김진욱 학생의 학년을 출력하기 (단일행 서브쿼리)

select grade from student where name = '김진욱';

 

2단계 : 위의 구문을 where 조건에 이용하여 위의 데이터 조회하기 (서브쿼리식은 괄호로 묶어줘야합니다.)

다만, 해당 문제는 이름,학년,학과번호는 student 테이블 / 학과명은 department 테이블에 존재하는 데이터이기 때문에,  조인을 사용해줘야합니다. (등가조인을 이용합니다.)

select s.name, s.grade, s.deptno1, d.dname

from student s, department d

where s.deptno1 = d.deptno and

s.grade > (select grade from student where name = '김진욱')

;

-- Quiz 김진욱 학생과 같은 과 학생의 이름, 학년, 학과번호, 학과명 출력하기 (오라클, ANSI)


-- 오라클
select s.name, s.grade, s.deptno1, d.dname
from student s, department d
where deptno1 = (select deptno1 from student where name = '김진욱') and s.deptno1 = d.deptno
;

 

-- ANSI
select s.name, s.grade, s.deptno1, d.dname
from student s join department d
on s.deptno1 = d.deptno
where s.deptno1 = (select deptno1 from student where name = '김진욱')
;

 

(2) 다중행 서브쿼리 : 서브쿼리의 결과가 여러개인 경우. 
사용 불가능 연산자 : = , > , < , >= , <=


사용 가능 연산자 : in, any, all 
> any : 조회된 서브쿼리의 결과 중 한개만 일치. > min(값) 변환 가능
> all : 조회된 서브쿼리의 결과 중 한개만 일치. > max(값) 변환 가능
< any : 조회된 서브쿼리의 결과 중 한개만 일치. < max(값) 변환 가능
< all : 조회된 서브쿼리의 결과 중 한개만 일치. < min(값) 변환 가능

 

-- Quiz. emp2 테이블과 dept2 테이블을 참조하여 근무 지역이 서울 지사인 모든 사원의 사번, 이름, 부서번호 조회하기

1단계 : 근무지역이 서울지사인 dcode를 dept2에서 서브쿼리 조회하기 (4개의 행, 즉 다중 행 출력된다.)

select dcode from dept2 where area='서울지사'

2단계 : 위의 다중행 서브쿼리를 조건으로 이용하여 조회식 쿼리 작성하기
select empno, name, deptno
from emp2 
where deptno in (select dcode from dept2 where area='서울지사');

select empno, name, deptno
from emp2 
where deptno = (select dcode from dept2 where area='서울지사');

** 만약 다중행 서브쿼리에 =를 넣으면 에러가 납니다.

 

-- Quiz. 교수테이블에서 학과별로 입사일이 가장 오래된 교수의 교수번호, 이름, 학과명을 출력하기.

-- 학과 이름으로 정렬하기
select profno, name, deptno
from professor
where (deptno, hiredate) in (select deptno, min(hiredate) from professor group by deptno )
;

'SQL' 카테고리의 다른 글

SQL [15] - Update  (0) 2021.05.05
SQL [14] - Insert  (0) 2021.05.03
SQL [12] - SELF JOIN  (0) 2021.05.02
SQL [11] - JOIN(Cross, Equi, non-Equi, Outer)  (0) 2021.05.02
SQL [10] - LAG, LEAD, RANK OVER, SUM OVER, LISTAGG  (0) 2021.05.02