Mysql
 sql >> Database >  >> RDS >> Mysql

In SQL, qual è la differenza tra JOIN e CROSS JOIN?

SQL ha i seguenti tipi di join, che provengono tutti direttamente dalla teoria degli insiemi:

  • Unione interna.
    From A inner join B è l'equivalente di A ∩ B, fornendo l'insieme degli elementi comuni a entrambi gli insiemi.

  • Unisci esterno sinistro.
    From A left outer join B è l'equivalente di (LA − B) ∪ (LA ∩ B). Ogni A apparirà almeno una volta; se ci sono più B corrispondenti, la A verrà ripetuta una volta per B corrispondente.

  • Unione esterna destra.
    From A right outer join B è l'equivalente di (LA ∩ B) ∪ (B − LA). È identico a un join sinistro con i tavoli di scambio. Ogni B apparirà almeno una volta; se ci sono più As corrispondenti, ogni B verrà ripetuto una volta per B corrispondente.

  • Join esterno completo.
    From A full outer join B è l'equivalente di (LA − B) ∪ (LA ∩ B) ∪ (B − LA). Ogni A e ogni B appariranno almeno una volta. Se una A corrisponde a più B, verrà ripetuta una volta per partita; se una B corrisponde a multipli In quanto verrà ripetuto una volta per partita.

  • Partecipa incrociata.
    From A cross join B is produce il prodotto cartesiano A × B. Ogni A verrà ripetuto una volta per ogni B. Se A ha 100 righe e B ha 100 righe, il set di risultati sarà composto da 10.000 righe.

Va notato che l'esecuzione teorica di un select query consiste nei seguenti passaggi eseguiti in questo ordine:

  1. Calcola il prodotto cartesiano completo dei set di sorgenti nel from clausola per adescare il set di risultati del candidato.

  2. Applica i criteri di unione nel from clausola e ridurre il set di risultati del candidato.

  3. Applica i criteri nella where clause per ridurre ulteriormente il set di risultati del candidato.

  4. suddividere il set di risultati candidati in gruppi in base ai criteri nel group by clausola.

  5. Rimuovi dal set di risultati candidato tutte le colonne diverse da quelle coinvolte nel group by clausola o coinvolti nella valutazione di una funzione aggregata.

  6. Calcola il valore di tali funzioni aggregate per ciascun gruppo nel set di risultati candidato.

  7. Comprimi ogni gruppo nel set di risultati candidato in un'unica riga composta dalle colonne di raggruppamento e dai valori calcolati per ciascuna funzione di aggregazione. Il set di risultati candidato ora consiste in una riga per ogni gruppo, con tutte le colonne diverse da group by le colonne oi valori di calcolo delle funzioni aggregate per il gruppo vengono eliminate.

  8. Applica i criteri nel having clausola per ridurre il set di risultati del candidato e produrre il set di risultati finale.

  9. Ordina il risultato finale impostato dai criteri in order by clausola ed emetterla.

Ci sono più passaggi, che hanno a che fare con cose come compute e compute by clausole, ma questo è sufficiente per avere la nozione teorica di come funziona.

Va anche notato che nient'altro che l'implementazione più ingenua valuterebbe effettivamente una select istruzione in questo modo, ma i risultati prodotti devono essere gli stessi come se i passaggi precedenti fossero stati eseguiti per intero.