JAVA를 잡아라!...

SQL - 6. 서브 쿼리 (Subquery) 본문

DBMS_SQL/Oracle

SQL - 6. 서브 쿼리 (Subquery)

onivv 2023. 12. 25. 21:01

[ 개념 ]

  • 쿼리 안에 포함되는 또 다른 쿼리
  • 조인하지 않은 상태에서 다른 테이블과 일치하는 행을 찾거나, 조인 결과를 다시 조인할 때 사용
  • 포함 위치에 따라 중첩 서브 쿼리, 스칼라 서브 쿼리, 인라인뷰 서브 쿼리 등으로 구분

[ 특징 ]

  • 반드시 소괄호를 감싸 사용
  • 주 쿼리를 실행하기 전 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) 서브 쿼리로 검색 범위를 좁힌 후 본 쿼리 검색

서브 쿼리 : 학과 테이블의 해당 학과 번호 범위에 해당하는 [학과번호], [학과명] 검색하는 쿼리 (임시 테이블)

검색 쿼리 : 학생 테이블의 학과번호와 서브 쿼리의 학과번호가 일치하는 [학생테이블.이름], [서브쿼리.학과명] 검색

서브 쿼리 실행 결과 (임시 sb 테이블)
전체 실행 결과

 

이렇게 해도 검색 결과는 같지만 데이터 양이 많을 때 비효율적

 

#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