서브쿼리 심화

highway92·2021년 9월 16일
0

SQL

목록 보기
8/11

1. 동작하는 방식에 따른 서브쿼리 분류

서브쿼리에 메인쿼리의 컬럼이 포함되는지에 따라 연관 서브쿼리, 비연관 서브쿼리로 구분한다.

연관서브쿼리 예시

메인쿼리의 컬림이 서브쿼리에 포함되며, 메인쿼리의 컬럼은 서브쿼리에 특정 조건으로 사용된다.


select id, department_id, name, salary
from employee as a
where
salary > (select avg(salary)
			from
            	employee as b
            where
            	b.department_id = a.department_id);

예시를 보면 서브쿼리에서 메인쿼리의 column을 참조하고 있다.

비연관 서브쿼리 예시

메인쿼리 컬럼이 서브쿼리에 포함되지 않으며, 주로 메인 쿼리에 특정한 값을 제공할 때 사용한다.

select
	avg(salary)
from
	employee
where
	department_id = (select
    					department_id
                     from
                     	employee
                     where
                     	name = 'steve');

예시를 보면 서브쿼리가 메인 쿼리를 참조하지 않는다.

2. 반환되는 데이터 형태에 따른 서브쿼리 분류

단일 행 서브쿼리

하나의 행만을 결과 값으로 가지는 서브쿼리를 뜻한다.

다중 행 서브쿼리

서브쿼리의 결과가 두 개 이상 행을 반환할 수 있으며, 다중 행 비교 연산자(IN, ALL, ANY, EXISTS)와 같이 사용된다.

  • IN : 서브쿼리 결과에 존재하는 값들 중 하나와 일치해야 한다.
  • EXISTS : 서브쿼리 결과 값이 존재하는지 여부를 확인한다. (존재하기만 하면 TRUE)
  • ALL : 서브쿼리 결과에 존재하는 모든 값들에 대해 조건을 만족해야 한다.
  • ANY : 서브쿼리 결과에 존재하는 값들 중 조건을 만족하는 것이 하나 이상 존재해야 한다.

다중 컬럼 서브쿼리

서브 쿼리의 결과가 여러 개의 컬럼을 반환하며, 메인쿼리의 조건과 비교된다.

select
	name,
    salary
from
	employee
where
	(department_id, salary) in
    (select
    	department_id, max(salary)
     from
     	employee
     group by
     	department_id);

3. 스칼라 서브쿼리

하나의 속성을 가지면서, 하나의 행만을 반환하는 쿼리이다. select, where, having 절 등에서 사용 할 수 있다.

select
	name,
    (select
    	count(*)
     from
     	employee as e
     where
     	e.department_id = d. id)
from
	department as d;

4. VIEW

뷰는 다른 테이블에서 파생된 테이블이다. 물리적(하드웨어)으로 데이터가 저장되는 것이 아니라,
논리적으로만 존재하며 뷰를 사용한 질의 시에는 DBMS에서 뷰 정의에 따라 질의를 재작성하여 수행한다.

VIEW의 장점

  • 독립성 : 테이블 구조가 변경되어도 뷰를 사용하고 있는 응용 프로그램은 변경하지 않아도 된다.
  • 편리성 : 자주 사용되는 복잡한 쿼리를 미리 뷰로 정의해 놓으면, 추후 쿼리는 간단한 형태로 표현할 수 있다.
  • 보안성 : 사용자의 권한에 따라 열람 가능한 데이터를 다르게 할 수 있다.

VIEW의 특징

  • 생성된 뷰는 또 다른 뷰를 생성하는데 사용 될 수 있다.
  • 뷰의 정의는 변경할 수 없으며, 삭제 후 재생성이 필요하다.
  • 뷰를 통한 갱신에는 제약이 따른다. 갱신을 위해서는 기본적으로 원천 테이블의 기본키가 포함되어야 한다.
  • 원천이 되는 테이블이나 뷰가 삭제되면 이를 기반으로 하는 뷰도 함께 삭제된다.

VIEW 예시

create [또는 replace] view 뷰 이름 as
select 컬럼 1, 컬럼 2, .....
from 테이블 이름
where 조건
      
profile
웹 개발자로 활동하고 있습니다.

0개의 댓글