Types de 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;Un JOIN combine deux tables selon la condition donnée. INNER ne renvoie que les correspondances ; LEFT/RIGHT renvoient toutes les lignes d'un côté (NULL en l'absence de correspondance) ; FULL renvoie les lignes des deux côtés ; CROSS renvoie toutes les combinaisons. Outre les JOIN ANSI standard, Oracle prend aussi en charge l'ancienne syntaxe de jointure externe (+).
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 prend entièrement en charge tous les types de JOIN standard (INNER, LEFT/RIGHT/FULL OUTER, CROSS). USING(my_column) est un raccourci pour les colonnes de même nom, tandis que NATURAL JOIN joint automatiquement sur toutes les colonnes de même nom (à utiliser avec prudence).
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 prennent en charge INNER, LEFT, RIGHT et CROSS JOIN mais n'offrent pas directement FULL OUTER JOIN ; on l'émule en combinant les résultats LEFT et RIGHT avec UNION. L'ancienne jointure par virgule produit un produit cartésien et doit être restreinte avec 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 prend en charge tous les types de JOIN standard. Les anciens opérateurs de jointure externe *= / =* ont été supprimés ; la syntaxe JOIN ANSI doit être utilisée. APPLY (CROSS/OUTER APPLY) est une forme de jointure supplémentaire pour les sous-requêtes corrélées ligne par ligne.
MongoDB
// Closest equivalent: $lookup (left outer join)
db.customer.aggregate([
{ $lookup: {
from: "orders",
localField: "id",
foreignField: "customer_id",
as: "orders"
} }
])MongoDB n'a pas de JOIN classique ; l'étape d'agrégation $lookup récupère sous forme de tableau les documents correspondants d'une autre collection (semblable à une left outer join). Pour un résultat de type INNER, filtrez ensuite les tableaux vides avec $match et développez le tableau en lignes avec $unwind.
Redis
# Not applicable: Redis has no tables or JOINs.Redis n'offre pas de jointures relationnelles ; les données sont généralement dénormalisées, ou les relations sont reconstituées côté client en lisant plusieurs clés. RediSearch (FT.AGGREGATE) peut servir pour des requêtes limitées de type jointure ; la prise en charge du module RedisGraph a pris fin en 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.En raison de son architecture distribuée, Elasticsearch n'offre pas de JOIN arbitraires entre tables. Pour des relations limitées, il existe le type de champ 'nested' au sein d'un même index et le type de champ 'join' (parent/child) sur le même shard. La solution la plus courante consiste à dénormaliser les données à l'indexation.