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 返回所有组合。除了标准 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;需通过 UNION 合并 LEFT 和 RIGHT 结果来模拟。旧的逗号式连接会产生笛卡尔积,必须用 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'(parent/child)字段类型。最常见的方案是在索引时对数据进行反规范化。