Engineering Note

SQL 서브쿼리 본문

Computer Science/Database

SQL 서브쿼리

Software Engineer Kim 2021. 7. 17. 00:54

서브쿼리

  • 하나의 쿼리 안에 포함된 또 하나의 쿼리 메인 쿼리가 서브쿼리를 포함하는 종속적인 관계
  • 알려지지 않은 기준을 이용한 검색에 유용
    • 만약 엘리스의 금액보다 높은 금액의 직원을 추출하려 한다면 select * from salaries where salary > 엘리스 급여
    • 이때 엘리스 급여를 미리 쿼리를 이용해 구하고 '엘리스 급여' 자리에 써주면 된다.
    • select * from emplyee where 급여 > (select 급여 from employee where 이름 = 'elice');
  • 메인 쿼리가 실행되기 이전에 한 번만 실행
  • 한 문장에서 여러 번 사용 가능

서브쿼리 사용시 주의사항

  • 서브쿼리는 괄호와 함께 사용되어야 한다.
  • 서브쿼리 안에서 order by 절은 사용할 수 없다.
  • 서브쿼리는 연산자의 오른쪽에서 사용 되어야한다.
  • 서브쿼리는 오로지 select문으로만 작성 할 수 있다.

단일 행 서브쿼리

  • Sigle-Row Subquery는 서브쿼리의 조회 겨로가가 1개의 행만 나오는 서브쿼리를 뜻합니다.
  • 서브쿼리에서 나오는 결과는 하나이므로 메인쿼리와 서브쿼리 결과는 단일행 연산자를 사용하여 비교합니다.
  • 단일행 연산자는 =,<>,> >= 등이 있다.

다중 행 서브쿼리

  • 서브쿼리가 결과를 2개 이상 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리

<any 최대값 ex) 10 < any(1,2,3,4) 최대값 4 보다 10이 작은지 비교

>any 최소값

>all 최대값 ex) 99 > all(99,100,101) 최대값 101보다 99가 큰지 비교

<all 최소값

=any(데이터1, 데이터2, 데이터3) 서브쿼리는 any의 값과 동일한 값만 반환한다.

연습문제1


select  max(sal)
from emp
group by deptno;


select *
from emp
where sal =any 
(select  max(sal)
from emp
group by deptno);

코드 설명

  • 부서별 최고 연봉 서브쿼리 결과 (5000,2850,2450,2975)이고 여기서 =any를 통해 서브쿼리를 사용하면 any의 값과 같은 컬럼의 값만 메인커리에서 추출할 수 있다.
  • any는 내부적으로 or 연산을 하기 때문에 any뒤에 나오는 데이터와 하나라도 만족하면 추출 되는 것이다.
  • 여기서 in을 사용해도 같은 결과가 나온다.

연습문제2

select *  
from emp  
where birthdate in  
(  
select min(birthdate)  
from emp  
group by deptno  

);

코드설명

  • 서브쿼리는 그룹별로 데이터를 묶어 주고 묶여진 데이터에서 가장 나이가 많은 생년월일을 추출한다. 그리고 이렇게 추출한 컬럼을 서브쿼리로 하여 in 연산자와 메인쿼리와 연산을 하면 원하는 값을 얻을 수 있다. 메인 쿼리에서 서브쿼리의 데이터와 맞는 데이터를 추출할 수 있기 때문이다.

위치에 따른 분류

  • where 절에 사용되는 서브쿼리
  • 스칼라 서브쿼리 - select절에서 사용하는 서브쿼리, 스칼라 서브쿼리는 오로지 한 행만 반환 마치 join을 사용한 것과 같은 결과를 나타낸다.
    • join 보다 계산 속도가 빠름

'Computer Science > Database' 카테고리의 다른 글

NoSQL  (0) 2021.07.19
SQL - 테이블 제어하기  (0) 2021.07.17
SQL과 함수  (0) 2021.07.16
SQL  (0) 2021.07.14
관계대수, 관계해석  (0) 2021.04.04
Comments