CROSS JOIN = (INNER) JOIN = virgola (",")
TL; DR L'unica differenza tra SQL CROSS JOIN, (INNER) JOIN e virgola (",") (oltre alla virgola che ha una precedenza inferiore per l'ordine di valutazione) è che (INNER) JOIN ha un ON mentre CROSS JOIN e la virgola no.
Re prodotti intermedi
Tutti e tre producono un prodotto "cartesiano" relazionale intermedio concettuale, detto anche cross join, di tutte le possibili combinazioni di una riga di ogni tabella. È ON e / o WHERE che riduce il numero di righe. SQL Fiddle
Lo standard SQL definisce <comma> tramite prodotto (7.5 1.b.ii), <cross join> via <comma> (7.7 1.a) e JOIN ON <condizione di ricerca> via <comma> più DOVE (7.7 1.b ).
Come dice Wikipedia:
Cross join
CROSS JOIN restituisce il prodotto cartesiano delle righe dalle tabelle nel join. In altre parole, produrrà righe che combinano ciascuna riga della prima tabella con ogni riga della seconda tabella.
Join interno
[...] Il risultato del join può essere definito come il risultato della prima acquisizione del prodotto cartesiano (o cross join) di tutti i record nelle tabelle (combinando tutti i record nella tabella A con tutti i record nella tabella B) e quindi restituendo tutti i record che soddisfano il predicato di join.
La "notazione di join implicita" elenca semplicemente le tabelle per l'unione, nella clausola FROM dell'istruzione SELECT, usando le virgole per separarle. Quindi specifica un cross join
Re ESTERNO raggiunge e utilizza ON vs DOVE in loro vedere le condizioni in LEFT JOIN (OUTER JOIN) vs INNER JOIN .
Perché confrontare le colonne tra le tabelle?
Quando non ci sono righe duplicate:
Ogni tabella contiene le righe che formano una vera istruzione da un determinato modello di istruzioni per riempire gli spazi vuoti. (Fa una proposta vera da-- soddisfa - un certo predicato (caratteristico) .)
Una tabella di base contiene le righe che creano un'istruzione vera da alcuni modelli di istruzioni forniti da DBA:
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
Il prodotto intermedio di un join contiene le righe che rilasciano una dichiarazione vera dall'AND dei modelli dei suoi operandi:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
*/
FROM Customers C CROSS JOIN Movies M
ON & DOVE vengono inserite le condizioni per fornire un ulteriore modello. Il valore è di nuovo le righe che soddisfano quel modello:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
AND C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
AND C.Age = 18
*/
FROM Customers C INNER JOIN Movies M
ON C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
WHERE C.Age = 18
In particolare, il confronto delle colonne per l'uguaglianza (SQL) tra le tabelle significa che le righe mantenute dal prodotto dalle parti del modello delle tabelle unite hanno lo stesso valore (non NULL) per quelle colonne. È solo una coincidenza che molte righe vengano in genere rimosse dai confronti di uguaglianza tra le tabelle: ciò che è necessario e sufficiente è caratterizzare le righe desiderate.
Scrivi SQL per il modello per le righe che desideri!
Per quanto riguarda il significato delle query (e le tabelle rispetto alle condizioni) vedere:
Come ottenere i dati corrispondenti da un'altra tabella SQL per due colonne diverse: Inner Join e / o Union?
Esiste una regola empirica per costruire query SQL da una descrizione leggibile dall'uomo?
Sovraccarico di "cross join"
Sfortunatamente il termine "cross join" viene utilizzato per:
- Il prodotto intermedio.
- CROSS JOIN.
- (INTERNO) UNISCITI con un ON o DOVE che non confronta le colonne di una tabella con le colonne di un'altra. (Dal momento che tende a restituire così tante righe di prodotto intermedie.)
Questi vari significati vengono confusi. (Ad esempio come in altre risposte e commenti qui.)
Utilizzo di CROSS JOIN vs (INNER) JOIN vs virgola
La convenzione comune è:
- Utilizzare CROSS JOIN quando e solo quando non si confrontano le colonne tra le tabelle. Questo per dimostrare che la mancanza di confronti era intenzionale.
- Utilizzare (INNER) UNISCITI con ON quando e solo quando si confrontano le colonne tra le tabelle. (Più probabilmente altre condizioni.)
- Non usare la virgola.
In genere anche le condizioni non su coppie di tabelle vengono mantenute per un WHERE. Tuttavia, potrebbe essere necessario inserirli in (n INNER) JOIN ON per ottenere le righe appropriate per l'argomento in un JOIN RIGHT, LEFT o FULL (OUTER).
Ri "Non usare la virgola" Il mix di virgola con JOIN esplicito può fuorviare perché la virgola ha una precedenza inferiore. Ma dato il ruolo del prodotto intermedio nel significato di CROSS JOIN, (INNER) JOIN e virgola, gli argomenti per la convenzione sopra di non usarlo affatto sono traballanti. Una CROSS JOIN o una virgola è proprio come una (INNER) JOIN che si trova su una VERA condizione. Un prodotto intermedio, ON e WHERE introducono tutti un AND nel predicato corrispondente. Comunque si può pensare ad INNER JOIN ON - diciamo, generare una riga di output solo quando si trova una coppia di righe di input che soddisfa la condizione ON - restituisce comunque le righe di cross join che soddisfano la condizione. L'unico motivo per cui ON era integrare la virgola in SQL era scrivere OUTERJoin. Naturalmente, un'espressione dovrebbe chiarirne il significato; ma ciò che è chiaro dipende dal significato delle cose.
Diagrammi di Re Venn Un diagramma di Venn con due cerchi che si intersecano può illustrare la differenza tra le righe di output per INNER, LEFT, RIGHT e FULL JOINs per lo stesso input. E quando ON è incondizionatamente VERO, il risultato INNER JOIN è lo stesso di CROSS JOIN. Inoltre può illustrare le righe di input e output per INTERSECT, UNION & EXCEPT. E quando entrambi gli input hanno le stesse colonne, il risultato INTERSECT è lo stesso di SQL NATURAL JOIN standard e il risultato EXCEPT è lo stesso di alcuni idiomi che coinvolgono LEFT & RIGHT JOIN. Ma non illustra come funziona (INNER) JOIN in generale. A prima vista sembra plausibile . Può identificare parti di di input e / o output percasi specialidi ON, PK (chiavi primarie), FK (chiavi esterne) e / o SELEZIONA. Tutto quello che devi fare per vedere questo è identificare quali sono esattamente gli elementi degli insiemi rappresentati dai cerchi . (Il che farraginoso presentazioni non fanno mai chiaro.) (Ricordate che in generale per unisce righe di output hanno intestazioni differenti da file di input . Tabelle e SQL sono sacchi non insiemi di righe con NULL .)
CROSS JOIN
comporterà tutte le possibili combinazioni delle tabelle. es. Table1 con 100 righe e Table2 con 100 righe genereranno 10000 record.