Single Row 서브쿼리

단일 행 서브쿼리

 - 서브 쿼리 실행 결과가 단 한 행만 조회

 - 단일 행 비교 연산자 사용 ( =, <, <=, >, >=, <>)

Multi Row 서브쿼리

다중 행 서브쿼리

 - 서브쿼리 실행 결과가 여러 개의 행 조회

 - 다중 행 비교 연산자 사용 (IN, ANY(=SOME), ALL, EXIST)

Multi Column 서브쿼리

다중 칼럼 서브쿼리

 - 서브쿼리 실행 결과로 여러 칼럼 반환.

 - 메인 쿼리 조건절에 여러 칼럼을 동시에 비교 가능


1. MAIN QUERY와 SUB QUERY 

- subquery : 하나의 SQL문 안에 포함되어 있는 또다른 SQL문. 알려지지 않은 기준을 이용한 "검색"을 위해 사용

메인쿼리에 종속적인 관계를 가짐


* 동작하는 방식에 따른 서브쿼리 분류

UN-CORRELATED

서브쿼리(비연관)

 - 서브쿼리가 메인쿼리 칼럼을 가지고 있지 않은 형태의 서브쿼리
 - 메인쿼리에 값을 제공하기 위한 목적으로 사용

CORRELATED

서브쿼리(연관)

 - 서브쿼리가 메인쿼리 칼럼을 가지고 있는 형태의 서브쿼리

 - 메인쿼리가 먼제 수행되어 일기혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하는 목적으로 사용

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

Single Row 서브쿼리

단일 행 서브쿼리

 - 서브 쿼리 실행 결과가 단 한 행만 조회

 - 단일 행 비교 연산자 사용 ( =, <, <=, >, >=, <>)

Multi Row 서브쿼리

다중 행 서브쿼리

 - 서브쿼리 실행 결과가 여러 개의 행 조회

 - 다중 행 비교 연산자 사용 (IN, ANY(=SOME), ALL, EXIST)

Multi Column 서브쿼리

다중 칼럼 서브쿼리

 - 서브쿼리 실행 결과로 여러 칼럼 반환.

 - 메인 쿼리 조건절에 여러 칼럼을 동시에 비교 가능


1) 단일 행 서브쿼리 

- 서브쿼리가 단일행 비교연산자( =, <, > ,<> 등)와 함께 사용되고, 시행 결과 건수가 1건 이하일 경우

SELECT PLAYER_NAME,PLAYER_AGE FROM PLAYER WHERE TEAM_ID=(한 건만 조회될 수 있는 SELECT문);

SELECT PLAYER_NAME,PLAYER_AGE FROM PLAYER WHERE TEAM_ID=(SELECT TEAM_ID FROM PLAYER WHERE PLAYER_NAME="기성용");

SELECT PLAYER_NAME,PLAYER_AGE FROM PLAYER WHERE PLAYER_HEIGHT>=(SELECT AVG(PLAYER_HEIGHT) FROM PLAYER);


2) 다중 행 서브쿼리

- 서브쿼리의 결과가 2건 이상 반환되어 반드시 다중행 비교연산자 (IN, ALL ,ANY, SOME, EXIST)와 사용해야 하는 서브쿼리

IN

 - 서브쿼리 결과 중 하나만 동일하면 참 (Multiple OR 조건)

ALL

 - 메인쿼리와 서브쿼리의 결과가 모두 동일하면 참

 - 메인쿼리는 서브쿼리의 모든 결과 값을 만족

   ">" 사용했다면 서브쿼리의 모든 결과 값을 다 만족해야 하므로 최대값을 반환 / "<"사용했다면 최소값 반환

ANY (= SOME)

 - 서브쿼리 결과 중 하나 이상 동일하면 참

   "<" 사용했다면 서브쿼리 모든 결과 값 중 하나라도 만족하면 되므로 최대값 직전 값 까지 참 / ">"사용했다면 최소값 직후 값 부터 참

EXIST

 - 서브쿼리 결과가 하나라도 존재하면 참 -> 참 거짓 반환됨

 - 만족하는 것이 여러 건이더라도 1건만 찾으면 더 이상 검색하지 않음


3) 다중 칼럼 서브쿼리

- 서브쿼리 결과로 여러 개의 칼럼이 반환되어 메인쿼리의 조건과 동시에 비교 되는 것

SELECT TEAM_ID, PLAYER_NAME, HEIGHT FROM PLAYER 

WHERE (TEAM_ID, HEIGHT) IN (SELECT TEAM_ID, HEIGHT FROM PLAYER GROUP BY TEAM_ID) ;

=> 서브쿼리의 결과값으로 두 개의 칼럼을 반환, 그것이 WHERE절의 조건 칼럼과 위치와 수 일치

- SQL SERVER에서는 지원 안함


4) 연관 서브쿼리

- 서브쿼리 내에 메인쿼리 칼럼이 사용된 서브쿼리

- 메인쿼리에서 데이터를 받아서 서브쿼리를 실행

SELECT ENAME, SAL FROM EMP WHERE EMP.DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DEPT.DEPTNO=EMP.DEPTNO);


5) 스칼라 서브쿼리

- SELECT절에서 사용하는 서브쿼리

- 한 행과 한 칼럼만 반환

- 칼럼을 쓸 수 있는 대부분의 곳에서 사용(칼럼으로 사용!)

SELECT ENAME, SAL, (SELECT AVG(SAL) FROM EMP) FROM EMP WHERE EMPNO IN (SELECT EMPNO FROM EMP WHERE SAL>=AVG(SAL));

스칼라 서브쿼리                                                            다중행 서브쿼리


6) 인라인뷰

- FROM절에 사용하는 서브쿼리

- FROM절에는 원래 테이블명이 오게 되어있음! 즉 FROM절 뒤에 오는 인라인뷰는 동적 테이블 생성하는 것!

- SQL문이 실행될 때만 임시적으로 생성되는 동적인 뷰

- ORDER BY 절 사용 가능 (TOP-N쿼리 : 인라인뷰에서 먼저 정렬 수행 후 정렬된 결과 중 일부 데이터 추출하는 것_ROWNUM...)

SELECT ENAME, EMPNO FROM (SELECT ENAME, EMPNO FROM EMP WHERE EMPNO BETWEEN 1000 AND 2000) WHERE SAL = AVG(SAL);


7) 그 밖의 위치에 존재하는 서브쿼리

- HAVING절에서 그룹핑된 결과에 대해 부가적인 조건을 주는 서브쿼리

- UPDATE문의 SET절에서 사용하는 서브쿼리

- INSERT문의 VALUES 절에서 사용하는 서브쿼리


2. 뷰

- 실제 데이터를 가지고 있지 않은 가상 테이블

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

- DDL로 뷰 생성, 삭제 가능하고 ALTER은 안됨

+ Recent posts