JOIN
Description
MariaDB supporta le seguenti sintassi di JOIN
per la parte riferimenti_tabelle
della sintassi di SELECT
e delle DELETE
e UPDATE
multi-tabella:
riferimenti_tabelle: riferimento_tabella [, riferimento_tabella] ... riferimento_tabella: fattore_tabella | join_tabelle fattore_tabella: nome_tabella [[AS] alias] [suggerimenti_indici] | tabella_subquery [AS] alias | ( riferimenti_tabelle ) | { ON riferimento_tabella LEFT OUTER JOIN riferimento_tabella ON espre_condizionale } join_tabelle: riferimento_tabella [INNER | CROSS] JOIN fattore_tabella [condizione_join] | riferimento_tabella STRAIGHT_JOIN fattore_tabella | riferimento_tabella STRAIGHT_JOIN fattore_tabella ON espr_condizionale | riferimento_tabella {LEFT|RIGHT} [OUTER] JOIN riferimento_tabella condizione_join | riferimento_tabella NATURAL [{LEFT|RIGHT} [OUTER]] JOIN fattore_tabella condizione_join: ON espr_condizionale | USING (elenco_colonne) suggerimenti_indici: suggerimento_indice [, suggerimento_indice] ... suggerimento_indice: USE {INDEX|KEY} [{FOR {JOIN|ORDER BY|GROUP BY}] ([elenco_indici]) | IGNORE {INDEX|KEY} [{FOR {JOIN|ORDER BY|GROUP BY}] (elenco_indici) | FORCE {INDEX|KEY} [{FOR {JOIN|ORDER BY|GROUP BY}] (elenco_indici) elenco_indici: nome_indice [, nome_indice] ...
Il riferimento_tabella si chiama anche espressione join.
La sintassi di fattore_tabella
è stata estesa, rispetto allo standard SQL. Quest'ultima accetta solo riferimento_tabella
, non un intero elenco fra parentesi.
E' una estensione conservativa, se si considera ogni virgola nell'elenco di riferimento_tabella come l'equivalente di una INNER JOIN. Per esempio:
SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
equivale a:
SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
In MariaDB, CROSS JOIN
è sintatticamente equivalente a
INNER JOIN
(ognuna delle due può sostituire l'altra). Nell'SQL standard, non sono equivalenti. INNER JOIN
si usa con una clausola
ON
, CROSS JOIN
si usa senza.
In generale, le parentesi si possono ignorare nelle espressioni join composte solo da operazioni inner join. MariaDB supporta anche le join annidate (si veda http://dev.mysql.com/doc/refman/5.1/en/nested-join-optimization.html).
I suggerimenti degli indici influenzano il modo in cui l'ottimizzatore di MariaDB usa le chiavi. Per ulteriori informazioni si veda: http://dev.mysql.com/doc/refman/5.1/en/index-hints.html.
Esempi
SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;