# 서브 쿼리

서브 쿼리(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가 같은 데이터를 가져오라는 조건이 나와있습니다.