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 は指定した条件に従って 2 つのテーブルを結合する。INNER は一致するもののみを、LEFT/RIGHT は一方の全行を(一致しない箇所は NULL)、FULL は両方の行を、CROSS はすべての組み合わせを返す。標準の ANSI JOIN に加えて、Oracle は旧来の (+) 外部結合構文もサポートする。
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 集計ステージが別のコレクションから一致するドキュメントを配列として取得する(左外部結合に類似)。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'(親/子)フィールド型がある。最も一般的な解決策は、インデックス作成時にデータを非正規化すること。