DB 이야기

디비 이야기 17. 서브쿼리

김푸른초푸른 2020. 3. 8. 21:05

1. 서브쿼리란?

= 이중 SELECT 문으로 2번 이상 써야할 SELECT문을 한번에 출력되게 도와준다

 

2. 문법

: SELECT * FROM 테이블명 // 메인쿼리

  WHERE 조건식 연산자 (SELECT * FROM 테이블명 WHERE 조건식) // 서브쿼리

 

3. 서브쿼리 특징

1) 서브쿼리는 ( )를 사용한다

2) 단일행 또는 다중행 연산자 사용

3) 여러번 중첩해서 사용가능하다 


* 단일행 연산자로 서브쿼리 작성

EX) SELECT * FROM 테이블명 A

     WHERE A.salry = (SELECT * FROM 테이블명 WHERE 조건식);

-> salry에 서브쿼리 결과를 대입한다 

 

* 다중행 연산자 

1) IN(=) : 같은값이 있으면 출력 <-> NOT IN 

2) EXIST : 존재하는 값만 출력한다 

3) ANY(||) : 최소 한개 이상 맞으면 출력 

4) ALL(&&) : 모두 만족해야 출력


4. 스칼라 서브쿼리 (SELECT 절 안에서 사용)

= 한 행 : 한 컬럼만 반환 

EX) SELECT 키, 몸무게, 나이, 이름, 팀 평균키 -> (SELECT AVG(HEIGHT) FROM ROOM X WHERE X.ID = P.ID)                   FROM ROOM P

 

5. 인라인 뷰 (FROM 뒤에 사용)

= 서브쿼리가 FROM 절 뒤에 오는 문법이다 / 가상테이블인 뷰처럼 쓰인다하여 뷰가 붙는다

문법) 

SELECT * FROM 테이블명 A, (SELECT * FROM 테이블1 B WHERE 조건)

WEHRE A.ID = B.ID 

 

6. HAVING 절 

EX) HAVING AVG(HEIGHT) < (SELECT AVG(HEIGHT) FROM TEAM)

 

7. UPDATE 절 서브쿼리

EX) UPDATE TEAM A SET A.NAME = (SELECT X.NAME FROM TEAM2 X WHERE A.ID = X.ID)

 

8. 동작 방식에 따른 서브쿼리 분류 

1) 비연관 서브쿼리 (연산, 계산기)

= 서브쿼리가 메인쿼리의 컬럼을 가지고 있지 않음

-> 메인쿼리에 서브쿼리에서 결과값의 정보 제공 목적 

 

2) 연관 서브쿼리 (조건식)

= 메인 쿼리가 먼저 수행되어 얻은 데이터를 서브쿼리의 조건에 맞는지 확인하고자 할 경우에 사용

 

9. 반환 데이터 형태에 따른 서브쿼리 분류

1) 단일 행 서브쿼리

= 결과가 항상 1건 이하

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

 

2) 다중 행 서브쿼리

= 결과가 항상 여러 건인 서브쿼리

-> 다중 행 비교 연산자(IN, ALL, ANY, SOME, EXISTS)가 사용

 

3) 다중 컬럼 서브쿼리

= 여러 컬럼으로 반환되는 서브쿼리

-> 메인쿼리의 조건절에 여러 컬럼을 동시에 비교시 사용

: 서브쿼리와 메인쿼리에서 비교하는 컬럼 갯수와 위치가 동일해야함

=> UNION 쓸 때와 비슷