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은 안됨
'[자격증] SQLD (SQL Developer)' 카테고리의 다른 글
[SQLD][책없이 공부]2과목 02. SQL 활용_05 윈도우 함수 (0) | 2019.11.26 |
---|---|
[SQLD][책없이 공부]2과목 02. SQL 활용_04 그룹함수 (0) | 2019.11.26 |
[SQLD][책없이 공부]2과목 02. SQL 활용_02 계층형 조회, 셀프 조인 (0) | 2019.11.26 |
[SQLD][책없이 공부]2과목 02. SQL 활용_01 JOIN과 집합연산자 (0) | 2019.11.26 |
[SQLD][책없이 공부]2과목 01. SQL 기본_06 DCL, TCL (0) | 2019.11.18 |