JOIN 유형(INNER/LEFT/RIGHT/FULL/CROSS)
Oracle
-- INNER: matching rows
SELECT m.name, s.amount
FROM customer m JOIN orders s ON m.id = s.customer_id;
-- LEFT: customers without orders are included too
SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;
-- CROSS: Cartesian product
SELECT r.name, u.name FROM color r CROSS JOIN product u;JOIN은 지정한 조건에 따라 두 테이블을 결합한다. INNER는 일치하는 행만, LEFT/RIGHT는 한쪽의 모든 행을(일치하지 않으면 NULL), FULL은 양쪽의 행을, CROSS는 모든 조합을 반환한다. Oracle은 표준 ANSI JOIN 외에 기존 (+) 외부 조인 구문도 지원한다.
PostgreSQL
SELECT m.name, s.amount
FROM customer m INNER JOIN orders s ON m.id = s.customer_id;
SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;
SELECT m.name, s.amount
FROM customer m FULL OUTER JOIN orders s ON m.id = s.customer_id;PostgreSQL은 모든 표준 JOIN 유형(INNER, LEFT/RIGHT/FULL OUTER, CROSS)을 완전히 지원한다. USING(my_column)은 같은 이름의 컬럼에 대한 약식 표기이며, NATURAL JOIN은 같은 이름의 모든 컬럼으로 자동 조인한다(신중하게 사용).
MySQL
SELECT m.name, s.amount
FROM customer m INNER JOIN orders s ON m.id = s.customer_id;
SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;
-- MySQL has no FULL OUTER JOIN:
SELECT m.name, s.amount FROM customer m LEFT JOIN orders s ON m.id = s.customer_id
UNION
SELECT m.name, s.amount FROM customer m RIGHT JOIN orders s ON m.id = s.customer_id;MySQL/MariaDB는 INNER, LEFT, RIGHT, CROSS JOIN을 지원하지만 FULL OUTER JOIN은 직접 제공하지 않으며, LEFT와 RIGHT 결과를 UNION으로 결합해 흉내 낸다. 기존의 쉼표식 조인은 카티션 곱을 만들므로 ON/WHERE로 제한해야 한다.
SQL Server
SELECT m.name, s.amount
FROM customer m INNER JOIN orders s ON m.id = s.customer_id;
SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;
SELECT m.name, s.amount
FROM customer m FULL OUTER JOIN orders s ON m.id = s.customer_id;SQL Server는 모든 표준 JOIN 유형을 지원한다. 기존 *= / =* 외부 조인 연산자는 제거되었으므로 ANSI JOIN 구문을 사용해야 한다. APPLY(CROSS/OUTER APPLY)는 행 단위 상관 서브쿼리를 위한 추가 조인 형식이다.
MongoDB
// Closest equivalent: $lookup (left outer join)
db.customer.aggregate([
{ $lookup: {
from: "orders",
localField: "id",
foreignField: "customer_id",
as: "orders"
} }
])MongoDB에는 고전적인 JOIN이 없다. $lookup aggregation 단계가 다른 컬렉션에서 일치하는 문서를 배열로 가져온다(left outer join과 유사). INNER와 같은 결과를 얻으려면 이후 $match로 빈 배열을 걸러 내고 $unwind로 배열을 행으로 펼친다.
Redis
# Not applicable: Redis has no tables or JOINs.Redis는 관계형 조인을 제공하지 않는다. 데이터는 보통 비정규화하거나, 여러 키를 읽어 클라이언트 측에서 관계를 구성한다. 제한적인 조인 유사 쿼리에는 RediSearch(FT.AGGREGATE)를 사용할 수 있다. RedisGraph 모듈은 2023년에 지원이 종료되었다.
Elasticsearch
# Not applicable: there is no general JOIN in a distributed design.
# Limited options: nested, parent/child (join field),
# terms lookup. Data is usually denormalized at indexing time.분산 아키텍처 때문에 Elasticsearch는 임의의 테이블 간 JOIN을 제공하지 않는다. 제한적인 관계에는 단일 인덱스 안의 'nested' 필드 타입과 같은 샤드 위의 'join'(parent/child) 필드 타입이 있다. 가장 일반적인 해결책은 색인 시점에 데이터를 비정규화하는 것이다.