2014-10-03 9 views
6

Sono nuovo di SQL e sto avendo problemi a capire perché c'è una parola chiave JOIN in una frase se uso la notazione a punti per selezionare lo tables.columns che voglio. È importante quale tavolo scelgo tra i due? Non ho visto alcuna spiegazione per questo nella definizione di w3schools su quale tabella è la tabella FROM. Nell'esempio seguente, come faccio a sapere quale tabella scegliere per lo FROM? Poiché in sostanza ho già selezionato quale table.column selezionare, può essere o?Spiega quale tabella scegliere "FROM" in una dichiarazione JOIN

Ad esempio:

SELECT Customers.CustomerName, Orders.OrderID 
FROM Customers 
INNER JOIN Orders 
ON Customers.CustomerID=Orders.CustomerID 
ORDER BY Customers.CustomerName; 
+2

Sono entrambi il da tavoli ..., si può dire dagli ordini e unisciti clienti e la query restituirà lo stesso risultati se si tratta di un join interno. Nel join sinistro, la tabella "from" è la tabella sinistra. Questo mi ha confuso quando ho iniziato a usare sql quindi nota questo, un join sinistro è la stessa cosa di un join esterno sinistro, l'unica differenza è la sintassi – CSharper

+0

Sì. Può essere o. Nel tuo esempio, i due nomi di tabella potrebbero essere scambiati e le righe restituite sarebbero uguali. (Dove la collocazione dei nomi delle tabelle è importante con un'operazione di join "esterna", vale a dire "un LEFT JOIN b" equivale a "b RIGHT JOIN a", ma è diverso da "a RIGHT JOIN b". – spencer7593

+0

As Per quanto riguarda la definizione della tabella 'FROM': ciò che stai selezionando" from "è il risultato dell'operazione di join, non di una tabella o dell'altro. Ciò che l'SQL sta specificando è l'operazione" join "su due tabelle" " I clienti UNISCONO gli ordini ON ... '". La query sta selezionando "da" il risultato dell'operazione di join (l'ordine delle espressioni nel confronto di uguaglianza non ha importanza. "A.col = b.col' è equivale a specificare 'b.col = a.col'; una proprietà dell'operatore di confronto di uguaglianza.) È buona pratica qualificare * tutti * i riferimenti di colonna nella query (come mostrato nell'esempio.) – spencer7593

risposta

6

L'ordine non è rilevante in un INNER JOIN.

Tuttavia, è importante in LEFT JOIN e RIGHT JOIN. In un LEFT JOIN, la tabella nella clausola FROM è la tabella primaria; il risultato conterrà ogni riga selezionata da questa tabella, mentre le righe denominate nella tabella LEFT JOIN possono essere mancanti (queste colonne saranno NULL nel risultato). RIGHT JOIN è simile ma il contrario: le righe possono mancare nella tabella denominata in FROM.

Ad esempio, se si modifica la query per utilizzare LEFT JOIN, verranno visualizzati i clienti senza ordini. Ma se hai scambiato l'ordine dei tavoli e hai utilizzato uno LEFT JOIN, non vedresti questi clienti. Vedresti ordini senza cliente (anche se probabilmente tali file non dovrebbero esistere).

1

Per un inner join non importa quale tabella è nella clausola from e che è nella clausola join. Per outer join s ovviamente è importante, poiché la tabella nello outer join può contenere i record "mancanti".

4

L'istruzione from si riferisce al join non alla tabella. Il join della tabella creerà un set dal quale dovrai selezionare le colonne.

+1

+1. query sta selezionando "from" è il set di risultati specificato dall'operazione di join, non una tabella o l'altra. – spencer7593

1

Non importa per i join interni: l'ottimizzatore calcolerà la sequenza corretta di lettura delle tabelle, indipendentemente dalla scelta per l'ordine.

Per i giunti esterni direzionali, è importante, poiché non sono simmetrici. Si sceglie la tabella in cui si desidera mantenere tutte le righe per la prima tabella FROM in un join esterno sinistro; per il giusto outer join è il contrario.

Per i giunti esterni completi, non importa più, poiché le tabelle nelle giunture esterne complete vengono utilizzate simmetricamente l'una con l'altra.

Nelle situazioni in cui l'ordine non importa, è necessario scegliere l'ordine per essere "naturale" per il lettore della propria istruzione SQL, qualunque cosa ciò significhi per il proprio modello. Le query SQL diventano molto difficili da leggere, quindi l'ordinamento corretto delle tabelle è importante per i lettori umani delle query.

0

Bene nel vostro attuale esempio, l'operatore from può essere applicato su entrambe le tabelle.

SELECT Customers.CustomerName, Orders.OrderID 
FROM Customers,Orders 
WHERE Customers.CustomerID=Orders.CustomerID 
ORDER BY Customers.CustomerName; 

-> Lavoreranno come il tuo codice di

La virgola si unirà le due tabelle.

Da solo indica la tabella da cui si recuperano i dati.

Nel tuo esempio, hai unito le due tabelle usando una sintassi diversa. potrebbe anche essere:

SELECT Customers.CustomerName, Orders.OrderID 
FROM Orders 
INNER JOIN Customers 
ON Customers.CustomerID=Orders.CustomerID 
ORDER BY Customers.CustomerName; 

tutto il codice scritto genererà stessi risultati

+6

Good examp le mie, ma ti consiglio vivamente di non scrivere query come fai nel primo esempio – CSharper

+0

potresti spiegare perché? –

+1

È una sintassi sciatta ed è più difficile eseguire il debug/potenziamento e tanto meno leggere. Se ti unissi a 4 tavoli diventerebbe troppo veloce. Date un'occhiata a questo post che ho appena trovato http://stackoverflow.com/questions/11251751/which-join-syntax-is-better – CSharper