Database/MySQL

[MySQL] 서브 쿼리

IT수정 2024. 9. 10. 17:40

서브 쿼리(Subquery)는 쿼리 안에 포함되는 또 다른 쿼리를 말한다.

 

서브 쿼리의 특징

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

 

WHERE 문에 서브 쿼리 사용하기

서브 쿼리 중에서도 WHERE 문에 사용하는 서브 쿼리를 중첩 서브 쿼리라고 한다. 이것은 조건문의 일부로 사용한다. 그리고 서브 쿼리를 비교 연산자와 함께 사용할 때는 반드시 서브 쿼리의 반환 결과가 1건 이하 여야 한다. 2건 이상 반환할 경우 다중 행 연산자를 이용해야 한다.

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

 

단일 행 서브 쿼리

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

SELECT * FROM userTBL WHERE userID = (SELECT userID FROM userTBL WHERE userID IN ('BBK'));

 

다중 행 서브 쿼리

-- IN 문
SELECT * FROM userTBL WHERE userID IN ('BBK', 'KBS', 'KTW');
SELECT * FROM userTBL
WHERE userID IN (SELECT userID FROM userTBL WHERE userID IN ('BBK', 'KBS', 'KTW'));

-- ANY 문
SELECT * FROM userTBL WHERE userID = ANY (
SELECT userID FROM userTBL WHERE userID IN ('BBK', 'KBS', 'KTW'));

-- EXISTS 문
SELECT * FROM userTBL WHERE EXISTS (
SELECT userID FROM userTBL WHERE userID IN ('BBK', 'KBS', 'KTW'));

-- ALL 문
SELECT * FROM userTBL WHERE height > ALL (
SELECT height FROM userTBL WHERE height = 170);

 

FROM 문에 서브 쿼리 사용하기

FROM 문에 사용하는 서브 쿼리 결과는 조인할 수 있으므로 쿼리를 논리적으로 격리할 수 있다. 보통 인라인 뷰(Inline View)라고 한다.

SELECT [열 이름]
FROM [테이블] AS a
INNER JOIN (SELECT [열] FROM [테이블] WHERE [열] = [값]) AS b ON [a.값] = [b.열]
WHERE [열] = [값]

 

SELECT 문에 서브 쿼리 사용하기

SELECT 문에 사용하는 서브 쿼리는 반드시 1개의 행을 반환해야 하므로 SUM, COUNT, MIN, MAX 등의 집계 함수와 함께 사용하는 경우가 많다. 하지만 이렇게 하면 성능 문제가 생기기 쉬우므로 SELECT 문에서는 서브 쿼리를 집계 함수와 사용하지 않는 것이 좋다. SELECT 문에 사용된 서브 쿼리는 스칼라 서브 쿼리라고 부르며, 스칼라 서브 쿼리는 1개 이상 사용할 수 있다.

SELECT [열 이름],
(SELECT <집계 함수> [열 이름] FROM [테이블 2]
WHERE [테이블 2.열] = [테이블 1.열]) as Alias
FROM [테이블 1]
WHERE [조건]

 

'Database > MySQL' 카테고리의 다른 글

[MySQL] 내장 함수 - 수학 함수  (0) 2024.09.11
[MySQL] 공통 테이블 식  (0) 2024.09.10
[MySQL] 조인  (2) 2024.09.10
[MySQL] 내장 함수 - 제어 흐름 함수, 문자열 함수  (0) 2024.09.10
[MySQL] 변수와 형 변환  (0) 2024.09.10