관리 메뉴

Today is Present.

서브쿼리 종류(스칼라 서브쿼리, 인라인뷰, 서브쿼리) 본문

DBMS - 오라클(Oracle)

서브쿼리 종류(스칼라 서브쿼리, 인라인뷰, 서브쿼리)

MorningPhys 2022. 8. 9. 20:11

서브쿼리의 종류에 대한 개념정리

'Subquery'란 SQL 내에서 또 다른 select 절을 사용하는 문법을 말한다. 

 

사용위치에 따라 명칭이 달라진다. 

SELECT 절에 사용될 경우 스칼라 서브쿼리(Scalar Subquery)라 부르고,

FROM 절에 사용될 경우 인라인 뷰(Inline View)라 부르고,

WHERE 절에 사용될 경우 중첩 서브쿼리 or 서브쿼리 라고 부른다. 

 

쿼리문으로 개념을 살펴보자.

1. 스칼라 서브쿼리(Scalar Subquery)

- Select 절에서 사용하는 서브쿼리다. 

- Scalar 는 '한번에 한가지만 처리하는' 이라는 뜻을 가진다. 따라서, scalar subquery 에 의해 나오는 결과는 '하나의 행'이어야 한다.

SELECT *, (SELECT dept_name FROM departments d WHERE d.dept_id = e.dept_id)
 FROM employees e;

 

ex) 

아래와 같이 두개의 테이블(departments, employess)이 있다. 

두 테이블을 합치는 스칼라 서브쿼리는 작성할 때 주의해야 할 점은 다음과 같다. 

- departments를 scalar subquery로 하는 경우, '하린'의 dept_id인 10번에 해당하는 결과는 '총무' 부서로 1개 row를 반환.

- employees를 scalar subquery로 하는 경우, '개발'의 dept_id인 12에 해당하는 결과는 '중민', '웅식', '주아' 총 3개 rows가 결과로 반환되기 때문에 실패하게 된다. 

 

2. 인라인 뷰(Inline View)

- 인라인 뷰는 FROM 절에 사용되는 서브 쿼리다. 

- 인라인 뷰는 하나의 임시 테이블 이라고 생각하면 된다. 

- 메인 쿼리에서는 인라인 뷰에서 select 한 컬럼만 사용 가능하다. 

SELECT e.*, d.dept_name
FROM employees e, 
(SELECT dept_id, dept_name FROM departments) d
WHERE e.dept_id = d.dept_id;

 

3. 서브 쿼리

- 서브 쿼리는 WHERE 절에서 사용하는 쿼리다. 

- 서브 쿼리의 결과가 단일행이면 단일행 서브쿼리, 복수행이면 복수행 서브쿼리란 부른다. 

SELECT e.*, d.dept_name
FROM employees e, (SELECT dept_id, dept_name FROM departments) d
WHERE e.dept_id = d.dept_id;
SELECT *
FROM employees e
WHERE e.dept_id IN (SELECT d.dept_id FROM deptments d WHERE dept_name IN ('총무', '개발'));

4. Join 으로 표현하기

- 서브 쿼리를 사용하는 것보다는 join을 사용하는 게 일반적으로 성능이 더 좋다. 

SELECT *
FROM employees e INNER JOIN departments d
ON e.dept_id = d.dept_id;

출처: https://blog.naver.com/writer0713/222277186069

728x90
반응형