티스토리 뷰

자격증/SQLD

SQLD - SQL 활용 [서브쿼리]

나는연어다 2017. 8. 14. 16:25

n  서브쿼리(Subquery)하나의 SQL문 안에 포함되어 있는 또 다른 SQL을 말한다.

 

n  서브쿼리를 사용할 때 다음 사항을 주의

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

     서브쿼리는 단일 행(Single Row) 또는 복수 행(Multiple Row) 비교 연산자와 함께 사용 가능하다.
단일 행 비교연산자는 서브쿼리의 결과가 반드시 1건 이하이어야 하고 복수행 행 비교연산자는 서브쿼리의 결과 건수와 상관없다.

     서브쿼리에서는 ORDER BY절을 사용하지 못한다. ORDER BY절은 SELECT 절에서 오직 한 개만 올 수 있기 때문에 ORDER BY절은 메인쿼리의 마지막 문장에 위치해야 한다.

 

n  서브쿼리가 SQL문에서 사용이 가능한 곳은 다음과 같다.

-       SELECT, FROM, WHERE, HAVING, ORDER BY,
INSERT
문의 VALUES, UPDATE문의 SET

 

n  동작방식에 따른 서브쿼리의 종류

서브쿼리 종류

설명

Un-Correlated(비연관)
서브쿼리

서브쿼리가 메인쿼리 칼럼을 가지고 있지 않은 형태의 서브쿼리이다. 메인쿼리에 값(서브쿼리가 실행된 결과)을 제공하기 위한 목적으로 주로 사용한다.

Correlated(연관)

서브쿼리

서브쿼리가 메인쿼리 칼럼을 가지고 있는 형태의 서브쿼리이다. 일반적으로 메인쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할 때 주로 사용된다.

 

n  반환되는 데이터의 형태에 따라 서브쿼리 분류

서브쿼리 종류

설명

Single Row 서브쿼리

(단일 행 서브쿼리)

서브쿼리의 실행 결과가 항상 1건 이하인 서브쿼리를 의미한다. 단일 행 서브쿼리는 단일 행 비교 연산자와 함께 사용된다. 단일 행 비교 연산자에는 =, <, <=, >, >=, <> 이 있다.

Multi Row 서브쿼리

(다중 행 서브쿼리)

서브쿼리의 실행 결과가 여러 건인 서브쿼리를 의미한다. 다중 행 서브쿼리는 다중 행 비교 연산자와 함께 사용된다. 다중 행 비교 연산자에는 IN, ALL, ANY, SOME, EXISTS가 있다.

Multi Column 서브쿼리

(다중 칼럼 서브쿼리)

서브쿼리의 실행 결과로 여러 칼럼을 반환한다. 메인쿼리의 조건절에 여러칼럼을 동시에 비교할 수 있다. 서브쿼리와 메인쿼리에서 비교하고자 하는 칼럼 개수와 칼럼의 위치가 동일해야 한다.

 

1.   단일 행 서브쿼리

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

 

2.   다중 행 서브쿼리

다중 행 연산자

설명

IN (서브쿼리)

서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건을 의미한다. (Multiple OR 조건)

비교연산자

ALL (서브쿼리)

서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건을 의미한다. 비교 연산자로 “>”를 사용했다면 메인쿼리는 서브쿼리의 모든 결과 값을 만족해야 하므로, 서브쿼리 결과의 최대값 보다 큰 모든 건이 조건을 만족한다.

비교연산자

ANY (서브쿼리)

서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건을 의미한다. 비교 연산자로 “>”를 사용했다면 메인쿼리는 서브쿼리의 값들 중 어떤 값이라도 만족하면 되므로, 서브쿼리의 결과의 최소값보다 큰 모든 건이 조건을 만족한다. (SOME ANY와 동일하다.)

EXISTS (서브쿼리)

서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건을 의미한다. 조건을 만족하는 건이 여러 건이더라도 1건만 찾으면 더 이상 검색하지 않는다.

 

3.   다중 칼럼 서브쿼리

-       다중 칼럼 서브쿼리는 서브쿼리의 결과로 여러 개의 칼럼이 반환되어 메이누커리의 조건과 동시에 비교되는 것을 의미한다.

 

4.   연관 서브쿼리

-       연관 서브쿼리(Correlated Subquery)는 서브쿼리 내에 메인쿼리 칼럼이 사용된 서브쿼리이다.

 

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

가.   SELECT 절에 서브쿼리 사용하기

u  스칼라 서브쿼리 (Scalar Subquery)는 한 행, 한 칼럼(1 Row, 1 Column)만을 반환하는 서브쿼리를 말한다.

u  스칼라 서브쿼리 또한 단일 행 서브쿼리이기 때문에 결과가 2건 이상 반환되면 SQL문은 오류를 반환한다.

 

나.   FROM 절에서 서브쿼리 사용하기

u  FROM 절에서 사용되는 서브쿼리를 인라인 뷰(Inline View)라고 한다.

u  인라인 뷰는 SQL문이 실행될 때만 임시적으로 생성되는 동적인 뷰이기 때문에 데이터베이스에 해당 정보가 저장되지 않는다. 그래서 일반적인 뷰를 정적 뷰(Static View)라고 하고 인라인 뷰를 동적 뷰(Dynamic View)라고도 한다.

 

다.   HAVING 절에서 서브쿼리 사용하기

u  HAVING절은 그룹함수와 함께 사용될 때 그룹핑된 결과에 대해 부가적인 조건을 주기 위해서 사용한다.

 

라.   UPDATE문의 SET절에서 사용하기

Ex) UPDATE TEAM A
   SET A.STADIUM_NAME = (SELECT X.STADIUM_NAME FROM STADIUM X WHERE X.STADIUM_ID = A.STADIUM_ID);

u  서브쿼리를 사용한 변경 작업을 할 때 서브쿼리의 결과가 NULL을 반환할 경우 칼럼의 결과가 NULL이 될 수 있기 때문에 주의해야 한다.

 

마.   INSERT문의 VALUES절에서 사용하기

Ex) INSERT INTO PLAYER(PLAYER_ID, PLAYER_NAME, TEAM_ID)
   VALUES ( ( SELECT TO_CHAR(MAX(TO_NUMBER(PLAYER_ID))+1) FROM PLAYER),’
홍길동’,’K06’);

 

6.   (View)

-       테이블은 실제로 데이터를 가지고 있는 반면, (View)는 실제 데이터를 가지고 있지 않다. 뷰는 단지 뷰 정의(View Definition)만을 가지고 있다. 질의에서 뷰가 사용되면 뷰 정의를 참조해서 DBMS 내부적으로 질의를 재작성(Rewrite)하여 질의를 수행한다. 뷰는 실제 데이터를 가지고 있지 않지만 테이블이 수행하는 역할을 수행하기 때문에 가상 테이블(Virtual Table)이라고도 한다.

뷰의 장점

설명

독립성

테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 된다.

편리성

복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수 있다

또한 해당 형태의 SQL문을 자주 사용할 때 뷰를 이용하면 편리하게 사용할 수 있다.

보안성

직원의 급여정보와 같이 숨기고 싶은 정보가 존재한다면

뷰를 생성할 때 해당 칼럼을 빼고 생성함으로써 사용자에게 정보를 감출 수 있다.

 

반응형
LIST
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함