디비 이야기 17. 서브쿼리
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 쓸 때와 비슷