SQL 활용
서브쿼리
-SQL 안에 있는 SQL
사용시 주의사항
- 괄호로 감싸야 함
- 단일행, 복수행 비교 연산자 사용 가능
- ORDER BY 사용 불가.
-> 특정 값 계산이나 테이블 같이, WHERE에서 조건 비교용으로 활용할 수 있다.
- 인라인 뷰 같이 쓸 떄 조인할 테이블의 기본키가 2개 이상이면 WHERE에서 조인할 때 기본키에도 2개 모두 써야함
위치
- SELECT : GROUP BY 제외 모든 곳
- INSERT : VALUES
- UPDATE : SET
분류
동작방식에 따른 분류
- 연관 서브쿼리 : 메인 쿼리의 칼럼을 가지는 서브쿼리
-> 메인 - 서브 순서로 실행되어 메인에서 읽은 것을 서브에서 조건 확인
- 비연관 서브쿼리 : 메인 쿼리의 칼럼을 가지지 않는 서브 쿼리
-> 서브 실행 값을 메인에 제공용 (실행 순서는 그때그때 다름)
반환값 형태에 따른 분류
-
단일행 서브쿼리
- 단일행 비교 연산자와 같이 사용 (=, <, > 등)
- 다중행 비교 연산자도 사용 가능
- 실행 결과는 1건 이하
-
다중행 서브쿼리
- 다중행 비교연산자랑 같이 씀 (IN, ALL, ANY 등)
- 단일행 비교 연산자는 사용 불가
- 실행 결과가 여러건
-
다중 컬럼 서브쿼리
- 메인쿼리 조건과 비교하기 위해 사용
-> 비교 컬럼 개수, 위치 같아야 함
- 여러 칼럼 반환
위치에 따른 분류
-
스칼라 서브쿼리
- 위치 : SELECT 절
- 반환 : 단일행, 단일 열
-> 결과를 열처럼 사용하기 위해 씀
-
인라인 뷰 (= 동적 뷰)
- 위치 : FROM 절
-> 결과를 일회성 테이블처럼 사용하려고 씀
+) WHERE에서 조인 해야 하기 때문에 별칭 사용해야함.
-
중첩 서브쿼리
- 위치 : WHERE, HAVING (=조건절)
- 반환 : 여러가지 (단일, 다중, 다중컬럼, 연관/비연관)
-> 메인 쿼리 데이터 필터링, 비교용
HAVING 절에서의 서브쿼리
UPDATE의 SET절에서의 서브 쿼리
- 서브쿼리가 null 반환하지 않나 확인 필수 (null 반환하면 그대로 들어감)
NOT EXISTS와 서브쿼리
- 서브쿼리의 결과물 제거용
-> 메인 결과 - 서브 결과 (=차집합)
EXISTS와 서브 쿼리