DATABASE

서브쿼리 & FROM절 서브쿼리 사용법

예나부기 2021. 9. 24.

서브쿼리란?


 

하나의 SQL 문에 포함되어 있는 또 다른 SQL 문을 말합니다.

 

서브쿼리 사용시 주의사항

 

1. 서브쿼리를 괄호로 감싸서 사용한다.

2. 서브쿼리는 단일 행 또는 복수 행 비교 연산자와 함께 사용 가능하다.

3. 서브쿼리에서는 ORDER BY 를 사용하지 못한다.

 

서브쿼리가 사용 가능한 곳

 

1. SELECT 절

2. FROM 절

3. WHERE 절

4. HAVING 절

5. ORDER BY 절

6. INSERT 문의 VALUES 절

7. UPDATE 문의 SET 절

 

 

서브쿼리의 분류


 

단일 행 서브 쿼리

 

서브쿼리가 단일 행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용할 때는 서브쿼리의 결과 건수가 반드시 1건 이하여야 합니다.

만약 결과가 2건 이상인 경우 오류가 발생합니다.

 

단일 행 쿼리의 예제

만약 T2 테이블의 C2 = 3 인 조건을 만족하는 C1 의 값이 2건 이상인 경우 오류가 발생합니다.

SELECT C1, C2, C3 FROM T1 WHERE C1 = (SELECT C1 FROM T2 WHERE C2 = '3') ORDER BY C1, C2, C3;

그룹 함수를 사용하는 경우 결과값이 1건이기 때문이 단일 행 서브쿼리로써 사용 가능합니다.

SELECT C1, C2, C3 FROM T1 WHERE C1 <= (SELECT AVG(C1) FROM T2 WHERE C2 = '3') ORDER BY C1, C2, C3;

 

다중 행 서브쿼리

 

서브쿼리의 결과가 2건 이상 반환될 수 있다면 반드시 다중 행 비교 연산자(IN, ALL, ANY, SOME)와 함께 사용해야 합니다.

 

 다중 행 연산자  설명
 IN  서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건을 의미한다.
 ALL  서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건을 의미한다.
 ANY  서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건을 의미한다.
 EXISTS  서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건을 의미한다.

 

만약 T2 테이블의 C2 = 3 인 조건을 만족하는 C1 의 값이 2건 이상인 경우 = 이 아닌 IN 을 사용해야 합니다.

SELECT C1, C2, C3 FROM T1 WHERE C1 IN (SELECT C1 FROM T2 WHERE C2 = '3') ORDER BY C1, C2, C3;

 

다중 칼럼 서브쿼리

 

서브쿼리 결과로 여러 개의 컬럼이 반환되어 메인쿼리의 조건과 동시에 비교되는 것을 의미합니다.

 

다중 칼럼 서브쿼리의 예제

SELECT C1, C2, C3 FROM T1 WHERE (C1, C2) IN (SELECT C1, C2 FROM T2 WHERE C2 = '3') ORDER BY C1, C2, C3;

 

연관 서브쿼리

 

서브쿼리 내에 메인쿼리 컬럼이 사용된 서브쿼리 입니다.

 

연관 서브쿼리 예제

SELECT T1.C1, T1.C2, T1.C3 FROM T1 T1 WHERE (T1.C1, T1.C2) IN (SELECT T2.C1, T2.C2 FROM T2 T2 WHERE T2.C2 = T1.C2) -- 메인 쿼리의 컬럼을 서브쿼리에 사용 ORDER BY T1.C1, T1.C2, T1.C3;

 

 

그 밖의 위치에서 사용하는 서브쿼리


 

SELECT 절에 사용하는 서브쿼리

 

스칼라 서브쿼리라고도 합니다.

스칼라 서브쿼리는 한 행, 한 컬럼만을 반환하는 서브쿼리를 말합니다.

 

SELECT T1.C1, (SELECT AVG(T2.C1) FROM T2 T2) FROM T1 T1;

 

FROM 절에 사용하는 서브쿼리

 

인라인 뷰 라고 합니다.

기본적으로 FROM 절에는 테이블 명이 오도록 되어있습니다. 그런데 서브쿼리가 FROM 절에 사용되면 동적으로 생성된 테이블인 것처럼 사용할 수 있습니다.

인라인 뷰는 SQL 문이 실행될 때만 임시적으로 생성되는 동적인 뷰이기 때문에 데이터베이스에 해당 정보가 저장되지 않습니다.

인라인 뷰는 동적으로 조인 방식을 사용하는 것과 같습니다.

SELECT T1.C1, T2.C1, T2.C2 FROM T1 T1, (SELECT C1, C2 FROM T2) T2 WHERE T1.C1 = T2.C1;

 

HAVING 절에서 사용하는 서브쿼리

 

그룹함수와 함께 사용될 때 그룹핑된 결과에 대해 부가적인 조건을 주기 위해 사용합니다.

SELECT T1.C1, T2.C1, T2.C2 FROM T1 T1, T2 T2 WHERE T1.C1 = T2.C1 GROUP BY T1.C1, T2.C1, T2.C2 HAVING AVG(T1.C1) < (SELECT AVG(C1) FROM T2 );

 

UPDATE 문의 SET 절에서 사용하기

UPDATE T1 T1 SET T1.C1 = (SELECT T2.C1 FROM T2 T2 WHERE T2.C1 = T1.C1);

 

INSERT 문의 VALUES 절에서 사용하기

INSERT INTO T1 (C1, C2, C3) SELECT C1, C2, C3 FROM T2;INSERT INTO T1 (C1, C2, C3) VALUES ((SELECT C1 FROM T2), (SELECT C2 FROM T2), (SELECT C3 FROM T2));

 

 


 

테이블은 실제로 데이터를 가지고 있는 반면, 뷰는 실제 데이터를 가지고 있지 않습니다.

질의에서 뷰가 사용되면 뷰 정의를 참조해서 DBMS 내부적으로 질의를 재작성하여 질의를 수행합니다.

뷰는 실제 데이터를 가지고 있지 않지만 테이블이 수행하는 역할을 수행하기 때문에 가상 테이블이라고도 합니다.

 

뷰 사용의 장점

 

 장점  설명
 독립성  테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 된다.
 편리성  복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수 있다.
 보안성  숨기고 싶은 정보가 존재하는 경우, 뷰를 생성할 때 해당 컬럼을 빼고 생성하여 정보를 숨길 수 있다.

 

 

 

이 내용은 'SQL 전문가 가이드, 한국데이터베이스 진흥원' 에서 공부한 내용입니다.

출처 : https://mozi.tistory.com/233

댓글