Per unire più tabelle, dato che ne abbiamo solo ‘oggetti’, ne serve una seconda. Eccola: la chiameremo ‘fornitori’.
CREATE TABLE fornitori (id integer PRIMARY KEY AUTO_INCREMENT, marca varchar(50), distributore varchar(2), provenienza varchar(50), percentuale DECIMAL(5,2)); INSERT INTO fornitori (marca, distributore, provenienza, percentuale) VALUES ('DJI', 'sì', 'Olanda', 30.32); INSERT INTO fornitori (marca, distributore, provenienza, percentuale) VALUES ('Oculus', 'sì', 'Gran Bretagna', 25.00); INSERT INTO fornitori (marca, distributore, provenienza, percentuale) VALUES ('Google', 'no', 'USA', 35.10); INSERT INTO fornitori (marca, distributore, provenienza, percentuale) VALUES ('Ultimaker', 'no', 'Olanda', 38.00); INSERT INTO fornitori (marca, distributore, provenienza, percentuale) VALUES ('Shining3D', 'no', 'Cina', 30.00); INSERT INTO fornitori (marca, distributore, provenienza, percentuale) VALUES ('Trotec', 'no', 'Austria', 32.08); INSERT INTO fornitori (marca, distributore, provenienza, percentuale) VALUES ('Apple', 'sì', 'Irlanda', 20.00); INSERT INTO fornitori (marca, distributore, provenienza, percentuale) VALUES ('Specialized', 'no', 'United States', 33.33); SELECT * FROM fornitori;
Osserva che per sapere se acquistiamo da un distributore o direttamente dal produttore abbiamo usato una variabile di tipo testo, distributore, che contiene un sì o un no. In SQL esiste una variabile a due stati, detta BIT, ma questa non sempre viene correttamente interpretata dai sistemi più semplici. Ecco perché in questo caso abbiampreferito usare un’altra variabile testo.
Osserva anche che gli Stati Uniti sono indicati in due modi diversi, USA per Google e United States per Specialized. Si tratta di una delle cause più frequenti di cattivi risultati da database: quando scriverai software per i tuoi clienti dovrai spiegar loro che esistono buone pratiche per evitare questo ed altri errori.
Adesso abbiamo due tabelle, “oggetti” e “fornitori”. Possiamo combinare le informazioni in un’unica tabella, ad esempio in base al fornitore.
Per fare ciò si usa l’operatore JOIN.
SELECT oggetti.*, fornitori.* FROM oggetti INNER JOIN fornitori ON oggetti.marca = fornitori.marca;
La query restituisce un’unica tabella con tutte le righe delle due tabelle combinate.
In questo esempio, l’operatore JOIN viene utilizzato per combinare le righe delle tabelle “oggetti” e “fornitori” in base all’ID del fornitore. La clausola “ON” specifica la condizione di join, ovvero che il valore nella colonna “fornitore_id” della tabella “oggetti” deve corrispondere all’ID del fornitore nella colonna “id” della tabella “fornitori”.
La query restituisce tutte le colonne di entrambe le tabelle per le righe che soddisfano la condizione di JOIN. Si noti che, se ci sono righe nella tabella “oggetti” che non hanno un corrispondente nella tabella “fornitori”, queste righe non saranno incluse nella query risultante.