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