Programming/SQL

[SQL] 다양한 중첩 질의문 - 다중 컬럼 서브쿼리 / 상호 연관 서브쿼리 / 중첩질의문 주의점

reeme 2020. 12. 17. 19:18

다중 컬럼 서브 쿼리

: 서브 쿼리의 결과가 여러 개의 속성들로 구성되어 주쿼리의 조건과 비교하는 서브 쿼리임
 복수 개의 서브 쿼리들로 구성됨
 메인 쿼리와 서브 쿼리의 비교 대상 칼럼을 분리하여 개별적으로 비교한 후
 AND 연산에 의해 최종 결과를 출력함

예) 사원번호 101인 사원과 동일 부서에 동일한 급여를 지급받는 직원 구하기

select eno, ename, salary, dno from employee where dno in (select dno from employee where eno=101) 
and salary in (select salary from employee where eno=101)

상호 연관 서브 쿼리

메인 쿼리절과 서브 쿼리 간에 검색 결과를 교환하는 서브 쿼리

메인 쿼리와 서브 쿼리 간의 결과를 교환하기 위하여 서브 쿼리의 WHERE 조건절에서 메인 쿼리의 테이블과 연결함

서브 쿼리의 조건절에 메인 쿼리에서 사용하는 테이블의 속성이 나타남

메인 쿼리에서 어떤 튜플에 대한 조건을 비교하는가에

따라서 서브 쿼리의 결과가 다르게 나타남

SELECT 속성리스트

FROM table1

WHERE table1. 속성 비교연산자 (

SELECT 속성리스트

FROM table2

WHERE table2. 속성 비교연산자 table1. 속성 )

 

주의 사항

메인 쿼리에서 table1 에 속한 튜플을 하나씩 접근하여 WHERE 절 수행 시

서브 쿼리가 반복적으로 수행됨으로 성능이 매우 떨어질 있음

------>조인 구문을 이용하는 것이 더 효율적임

예)각 사원에 대하여 관리자와 동일 부서에서 근무 하는 사원들의 이름 , 급여 , 부서 번호 출력
(사원마다 관리자가 달라짐)

select eno,ename, salary, dno
from employee e 
where dno in ( select dno from employee m
where e.manager=m.eno);

중첩 질의문 작성시 주의점 

1. 다중행 서브 쿼리 시 단일행 비교 연산자와 사용하는 경우
중첩 질의문 사용 시 오류가 없도록 IN, ANY, ALL 을 기본적으로 사용함 - 아닐거같으면 저거 세개중에 하나 쓰면됨

select ename, salary, dno from employee 
where eno=(welect dno from employee where salary >=500);

<오류 해결방법> =연산자 대신 in / any / all중 적절한것을 써야함

 

서브쿼리가 null을 반환할 경우 메인 쿼리에서 결과를 생성하고 싶으면 'not exists'를 사용함 

select eno, ename, salary, dno from employee 
where not exists ( select dno from employee where eno=500);

 

 

2. 서브쿼리 내에서는 order by 절을 사용할 수 없음

select eno, ename, salary, dno from employee 
where dno in(select dno from employee where eno=101 order by dno); 

<오류 해결방법> - 서브쿼리 내의 orderby 삭제

 

 

 

3. 서브쿼리의 결과가 null일 경우 , 메인 쿼리의 결과 또한 null임

select eno, ename, salary, dno from employee 
where dno in ( select dno from employee where eno=500);