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;

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.