정의된 테이블 예시
attribute |
type |
id (PRIMARY KEY) |
bigint |
title |
varchar |
content |
varchar |
created_at |
datetime |
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
);
- 비교연산자(<, >, = 등)을 모든 데이터가 만족해야지 출력한다.