# 서브 쿼리
서브 쿼리(Subquery)는 쿼리 안의 쿼리를 의미하며, 쿼리문 안에 사용되는 쿼리입니다
서브 쿼리를 많이 사용할 경우, 읽기 어려운 쿼리를 만들 수 있습니다. 이 부분은 WITH 문을 사용해 가독성을 향상시키는 것을 추천합니다.
# FROM 절 서브 쿼리(테이블 서브 쿼리)
FROM 절에 뒤에 위치하며 서브 쿼리의 결과를 테이블로 인식합니다.
SELECT
number
FROM (
SELECT
number, korea_name, type1
FROM table
WHERE
type1 IN ("Fire", "Grass")
AND total > 300
)
# 스칼라 서브 쿼리
스칼라 서브 쿼리는 서브 쿼리의 결과로 스칼라 값(단일 값)을 반환합니다.
SELECT
account,
(SELECT mascot FROM Guilds WHERE Players.guild = id) AS player_mascot
FROM Players
# 배열 서브 쿼리
배열 서브 쿼리는 서브 쿼리의 결과로 배열(ARRAY)을 반환합니다.
SELECT
ARRAY(SELECT account FROM NPCs WHERE guild = 'red') AS red
FROM NPCs LIMIT 1;
# IN 서브 쿼리
IN 서브 쿼리는 특정 컬럼에 서브 쿼리의 결과가 포함된 경우 TRUE를 반환합니다.
SELECT
"corba" IN (SELECT account FROM Players) AS result
# EXISTS 서브 쿼리
EXISTS 서브 쿼리는 서브 쿼리가 하나 이상의 행이 존재할 경우 TRUE를 반환합니다.
SELECT
EXISTS(SELECT account FROM Players WHERE guild="yellow") AS result
# 상관 서브 쿼리
상관 서브 쿼리는 바깥 쿼리의 컬럼 중 하나가 서브 쿼리의 조건을 사용하는 경우를 의미합니다.
SELECT mascot
FROM Guilds
WHERE NOT EXISTS (
SELECT account
FROM Players
WHERE Guilds.id = Players.guild
)
- EXISTS 뒤에 있는 서브 쿼리를 보시면 WHRER 절에 Guilds.id(바깥 쿼리)와 Players.guild가 같은 데이터를 가져오라는 조건이 나와있습니다.