inner - mysql left join syntax



INNER JOIN ON vs WHERE clause (7)

Altri hanno sottolineato che INNER JOIN aiuta la leggibilità umana, e questa è una priorità assoluta; Sono d'accordo. Lasciatemi provare a spiegare perché la sintassi del join è più leggibile.

Una query SELECT di base è questa:

SELECT stuff
FROM tables
WHERE conditions

La clausola SELECT ci dice cosa stiamo tornando; la clausola FROM ci dice da dove veniamo, e la clausola WHERE ci dice quali sono quelli che stiamo ricevendo.

JOIN è una dichiarazione sui tavoli, su come sono legati insieme (concettualmente, in realtà, in una singola tabella). Qualsiasi elemento di query che controlla le tabelle, da cui ricaviamo elementi, appartiene semanticamente alla clausola FROM (e, naturalmente, è qui che vanno gli elementi JOIN). Mettendo gli elementi di congiunzione nella clausola WHERE si confonde il che e il dove-da ; questo è il motivo per cui la sintassi JOIN è preferita.

Per semplicità, si supponga che tutti i campi rilevanti NOT NULL siano NOT NULL .

Tu puoi fare:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1, table2
WHERE
    table1.foreignkey = table2.primarykey
    AND (some other conditions)

O altro:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1 INNER JOIN table2
    ON table1.foreignkey = table2.primarykey
WHERE
    (some other conditions)

Questi due funzionano allo stesso modo in MySQL ?


Answer #1

Hanno un diverso significato leggibile dall'uomo.

Tuttavia, a seconda di Query Optimizer, possono avere lo stesso significato per la macchina.

Dovresti sempre codice per essere leggibile.

Vale a dire, se si tratta di una relazione incorporata, utilizzare l'unione esplicita. se si stanno confrontando su dati debolmente correlati, utilizzare la clausola where.


Answer #2

La sintassi ANSI implicita è più vecchia, meno ovvia e non consigliata.

Inoltre, l'algebra relazionale consente l'intercambiabilità dei predicati nella clausola WHERE e INNER JOIN , quindi anche le query INTERNE INNER JOIN con le clausole WHERE possono avere i predicati riorganizzati dall'ottimizzatore.

Vi consiglio di scrivere le domande nel modo più leggibile possibile.

A volte ciò include rendere INNER JOIN relativamente "incompleto" e inserire alcuni dei criteri nel WHERE semplicemente per rendere gli elenchi dei criteri di filtro più facilmente mantenibili.

Ad esempio, invece di:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
    AND c.State = 'NY'
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
    AND a.Status = 1

Scrivi:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
    AND a.Status = 1

Ma dipende, ovviamente.


Answer #3

La sintassi di join ANSI è decisamente più portabile.

Sto passando un aggiornamento di Microsoft SQL Server e vorrei anche ricordare che la sintassi = * e * = per i join esterni in SQL Server non è supportata (senza modalità di compatibilità) per il server SQL 2005 e versioni successive.


Answer #4

So che stai parlando di MySQL, ma in ogni caso: in Oracle 9 i join espliciti e i join impliciti genererebbero diversi piani di esecuzione. AFAIK che è stato risolto in Oracle 10+: non c'è più alcuna differenza.


Answer #5

Sottolineerò anche che l'uso della sintassi più vecchia è più soggetto a errori. Se si utilizzano join interni senza una clausola ON, si verificherà un errore di sintassi. Se si utilizza la sintassi più vecchia e si dimentica una delle condizioni di join nella clausola where, si otterrà un cross join. Gli sviluppatori spesso risolvono questo problema aggiungendo la parola chiave distinta (piuttosto che correggendo il join perché ancora non si rendono conto che il join stesso è interrotto), che potrebbe sembrare risolvere il problema, ma rallenterà considerevolmente la query.

Inoltre per la manutenzione se si ha un cross join nella vecchia sintassi, come farà il manutentore a sapere se si intende averne uno (ci sono situazioni in cui sono necessari cross join) o se è stato un incidente che dovrebbe essere risolto?

Permettimi di indicarti questa domanda per capire perché la sintassi implicita è cattiva se usi i join a sinistra. Sybase * = per Ansi Standard con 2 differenti tabelle esterne per lo stesso tavolo interno

In più (sfogo personale qui), lo standard che utilizza i join espliciti ha più di 20 anni, il che significa che la sintassi implicita della join è stata superata per quei 20 anni. Scriveresti il ​​codice dell'applicazione usando la sintassi che è stata superata da 20 anni? Perché vuoi scrivere il codice del database che è?


Answer #6

INNER JOIN è la sintassi ANSI che dovresti usare.

Generalmente è considerato più leggibile, specialmente quando si uniscono molti tavoli.

Può anche essere facilmente sostituito con un OUTER JOIN necessità.

La sintassi WHERE è più orientata al modello relazionale.

Un risultato di due tabelle JOIN ed è un prodotto cartesiano delle tabelle a cui viene applicato un filtro che seleziona solo le righe corrispondenti alle colonne di unione.

È più facile vederlo con la sintassi WHERE .

Per quanto riguarda il tuo esempio, in MySQL (e in SQL in generale) queste due query sono sinonimi.

Si noti inoltre che MySQL ha anche una clausola STRAIGHT_JOIN .

Usando questa clausola, puoi controllare l'ordine JOIN : quale tabella è scansionata nel ciclo esterno e quale è nel ciclo interno.

Non puoi controllare questo in MySQL usando la sintassi WHERE .





inner-join