Oracle

[DB/오라클] 부속 질의 서브쿼리 완벽 정리 (스칼라, 인라인뷰) #15

원코딩 2022. 7. 11. 23:49

 

 

 

 

 

 

우리가 데이터를 가져오려고 할 때 보통은

테이블에서 원하는 컬럼을 가져오겠다 라고 선언하지만, 

더 복잡한 경우가 생기기 마련이다. 

가령 컬럼에 조건을 주거나 테이블에 조건을 준다면 

더 디테일한 질의가 가능하다. 

 

 

 

부속 질의 즉 서브쿼리는 

조건절 뒤에 SELECT 문을 사용하며,

컬럼 대신 사용하거나 

테이블 대신 사용하면서 

더욱 복잡한 질의를 가능하게 한다.

 

 

 

서브쿼리는 SELECT 문을 괄호로 묶어서 사용되며

질의가 중첩되어 있다는 의미로 중첩 질의라고도 불린다. 

 

 

 

서브쿼리의 종류와 그 기능에 대해서 알아보자.

 

 

 

1. 단일행 서브쿼리

2. 다중행 서브쿼리

3. 스칼라 서브쿼리

4. 인라인 뷰

 

 

 


 

 

 

 

 1. 단일행 서브쿼리 

 

 

서브쿼리의 결과 값이 1개이면 단일행 서브쿼리이다. 

즉, WHERE 절 뒤에 SELECT절을 사용했을 때

결과 값이 한 줄로 출력된다면 단일 행 서브쿼리이다. 

 

 

예제) 10번 부서에서 급여를 가장 많이 받는 사원의 이름, 급여를 emp 테이블에서 출력하라.

 

이처럼 KING 의 정보만 한줄로 출력되는 경우를 단일행 서브쿼리 라고 한다.

 

 

 

 

 2. 다중행 서브쿼리 

 

 

서브쿼리의 결과 값이 여러개라면 다중행 서브쿼리이다. 

즉, WHERE 절 뒤에 SELECT절을 사용했을 때

결과 값이 여러줄으로 출력된다면 다중행 서브쿼리이다. 

 

다중행 서브쿼리는 값이 여러개 이기 때문에

( = ) 같다 연산자를 사용할 수 없으며, 

비교 연산자 또한 사용이 불가하다. 

 

컬럼명 = 10,20,30 

(컬럼명이 10 이면서 20이면서 30일 수 없다.)

컬럼명 > 10,20,30 

(컬럼명이 10보다 크다? 20보다 크다? 30보다 크다? 연산이 불가능하다.)

 

다중행 서브쿼리에서는 IN연산자를 사용하여 결과값 전체를 대입한다. 

 

 

예제) 부서번호를 포함하고 있을 경우 이름과 급여를 emp테이블에서 출력하라.

 

이처럼 결과값이 여러 줄이라면 다중행 서브쿼리이다.

 

 

 

 

 3. 스칼라 서브쿼리 

 

 

컬럼 대신 SELECT절을 이용하는 것이 스칼라 서브쿼리이다. 

데이터 값이 단일 행일 경우 수행 가능하다. 

조인이 필요할 때 대신 사용할 수 있으며 속도가 조인보다 빠르다. (다만 문장이 길어진다) 

 

예제) 조인으로 3개의 테이블 연결하기 

 

emp 테이블, dept 테이블, salgrade 테이블을 JOIN을 이용하여 연결했다.

 

 

예제) 스칼라 서브쿼리로 3개의 테이블 연결하기

 

컬럼명 대신 SELECT 절을 이용하는 것이 스칼라 서브쿼리이다.

 

 

조인을 이용했을 때와 스칼라 서브쿼리를 이용했을 때 

출력 값은 같았지만 

가독성은 조인이 좋고

최적화는 스칼라 서브쿼리가 적합하다. 

 

 

 

 

4. 인라인 뷰 

 

 

테이블 대신 SELECT절을 이용하는 것이 인라인 뷰  이다. 

페이징(페이지 나누는) 기법에 많이 사용된다. 

 

인라인 뷰는 테이블을 직접적으로 사용하지 않을 뿐더러,

SELECT문장은 메모리에 저장되지 않기 때문에 보안에 뛰어나다! 

 

인라인 뷰를 사용할 때는 주의할 점이 있다. 

출력하고자 하는 컬럼은 반드시 인라인 뷰(쿼리 문장) 범위 내에 있어야 한다. 

인라인 뷰가 테이블 대신 사용된다고 했기 때문에 

테이블 안에 있는 데이터만 출력가능한 것이다. 

 

 

예제) 이름, 부서이름, 근무지를 emp테이블과 dept테이블에서 출력하라. 단, 부서번호가 같을 때

 

이처럼 FROM 뒤 TABLE 자리에 서브쿼리를 이용하는 것이 인라인 뷰 기법이다. 

위에서 언급한 것처럼 쿼리에 있는 컬럼에 한해서 데이터를 출력할 수 있다는 점을 기억하자.

(쿼리 문장에 loc 컬럼이 없었다면 loc 컬럼은 select 할 수 없기 때문에 오류나는 문장이다.)

 

 

인라인 뷰의 페이징 기법은 매우 중요하기 때문에 따로 자세히 다뤄보려 한다.

 

 

 


 

 

 

서브쿼리는 

SELECT, INSERT, UPDATE, DELETE

사용이 가능하며 

 

SQL문장을 여러개 합쳐서 사용하기 때문에

문장이 길어진다는 단점은 있으나, 

 

 JOIN보다 속도가 빠르기 때문에

주로 사용되는 기법이다.