JAVA를 잡아라!...
SQL - 6. 서브 쿼리 (Subquery) 본문
[ 개념 ]
- 쿼리 안에 포함되는 또 다른 쿼리
- 조인하지 않은 상태에서 다른 테이블과 일치하는 행을 찾거나, 조인 결과를 다시 조인할 때 사용
- 포함 위치에 따라 중첩 서브 쿼리, 스칼라 서브 쿼리, 인라인뷰 서브 쿼리 등으로 구분
[ 특징 ]
- 반드시 소괄호를 감싸 사용
- 주 쿼리를 실행하기 전 1번만 실행
- 비교 연산자에 서브 쿼리를 사용하는 경우 서브 쿼리를 오른쪽에 기술
- 내부에는 정렬 구문 ORDER BY 문 사용 불가
#1 중첩 서브 쿼리 : WHERE 문, HAVING 문에 사용
- 중첩 서브 쿼리는 조건문의 일부로 사용
- 또 다른 SELECT 문을 사용한 결과를 주 쿼리의 조건값으로 사용
- 비교 연산자 (=, <, =<, >, >=, <>) 와 함께 사용시 반드시 서브 쿼리의 반환 결과가 1건 이하여야 함
- 만약 서브 쿼리의 반환 결과가 2건 이상이면 비교 연산자가 아닌 다중 행 연산자를 사용해야 함
1) 단일 행 서브 쿼리
- WHERE 문에 사용한 서브 쿼리가 한 행을 반환
- WHERE 문에 사용한 서브 쿼리가 다중 행을 반환하면 비교 연산자 규칙에 어긋나므로 오류 발생
SELECT [열 이름]
FROM [테이블]
WHERE [열] = (SELECT [열] FROM [테이블])
2) 다중 행 서브 쿼리
- 서브 쿼리에서 반환되는 결과가 2행 이상인 경우
다중 행 연산자 | 설명 |
IN | 서브 쿼리의 결과에 존재하는 임의의 값과 같은 조건 검색 |
ANY | 서브 쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건 검색 |
EXISTS | 서브 쿼리의 결과를 만족하는 값의 존재 여부 확인 |
ALL | 서브 쿼리의 결과에 존재하는 모든 값을 만족하는 조건 검색 |
① IN / NOT IN
SELECT [열 이름]
FROM [테이블]
WHERE [열] IN (SELECT [열] FROM [테이블])
② ANY
SELECT [열 이름]
FROM [테이블]
WHERE [열] =,<,>... ANY (SELECT [열] FROM [테이블])
③ EXISTS / NOT EXISTS
SELECT [열 이름]
FROM [테이블]
WHERE EXISTS (SELECT [열] FROM [테이블])
④ ALL
SELECT [열 이름]
FROM [테이블]
WHERE = ALL (SELECT [열] FROM [테이블])
#2 인라인뷰 서브 쿼리 : FROM 문에 사용
- FROM 문에 사용하는 서브 쿼리 결과는 조인할 수 있으므로 쿼리를 논리적으로 격리할 수 있음
SELECT [열 이름]
FROM [테이블] AS a
INNER JOIN (SELECT [열] FROM [테이블] WHERE [열] = [값]) AS b ON [a.열] = [b.열]
WHERE [열] = [값]
ex) 서브 쿼리로 검색 범위를 좁힌 후 본 쿼리 검색
서브 쿼리 : 학과 테이블의 해당 학과 번호 범위에 해당하는 [학과번호], [학과명] 검색하는 쿼리 (임시 테이블)
검색 쿼리 : 학생 테이블의 학과번호와 서브 쿼리의 학과번호가 일치하는 [학생테이블.이름], [서브쿼리.학과명] 검색
#3 스칼라 서브 쿼리 : SELECT 문에 사용
- SELECT 문에 사용하는 서브 쿼리는 반드시 1개의 행을 반환해야 하므로 집계 함수와 함께 사용하는 경우가 많음
- 하지만 성능 문제가 생기기 쉬우므로 SELECT 문에서는 서브쿼리를 집계함수와 함께 사용하지 않는게 좋음
- 스칼라 서브쿼리는 1개 이상 사용 가능
SELECT [열 이름],
(SELECT <집계함수> [열 이름] FROM [테이블2]
WHERE [테이블2.열] = [테이블1.열]) as Alias
FROM [테이블1]
WHERE [조건]
'DBMS_SQL > Oracle' 카테고리의 다른 글
SQL - 8. 날짜 함수 (0) | 2023.12.31 |
---|---|
SQL - 7. 문자열 함수 (0) | 2023.12.27 |
SQL - 5. 조인 (Join) (0) | 2023.12.25 |
SQL - 4. 자료형 (0) | 2023.12.23 |
SQL - 3. 테이블 생성 & 데이터 조작 (DDL & DLC) (0) | 2023.12.22 |