SQLShack (Italiano)

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
Emil è un professionista del database con oltre 10 anni di esperienza in tutto ciò che riguarda i database . Negli anni ha lavorato nel settore IT e finanziario e ora lavora come libero professionista.
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

Ultimi post di Emil Drkusic (vedi tutti)
  • 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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *