DBMS/MySQL 정리

[MySQL] 서브 쿼리

웹코린이 2023. 6. 23. 12:29
728x90

서브 쿼리란 ?

  • 쿼리 안에 포함되는 또 다른 쿼리를 말한다.
  • 서브쿼리는 조인하지 않은 상태에서 다른 테이블과 일치하는 행을 찾거나, 조인 결과를 다시 조인할 때 사용할 수 있다.

 

서브 쿼리의 특징

- 반드시 소괄호로 감싸 사용한다.
- 주 쿼리를 실행하기 전에 1번만 실행한다.
- 비교 연산자에 서브 쿼리를 사용하는 경우 서브 쿼리를 오른쪽에 기술해야 한다.
- 내부에는 정렬 구문인 ORDER BY 문을 사용할 수 없다.

 

WHERE 문에 서브 쿼리 사용하기

  • 중첩 서브쿼리라고 부르고 서브 쿼리를 조건문의 일부로 사용한다.
  • 주 쿼리문 안에서 SELECT문을 사용하여 주 쿼리의 조건값으로 사용한다.
  • 비교연산자와 함께 사용할 때는 반드시 서브 쿼리의 반환 결과가 1개 이하여야 한다.
  • 반환 결과가 2개 이상인 경우에는 비교 연산자가 아닌 다중 행 연산자를 사용해야 한다.

 

다중 행 연산자 설명
IN 서브 쿼리의 결과에 존재하는 임의의 값과 같은 조건 검색
ANY 서브 쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건 검색
EXISTS 서브 쿼리의 결과를 만족하는 값이 존재하는지 여부 확인
ALL 서브 쿼리의 결과에 존재하는 모든 값을 만족하는 조건 검색

 

단일 행 서브 쿼리

  • 서브 쿼리의 결과가 1행만 반환되는 쿼리를 말한다.

 

WHERE 문에 사용하는 단일 행 서브 쿼리의 선언 방법

SELECT [열 이름]
FROM [테이블]
WHERE [열] = (SELECT [열] FROM [테이블])

 

다중 행 서브 쿼리

  • 서브쿼리에서 반환되는 결과가 2행 이상인 경우를 말한다.

 

IN문, NOT IN 문

SELECT [열 이름]
FROM [테이블]
WHERE [열] IN (SELECT [열] FROM [테이블])

 

ANY 문

  • 서브 쿼리 결과에서 값이 하나라도 만족하는 조건을 검색한다.
SELECT [열 이름]
FROM [테이블 이름]
WHERE [열] ( <, =, > ) ANY (SELECT [열] FROM [테이블])

 

EXIST 문, NOT EXIST 문

  • 조건의 결괏값이 있는지 없는지를 확인해 1행이라도 있으면 TRUE, 없으면 FALSE를 반환한다.
SELECT [열 이름]
FROM [테이블]
WHERE EXISTS (SELECT [열] FROM [테이블])

 

ALL 문

  • 서브 쿼리 결괏값에 있는 모든 값을 만족하는 조건을 주 쿼리에서 검색해 결과를 반환한다.
SELECT [열 이름]
FROM [테이블]
WHERE [열] = ALL (SELECT [열] FROM [테이블])

 

 

FROM 문에 서브 쿼리 사용하기

  • FROM 문에 사용하는 서브 쿼리 결과는 조인할 수 있으므로 쿼리를 논리적으로 격리할 수 있다.
  • 보통 인라인뷰라고 하며 이후 이 용어를 혼용한다.
SELECT [열 이름]
FROM [테이블] AS a
INNER JOIN (SELECT [열] FROM [테이블] WHERE [열] = [값]) AS b ON [a.열] = [b.열]
WHERE [열] = [값]

 

 

SELECT 문에 서브 쿼리 사용하기

  • SELECT 문에 사용하는 서브 쿼리는 받느시 1개의 행을 반환해야 하므로 SUM, COUNT, MIN, MAX 등의 집계 함수와 함께 사용하는 경우가 많다. (성능 문제가 생기기 쉬우므로 함께 사용하지 않는 것이 좋다)
  • 스칼라 서브 쿼리라고 부르며, 1개 이상 사용할 수 있다.
SELECT [열 이름]
	(SELECT <집계 함수> [열 이름] FROM [테이블 2]
    WHERE [테이블 2.열] = [테이블 1.열]) as Alias
FROM [테이블 1]
WHERE [조건]

 

728x90