Database

[DATABASE] Subquery (서브쿼리) - IN, (NOT) EXISTS, ANY, ALL

ju_young 2023. 11. 22. 12:47
728x90

정의된 테이블 예시

  • 테이블 명: article
attribute type
id (PRIMARY KEY) bigint
title varchar
content varchar
created_at datetime
  • 테이블 명: comment
attribute type
id (PRIMARY KEY) bigint
article_id (FOREIGN KEY) bigint
content varchar
created_at datetime

Subquery

SELECT id, title, content, created_at
FROM article
WHERE created_at < (
                SELECT created_at FROM article WHERE id = 1
            );
  • SELECT created_at FROM article WHERE id = 1을 subquery라고 하며 ()안에 작성한다.
  • SELECT id, title, content, created_at FROM article WHERE created_at는 outer query라고 부른다.
  • 위 쿼리를 정리하면 id가 1인 article의 created_at보다 작은 article을 조회한다는 것이다.

IN

SELECT title
FROM article
WHERE id IN (1, 3);
  • id = 1 OR id = 3을 위처럼 IN을 사용하여 id IN (1, 3)으로 표현할 수 있다.
  • 서브쿼리에도 적용할 수 있다.
    • IN (SELECT created_at FROM article WHERE title = 'title')

(NOT) EXISTS

SELECT A.id, A.title
FROM article A
WHERE EXISTS (
    SELECT * FROM comment C WHERE A.id = C.article_id AND C.id IN (2, 3) 
);
  • EXISTS는 서브쿼리의 결과가 존재하는지의 여부를 판단한다. 서브쿼리의 결과가 하나라도 있으면 해당 결과를 출력한다.
  • 반대로 NOT EXISTS는 서브쿼리의 결과가 하나도 없으면 출력한다.

ANY

SELECT A.id, A.title, C.content
FROM article A
WHERE created_at < ANY (
                SELECT created_at FROM comment C WHERE C.article_id = id
            );
  • 비교연산자(<, >, = 등)을 만족하는 데이터가 하나라도 존재한다면 출력한다.

ALL

SELECT A.id, A.title, C.content
FROM article A
WHERE created_at < ALL (
                SELECT created_at FROM comment C WHERE C.article_id = id
            );
  • 비교연산자(<, >, = 등)을 모든 데이터가 만족해야지 출력한다.
728x90

'Database' 카테고리의 다른 글

[DATABASE] JOIN  (1) 2023.11.26
[DATABASE] NULL  (0) 2023.11.23
[DATABASE] 데이터 조회 - Alias, DISTINCT, LIKE, *  (0) 2023.11.21
[DATABASE] 데이터 추가, 수정, 삭제  (0) 2023.11.20
[DATABASE] schema 변경  (1) 2023.11.17