Se vuoi ottenere qualcosa di significativo dai dati , quasi sempre dovrai unirti a più tavoli. In questo articolo, mostreremo come farlo utilizzando diversi tipi di join. Per ottenere ciò, combineremo INNER JOIN e LEFT JOIN. Quindi, iniziamo.
Il modello
Nellimmagine sotto puoi vedere il modello esistente. Consiste di 6 tabelle e labbiamo già, più o meno, descritto negli articoli precedenti.
Tuttavia, anche senza descrivere, se il database è modellato e presentato in modo corretto (scegliendo i nomi con saggezza, usando la convenzione di denominazione, seguendo le stesse regole in tutto il modello, le linee / relazioni nello schema non si sovrappongono più del necessario), dovresti essere in grado per concludere dove puoi trovare i dati di cui hai bisogno. Questo è fondamentale perché prima di unire più tabelle, devi prima identificare queste tabelle.
Parleremo della convenzione di denominazione e dei consigli su come pensare quando scrivi query SQL, più avanti in questo serie. Finora, viviamo con il fatto che questo modello è piuttosto semplice e possiamo farlo abbastanza facilmente.
Cosa sappiamo finora?
In questa serie, abbiamo coperto:
- Nozioni di base relative allistruzione SQL SELECT e
- Confronto INNER JOIN e LEFT JOIN
Useremo la conoscenza da entrambi questi articoli e combinali per scrivere istruzioni SELECT più complesse che uniranno più tabelle.
Unisci più tabelle usando INNER JOIN
Il primo esempio che analizzeremo è come recuperare dati da più tabelle utilizzando solo INNER JOIN. Per ogni esempio, andremo con la definizione del problema che dobbiamo risolvere e la query che fa il lavoro. Quindi, iniziamo con il primo problema.
# 1 Dobbiamo elencare tutte le chiamate con lora di inizio e lora di fine. Per ogni chiamata, vogliamo visualizzare qual è stato il risultato e anche il nome e il cognome del dipendente che ha effettuato quella chiamata. Ordineremo le nostre chiamate in base allora di inizio crescente.
Prima di scrivere la query, identificheremo le tabelle che dobbiamo utilizzare. Per fare ciò, dobbiamo determinare quali tabelle contengono i dati di cui abbiamo bisogno e includerli. Inoltre, dovremmo includere tutte le tabelle lungo il percorso tra queste tabelle – tabelle che non contengono i dati necessari ma servono come relazione tra le tabelle che lo fanno (questo non è il caso qui).
La query che fa il lavoro è fornita di seguito:
Il risultato della query è fornito di seguito:
Ci sono alcune cose che vorrei sottolineare qui:
- Le tabelle che abbiamo unito sono qui perché i dati abbiamo bisogno che si trovi in queste 3 tabelle
- Ogni volta che cito un attributo da qualsiasi tabella, utilizzo il formato nome_tabella.nome_attributo (ad es. Employee.first_name). Anche se non è necessario, è una buona pratica, perché a volte 2 o più tabelle nella stessa query potrebbero utilizzare gli stessi nomi di attributi e ciò porterebbe a un errore
- Abbiamo usato INNER JOIN 2 volte in ordine per unire 3 tavoli. Ciò comporterà la restituzione di sole righe con coppie in unaltra tabella
- Quando utilizzi solo INNER JOIN per unire più tabelle, lordine di queste tabelle nei join non è importante. Lunica cosa importante è che tu utilizzi le condizioni di join appropriate dopo “ON” (join utilizzando chiavi esterne)
Poiché tutte le chiamate avevano dipendenti e risultati della chiamata correlati, avremmo lo stesso risultato se abbiamo usato LEFT JOIN invece di INNER JOIN.
Unisci più tabelle usando LEFT JOIN
Scrivere query che usano LEFT JOINs non differisce molto rispetto alla scrittura di query usando INNER JOINs. Il risultato sarebbe, ovviamente, diverso (almeno nei casi in cui alcuni record non hanno una coppia in altre tabelle).
Questo è il problema che vogliamo risolvere.
# 2 Elenca tutte le contee e i clienti relativi a questi paesi. Per ogni paese mostra il suo nome in inglese, il nome della città in cui si trova il cliente e il nome di quel cliente. Restituisci anche i paesi senza città correlate e clienti.
Le tabelle contenenti i dati di cui abbiamo bisogno sono nella figura seguente:
Innanzitutto, controllare rapidamente qual è il cont ent di queste 3 tabelle.
Possiamo notare due cose importanti:
- Sebbene ogni città abbia un Paese correlato, non tutti i Paesi hanno città correlate (la Spagna & Russia non ne ha)
- Lo stesso vale per i clienti.Ogni cliente ha il valore city_id definito, ma vengono utilizzate solo 3 città (Berlino, Zagabria & New York)
Scriviamo prima il query utilizzando INNER JOIN:
Il risultato della query è mostrato nella figura seguente:
Abbiamo 7 contee e 6 città nel nostro database, ma la nostra query restituisce solo 4 righe. Questo è il risultato del fatto che abbiamo solo 4 clienti nel nostro database. Ognuno di questi 4 è legato alla sua città e la città è legata alla campagna. Quindi, INNER JOIN ha eliminato tutti questi paesi e città senza clienti. Ma come includerli anche nel risultato?
Per farlo, useremo LEFT JOIN. Sostituiremo semplicemente “INTERNO” con “SINISTRA”, quindi la nostra query è la seguente:
Il risultato è mostrato nellimmagine seguente:
Puoi facilmente notare che ora abbiamo tutti i Paesi, anche quelli senza città correlata (Russia & Spagna), nonché tutti città, anche quelle senza clienti (Varsavia, Belgrado & Los Angeles). Le restanti 4 righe sono le stesse della query che utilizza INNER JOIN.
LEFT JOIN – Lordine delle tabelle è importante
Sebbene lordine dei JOIN in INNER JOIN non sia importante, lo stesso non sta per LEFT JOIN. Quando usiamo LEFT JOIN per unire più tabelle, è importante ricordare che questo join includerà tutte le righe della tabella sul lato LEFT del JOIN. Riorganizziamo la query precedente:
In un primo momento, potresti facilmente dire che questa query e quella precedente sono la stessa cosa (questo è vero quando si utilizza INNER JOIN). Abbiamo utilizzato le stesse tabelle, LEFT JOIN e le stesse condizioni di join. Diamo prima unocchiata alloutput:
Allora, cosa è successo qui? Perché abbiamo 4 righe (le stesse 4 che avevamo quando abbiamo utilizzato INNER JOIN)?
La risposta è semplice ed è correlata al funzionamento di LEFT JOIN. Prende la prima tabella (cliente) e unisce tutte le sue righe (4 di esse) alla tabella successiva (città). Il risultato è di 4 righe perché il cliente potrebbe appartenere a una sola città. Quindi uniamo queste 4 righe alla tabella successiva (paese) e di nuovo abbiamo 4 righe perché la città potrebbe appartenere a un solo paese.
Il motivo per cui non dovremmo unire queste 3 tabelle in questo modo è dato dal testo dellesempio # 2. La query è scritta in modo tale da restituire 4 righe sarebbe la risposta a quanto segue: Restituisce i nomi di tutti i clienti, nonché le città e i paesi in cui si trovano. Restituisce anche i clienti senza città e paesi correlati.
- Nota: quando utilizzi LEFT JOIN, lordine delle tabelle in tale istruzione è importante e la query restituirà un risultato diverso se modifichi questo ordine. Lordine in realtà dipende da ciò che desideri restituire come risultato.
Unisciti a più tabelle utilizzando entrambi – INNER JOIN & LEFT JOIN
Anche questo è possibile. Andiamo di nuovo con un esempio.
# 3 Restituisce lelenco di tutti i paesi e le città che hanno una coppia (escludi i paesi a cui non fa riferimento alcuna città). Per tali coppie restituire tutti i clienti. Restituisci coppie pari che non hanno un singolo cliente.
La query che fa il lavoro è:
Il risultato della query è dato nella figura seguente:
Puoi facilmente notare che non abbiamo Paesi senza città correlata (erano la Spagna & Russia). LINNER JOIN ha eliminato queste righe. Tuttavia, abbiamo città senza clienti (Belgrado, Los Angeles & Varsavia). Questo è il risultato del fatto che abbiamo utilizzato LEFT JOIN tra le tabelle city e customer.
Conclusione
Quando devi unire più tabelle, hai INNER & LEFT JOIN a tua disposizione (RIGHT JOIN è usato raramente e può essere facilmente sostituito da LEFT JOIN). Quale join utilizzerai dipende direttamente dallattività che devi risolvere e avrai la sensazione lungo la strada. Nei prossimi articoli, discuteremo di come pensare e organizzarti quando hai bisogno di scrivere query più complesse.
Sommario
Impara SQL: CREATE DATABASE & CREATE TABLE Operazioni
Impara SQL: INSERT INTO TABLE
Impara SQL: chiave primaria
Impara SQL: chiave esterna
Impara SQL: SELECT istruzione
Impara SQL: INNER JOIN vs LEFT JOIN
Impara SQL: Script SQL
Impara SQL: Tipi di relazioni
Impara SQL: unisci più tabelle
Impara SQL: funzioni aggregate
Impara SQL: come scrivere una SELECT complessa Query
Impara SQL: il database INFORMATION_SCHEMA
Impara SQL: tipi di dati SQL
Impara SQL: Teoria degli insiemi
Apprendimento di SQL: funzioni definite dallutente
Apprendimento di SQL: procedure memorizzate definite dallutente
Apprendimento di SQL: viste SQL
Impara SQL: trigger SQL
Impara SQL: pratica query SQL
Impara SQL: SQL Esempi di query
Impara SQL: crea un rapporto manualmente utilizzando query SQL
Impara SQL: Funzioni di data e ora di SQL Server
Impara SQL: crea report di SQL Server utilizzando funzioni di data e ora
Impara SQL: tabelle pivot di SQL Server
Impara SQL: esportazione di SQL Server in Excel
Impara SQL: introduzione ai cicli di SQL Server
Impara SQL: cursori di SQL Server
Impara SQL: best practice SQL per leliminazione e laggiornamento dei dati
Impara SQL: convenzioni di denominazione
Impara SQL: processi relativi a SQL
Impara SQL: join non Equi in SQL Server
Impara SQL: SQL Injection
- Autore
- Post recenti
I suoi impegni passati e presenti variano dalla progettazione e codifica di database allinsegnamento, alla consulenza e alla scrittura di database. Inoltre, non dimenticare, BI, creazione di algoritmi, scacchi, filatelia, 2 cani, 2 gatti, 1 moglie, 1 bambino …
Lo trovi su LinkedIn
Visualizza tutti i post di Emil Drkusic
- Learn SQL: SQL Injection – 2 novembre 2020
- Learn SQL: Non-Equi Joins in SQL Server – 29 settembre 2020
- Learn SQL: Lavori relativi a SQL – 1 settembre 2020