[Oracle SQL] 오라클 스칼라 서브쿼리 알아보기

2021-03-04


Photo by Marek Piwnicki on Unsplash

스칼라 서브 쿼리 간단히 설명하자면 SELECT 절에 사용하는 서브 쿼리로써 단순한 JOIN을 대체할 목적으로 사용되는 경우가 많다. 다만 풀 스캔 등을 유발하는 등 JOIN에 비해서 알고리즘적 성능면에서 다소 떨어지기 때문에 JOIN을 할 수 있는 경우는 JOIN을 하는 게 좋다.

 

또한 서브쿼리에 조건에 따라 반드시 하나의 값을 출력하게 되며(단 한 개의 행을 출력한다는 의미가 아님), 만약에 서브 쿼리에 결과 데이터가 없을 경우 NULL 값을 리턴하다. 어떤 면에서는 OUTERJOIN과 다소 비슷한 역할을 하기도 한다.


- 예제 

 

SEE_INFO 테이블 PK -> SEENUM / FK -> GRADE

 

 

 

SEE_GRADE 테이블 PK_GRADE

 


- 스칼라 서브쿼리 예제 1

 

문제 : 2학년 학생의 번호 / 이름 /  나이 / 학년 이름을 찾아 출력하라.

 

스칼라 서브 쿼리의 가장 많은 사용방법은 바로 조인없이 조인과 같은 결과 값을 나타내는 것인데, 위의 문제를 서브쿼리로 나타내면 아래와 같다.

 

SELECT S.SEENUM, S.NAME, S.AGE
, (SELECT GNAME 
    FROM SEE_GRADE G 
    WHERE S.GRADE = G.GRADE) AS GNAME
FROM SEE_INFO S
WHERE GRADE = 2;

 

코드와 같이 FROM 절에는 하나의 테이블만 명시하고, SELECT 절에서 다른 테이블과 원하는 데이터 정보를 추출하는 방식이다.

 


- 스칼라 서브쿼리 예제 2

 

문제 : 학생의 번호가 5번 이상인 학생의 번호 / 이름 /  나이 / 학년 이름을 찾아 출력하라.

 

해당 문제에서 9번 학생과 10번 학생은 현재 학년이 정해지지 않아 학년 이름 또한 없는 상태이다. 만약에 스칼라 서브 쿼리가 INNER JOIN과 같은 특징이 나타날 경우 학년이 정해지지 않은 학생들이 데이터는 출력되지 않을 것이다. 하지만 스칼라 서브 쿼리는 쿼리 조건에 맞는 반드시 하나의 대응하는 값을 나타내야 하기 때문에 학년이 정해지지 않은 학생들은 GNAME이 NULL 값과 함께 출력된다. 

 

SELECT S.SEENUM, S.NAME, S.AGE
, (SELECT GNAME 
    FROM SEE_GRADE G 
    WHERE S.GRADE = G.GRADE) AS GNAME
FROM SEE_INFO S
WHERE SEENUM >= 5 ;

 

아래 결과에서 보듯이 여기서 스칼라 서브 쿼리의 특징으로 인해서 OUTTER JOIN과 같은 결과가 나오는 것을 확인할 수 있다.

 


 

위의 코드를 OUTTER JOIN 코드로 나타내면 아래와 같다.

 

--SQL OUTTER JOIN
SELECT S.SEENUM, S.NAME, S.AGE, G.GNAME
FROM  SEE_INFO S, SEE_GRADE G
WHERE S.GRADE = G.GRADE(+) 
AND SEENUM >= 5
ORDER BY SEENUM;

메인 이미지 출처:Photo by Marek Piwnicki on Unsplash