
GUIDE PER ASPIRANTI PROGRAMMATORI
Guida SQL in italiano
Imparerai la differenza tra database relazionali e non relazionali, la sintassi sql per eseguire query SQL complesse per estrarre informazioni preziose: istruzioni e clausule del linguaggio SQL non saranno più un mistero! Scoprirai SQL, NoSQL, mysql cos è, funzioni e operatori di SQL per filtrare e manipolare i dati nel tuo database. Preparati a dominare il mondo dei database con SQL!


Vuoi avviare una nuova carriera o fare un upgrade?
Trova il corso Digital & Tech più adatto a te nel nostro catalogo!
1
I database
1.1
Cos'è un database
Si sentono sempre di più termini quali big data, data lake, IoT, machine learning. La conoscenza delle competenze relative sarà il motore della gran parte dei lavori dei prossimi decenni. Alla base di tutto c’è il concetto di archivio, o base di dati, all’inglese database; ma che cos è un database?
Cos'è un database
Un database è una raccolta organizzata di informazioni, strutturata in modo tale da consentirne un'efficiente ricerca, recupero, aggiornamento e gestione. Esso funziona come un archivio digitale, dove i dati vengono memorizzati in tabelle, righe e colonne, per facilitarne l'accesso e l'analisi. I database sono fondamentali per molte applicazioni, come siti web, applicazioni mobili e sistemi di gestione aziendale, poiché permettono di archiviare e gestire enormi quantità di dati in modo ordinato e sicuro
1.2
Tipi di database
Prima di addentrarsi nel linguaggio SQL, è importante conoscere i vari tipi di database esistenti, poiché rappresentano la base sulla quale si costruiscono e gestiscono le applicazioni e i sistemi di dati. I database possono essere classificati in diverse categorie, tra cui:
Database relazionali: sono il tipo più comune di database e organizzano i dati in tabelle strutturate, che si interconnettono tramite relazioni basate su chiavi primarie e chiavi esterne. Questi database utilizzano il linguaggio SQL per eseguire query e manipolare i dati. Esempi di sistemi di gestione dei database relazionali (RDBMS) sono MySQL, PostgreSQL, Oracle e Microsoft SQL Server.
Database non relazionali: noti anche come database NoSQL, questi sistemi di gestione dei dati non utilizzano tabelle e relazioni per organizzare i dati, ma altre strutture più flessibili e scalabili. I database non relazionali si suddividono in diverse sottocategorie, come document-based (MongoDB), key-value (Redis), column-family (Cassandra) e graph-based (Neo4j). Questi database utilizzano linguaggi di query specifici per il loro sistema, che possono differire dal tradizionale SQL.
Database ad oggetti: questi database memorizzano e gestiscono i dati come oggetti, piuttosto che come tabelle e relazioni. Sono particolarmente adatti per applicazioni che richiedono un alto livello di astrazione e la capacità di gestire relazioni complesse tra oggetti. Esempi di database ad oggetti includono db4o e ObjectDB.
Database temporali: questi database tengono traccia delle modifiche ai dati nel tempo, consentendo agli utenti di eseguire query su dati storici o su intervalli temporali specifici. Sono spesso utilizzati in ambito finanziario, meteorologico e di analisi delle serie temporali. Esempi di database temporali includono TimescaleDB e InfluxDB.
Conoscere i diversi tipi di database è fondamentale per comprendere come funzionano e come interagire con essi tramite il linguaggio SQL o altri linguaggi di query. Questa conoscenza sarà utile per scegliere il sistema di gestione dei dati più adatto alle esigenze del tuo progetto e per imparare a utilizzare il linguaggio SQL in modo efficace.
In questa sede vedremo alcune informazioni su alcuni dei sistemi di memorizzazione logica dei dati: SQL per i database relazionali, NoSQL per i database non relazionali e blockchain, che non si riferisce direttamente a un tipo di database tradizionale come quelli relazionali o NoSQL. Tuttavia, può essere considerata una categoria particolare di database distribuiti e immutabili.
1.3
Linguaggio SQL: i database relazionali
Uno dei sistemi per organizzare i database è lo Structured Query Language, in breve in linguaggio SQL: come dice il nome (query vuol dire “interrogazione”) si tratta di un sistema per interrogare i database che, di fatto, definisce il database stesso. Oggi, SQL è il linguaggio di database più usato al mondo.
Storicamente, i database hanno una vita molto lunga che risale ai primi computer elettronici degli anni '60. Tuttavia, l'uso dei database è diventato sempre più diffuso con la crescita del mercato dei computer personali e l'espansione di Internet. Oggi, i database sono essenziali per la gestione dei dati in molte organizzazioni, dai piccoli negozi alle grandi imprese.
SQL, significato di Structured Query Language, è un linguaggio di programmazione standardizzato per gestire in particolare i database relazionali. SQL è stato sviluppato da IBM negli anni '70 e successivamente standardizzato dall'ANSI e dall'ISO per definire le tabelle di dati. Dal punto di vista strutturale, l’approccio SQL definisce i database relazionali, nei quali i dati sono organizzati in tabelle collegate da relazioni logiche, da cui il termine “relazionale”.
Esistono molte organizzazioni che producono database relazionale con SQL come, ad esempio, Oracle e IBM.
Inoltre, i database possono essere gestiti attraverso l'uso di software specializzati, chiamati Database Management System (DBMS). I DBMS forniscono una vasta gamma di funzionalità per la gestione dei dati come, ad esempio, la sicurezza, la ridondanza dei dati, la scalabilità e la ripristinabilità dei dati.
Vedrai, più avanti, quali sono i prodotti disponibili, sia gratuiti, sia a pagamento, per la gestione di dati con SQL.
1.4
NoSQL: i database non relazionali
Quello relazionale non è l’unico elemento. I dati all'interno di un database possono essere strutturati in tre modi fondamentali: relazionale, gerarchico o ad albero. Un termine contenitore per molti di questi approcci alla memorizzazione di dati è il NoSQL che -a seconda dei fornitori- può indicare sia la negazione diretta del relazionale, sia la più ampia accezione del “non solo relazionale”. Questi database memorizzano anche le classiche relazioni, ma lo fanno con approcci diversi da SQL.
Via via, si sono evidenziati quattro tipi principali di database NoSQL:
database documentali (memorizza i dati in testi di tipo JSON, BSON o XML)
database di valore chiave (ogni dato è memorizzato in una coppia chiave-valore: chiave di accesso e valore del dato)
database a colonna (mentre in SQL le tabelle sono basate su righe)
database a grafo
1.5
L’avvento della blockchain
Un altro tipo di sistema di memorizzazione dati in grande sviluppo è quello dei registri aperti o ledger. Si differenziano dai database per un accesso più semplice ed aperto ai dati da parte di singoli o organizzazioni che vogliano elaborarli.
La famiglia al momento di maggior successo è quella delle blockchain, resa famosa dalle criptovalute come Bitcoin o Ethereum. Non bisogna far confusione, però: la blockchain è l’archivio dei dati che poi vengono usati per applicazioni di altro genere, come ad esempio proprio quelle finanziarie. Ma la blockchain, con tutte le sue differenti alternative, è un registro replicato ad accesso distribuito per la memorizzazione di dati in maniera ottimale per alcune applicazioni.
2
Introduzione al linguaggio SQL
2.1
Linguaggio SQL cos'è
Come hai già letto, SQL è un linguaggio di programmazione utile per manipolare i dati all'interno di un database. Il database è organizzato sotto forma di numerose tabelle.
Queste tabelle vengono collocate su un server al quale si accede da remoto.
In questa guida faremo esempi le cui tabelle e il relativo codice di interrogazione vengono temporaneamente ospitati su un servizio online.
Alternativamente, entrambe le entità (tabelle ed interrogazioni) possono essere ospitate su un PC locale, anche installando un apposito server software.
Ma cos'è una tabella? Sì tratta di un oggetto che tutti noi conosciamo come una lista di nomi a ciascuno dei quali vengono associate delle specifiche.
Per esempio, una lista di oggetti tecnologici che probabilmente hai in casa è questa:
Smartphone
Computer
Drone
Visore 3D
Se aggiungi qualche specifica a ciascun oggetto, generi una tabella:
Smartphone, Oppo, Mod. 5, 2020
Computer, Asus, SonicMaster, 2018
Drone, DJI, Phantom 4, 2019
Visore, Meta, Quest 2, 2022
Come ogni tabella, anche questa è suddivisa in righe (4) e colonne (4).
Sulle tabelle puoi svolgere diverse operazioni: quelle fondamentali riguardano la creazione, modifica ed eliminazione. Ovviamente, anche sui singoli elementi puoi svolgere svariate operazioni: generalmente, queste sono articolate in una lista di istruzioni, ciascuna con le sue specificità o clausole.
Lavorare con SQL, quindi, vuol dire agire sui dati e sulla struttura (l’insieme delle tabelle).
Ma vediamo, nel capitolo a seguire, alcune istruzioni del linguaggio SQL.
2.2
Linguaggio SQL: istruzioni
Ecco alcuni esempi di istruzioni (o comandi) in SQL.
Per le tabelle si usano tre istruzioni fondamentali:
CREATE: crea una nuova tabella, un nuovo database o altri oggetti del database;
ALTER: modifica la struttura di una tabella o di altri oggetti del database;
DROP: elimina una tabella, un database o altri oggetti del database.
Per operare sui dati si parte da inserimento, modifica e cancellazione:
INSERT: inserisce nuovi dati in una tabella;
UPDATE: modifica i dati esistenti in una o più tabelle;
DELETE: elimina i dati da una o più tabelle;
Ricerca e presentazione dei dati, in particolare, vengono affidate alla SELECT:
SELECT: recupera i dati da una o più tabelle;
Clausole nel linguaggio SQL
Le clausole nel linguaggio SQL (Structured Query Language) sono parole chiave o costrutti che definiscono specifiche funzioni all'interno di una query o di un comando SQL. Le clausole consentono di organizzare e manipolare i dati presenti in un database relazionale, per esempio, filtrando, ordinando o raggruppando i risultati ottenuti. Ecco alcune delle clausole più comuni nel linguaggio SQL:;
SELECT
WHERE: specifica una condizione per il recupero dei dati;
ORDER BY: specifica l'ordinamento dei dati recuperati;
GROUP BY: raggruppa i dati in base a una o più colonne.
HAVING: specifica le condizioni per selezionare i gruppi di righe
INSERT INTO
VALUES: specifica i valori da inserire nelle colonne della nuova riga
UPDATE
SET: specifica i valori da aggiornare nelle colonne selezionate
WHERE: specifica le condizioni per selezionare le righe da aggiornare
JOIN
ON: specifica le condizioni di join tra due o più tabelle
CREATE TABLE
COLUMN: specifica le colonne e i relativi tipi di dati
PRIMARY KEY: specifica la colonna o le colonne che costituiscono la chiave primaria della tabella
FOREIGN KEY: specifica la colonna o le colonne che costituiscono la chiave esterna della tabella, collegata ad una chiave primaria in un'altra tabella
ALTER TABLE:
ADD COLUMN: aggiunge una nuova colonna alla tabella
MODIFY COLUMN: modifica la definizione di una colonna esistente
DROP COLUMN: elimina una colonna dalla tabella
Questi sono solo alcuni esempi di clausole SQL, ma ne esistono molte altre per manipolare i dati all'interno di un database.
2.3
Sintassi di base di SQL: creare, modificare e eliminare tabelle
Una lista di istruzioni e clausole non basta a facilitare l’apprendimento. Inizia a mettere davvero le mani in pasta nella programmazione in SQL, usando solo le istruzioni necessarie.
Tra poche righe potrai iniziare a scrivere i tuoi primi programmi SQL! Emozionato, eh?
Prima, però, è opportuno fare un minimo di teoria… porta pazienza, dura poco!
Abbiamo detto che SQL è un linguaggio di programmazione, per cui i tipi di dato elementari sono numeri e testi. Come in ogni linguaggio, questi tipi di dato vanno definiti prima di usarli: ad esempio, i numeri possono essere interi o decimali, e i testi possono essere variabili di una certa lunghezza massima: per un nome proprio di persona metterai una lunghezza massima - diciamo - di 10 caratteri, per la descrizione di un oggetto - sempre ipotizzando - 200 caratteri. Una variabile di testo di lunghezza 200 viene indicata con la dichiarazione:
nome VARCHAR(200)
Un numero intero con INT (per integer) e un numero decimale con DECIMAL(numero cifre parte intera, numero cifre parte decimale).
Queste sono definizioni teoriche. L’effettiva forma di scrittura del programma la vedrai a seconda del sistema di sviluppo che usi: potrai trovare INT in uno e integer in un altro, o regole diverse per la gestione delle maiuscole (VARCHAR, varchar o entrambe?).
Ma non preoccuparti: questo diventerà semplice ed automatico non appena metterai le mani su un sistema di sviluppo.
Torniamo al linguaggio SQL. Tutto inizia dalla “creazione” di una tabella.
SQL richiede l’uso della CREATE:
CREATE TABLE nome_tabella (
nome_colonna1 tipo_dato [opzioni],
nome_colonna2 tipo_dato [opzioni],
...,
nome_colonnaN tipo_dato [opzioni]
);
In questa sintassi, nome_tabella rappresenta il nome della tabella che si desidera creare, mentre nome_colonna1, nome_colonna2, ..., nome_colonnaN rappresentano i nomi delle colonne della tabella. tipo_dato rappresenta il tipo di dato che deve essere memorizzato nella colonna e opzioni sono opzionali e possono essere utilizzate per specificare eventuali vincoli di integrità referenziale o di tipo.
Ampliando l’esempio della tabella di prodotti tecnologici usata prima, puoi creare una tabella chiamata "prodotti" con le colonne "id", "nome" e "prezzo", usando la seguente sintassi:
CREATE TABLE prodotti (
id INT PRIMARY KEY,
nome VARCHAR(20),
prezzo DECIMAL(10,2)
);
Noterai subito che ti trovi davanti ad un nuovo oggetto: la PRIMARY KEY. Si tratta di una variabile che serve al sistema di gestione per mettere le varie tabelle in relazione tra di loro. E’ conveniente usarla come numero d’ordine delle righe della tabella.
In questo esempio, la colonna "id" è stata definita come chiave primaria della tabella con la clausola PRIMARY KEY.
Una volta creata la tabella, potrai modificarne la struttura attraverso la seguente sintassi:
ALTER TABLE nome_tabella
ADD [COLUMN] nome_colonna tipo_dato [opzioni],
ALTER [COLUMN] nome_colonna tipo_dato [opzioni],
DROP [COLUMN] nome_colonna;
In questa sintassi, ADD viene utilizzato per aggiungere una nuova colonna alla tabella, ALTER per modificare una colonna esistente e DROP per eliminare una colonna esistente. L'opzione COLUMN è opzionale.
Per esempio, per aggiungere una colonna "descrizione" alla tabella "prodotti" utilizzerai il seguente codice:
ALTER TABLE prodotti
ADD COLUMN descrizione VARCHAR(200);
Per eliminare la colonna "prezzo", puoi usare la seguente sintassi:
ALTER TABLE prodotti
DROP COLUMN prezzo;
Infine, per eliminare completamente la tabella devi affidarti al DROP (scarica):
DROP TABLE nome_tabella;
2.4
Linguaggio SQL: esempi di istruzioni con clausole
Adesso sai cosa sono le istruzioni (o comandi) in SQL, e sai anche cosa sono le clausole.
Ecco, ora, alcuni esempi concreti di istruzioni SQL con relative clausole, così da farti toccare con mano i meccanismi di SQL, per comprenderli al meglio.
SELECT * FROM prodotti WHERE prezzo > 50;
In questo esempio, l'istruzione SQL SELECT sceglie e stampa a schermo i dati dalla tabella "prodotti" seguendo, però, la clausola WHERE che filtra i dati, lasciando passare solo quelli con un prezzo superiore a 50.
Proviamo a fare un’ipotesi di aggiornamento selettivo dei dati.
UPDATE prodotti SET prezzo = prezzo * 0.9 WHERE categoria = 'Abbigliamento';
In questo esempio, UPDATE prende la tabella “prodotti” e aggiorna il valore della colonna "prezzo" quando (WHERE) trova i prodotti della categoria "Abbigliamento"
2.5
Linguaggio SQL: database e operazioni comuni sui dati
Quelli precedenti sono esempi validi, ma singoli, di istruzioni SQL che permettano di generare, compilare e gestire una tabella SQL. Avviciniamoci, ora, ad un esempio completo.
Prova a pensare ad una tabella SQL con i seguenti oggetti: drone, visore 3D, AR glasses, 3D printer, 3D scanner, laser cutter, smartwatch, e-bike. Queste saranno le righe dalla tabella:
Drone
Visore 3D
AR glasses
3d printer
3d scanner
Laser cutter
Smartwatch
E-bike
Per ciascuno di essi inserisci marca (variabile testo da max 10 caratteri), modello (10), descrizione (20 caratteri max), quantità (un numero intero da 2 a 9), collocazione (inventa tu una sigla con 3 caratteri maiuscoli, un punto, tre cifre), prezzo (in Euro: è un numero decimale).
Queste saranno le colonne.
Per esempio, la riga relativa al drone potrebbe avere queste caratteristiche:
'Drone', 'DJI', 'Mavic Air 2', 'Drone 4K', 5, 'OGG.001', 1200
Questo è il codice SQL relativo alla generazione della tabella, che chiameremo “oggetti”:
CREATE TABLE oggetti (
id INT PRIMARY KEY AUTO_INCREMENT,
oggetto VARCHAR(10),
marca VARCHAR(10),
modello VARCHAR(10),
descrizione VARCHAR(10),
quantita INT,
collocazione VARCHAR(8),
prezzo DECIMAL(8,2)
);
È tutto chiaro? Anche in questo caso, hai trovato una cosa nuova: la clausola AUTO_INCREMENT. Il suo uso è intuitivo: assegna ad ogni oggetto un numero d’ordine (numero intero) che incrementa automaticamente: il primo oggetto del quale inserisci i dati avrà il numero 1, il secondo 2 e così via.
Abbiamo lasciato prezzi interi, anche se nella specifica avremmo potuto metterli decimali. Un numero intero è, comunque, anche un numero decimale privo di cifre dopo la virgola.
Ricorda che nella notazione anglosassone, spesso usata nel software, la parte decimale non usa la virgola ma il punto. Per scrivere 3,19 potresti trovare 3.19.
Sempre all’americana, abbiamo evitato le lettere accentate (la à in quantità): anche su questo punto può capitare che il sistema non le riconosca e, quindi, onde evitare guai peggiori, ci censuriamo fin dall’inizio.
Infine, se sei stato attento, avrai notato anche che la lunghezza di “descrizione” è di soli 10 caratteri: dovendoli scrivere in prima persona, meglio tagliar corto!
Passiamo, ora, all’inserimento dei valori. Abbiamo compilato una serie a nostro gusto, ma se hai fatto l'esercizio precedente avrai i tuoi valori e potrai usarli. Nella lista trovi oggetti più noti, come lo smartwatch e il drone, e oggetti meno noti come quelli che si usano in un fablab, come stampante 3D (3D printer), scanner 3D ed anche tagliatrice al laser (laser cutter). Abbiamo preferito indicare strumenti di grande rilevanza per la moderna cultura digitale, dai quali dipendono preparazione e possibilità di lavoro per chi oggi si affaccia sul mercato.
NB. Noterai, a seguire, dei valori inseriti tra virgolette; fai molta attenzione alle virgolette, perché ne esistono vari tipi che nella programmazione informatica non sono intercambiabili. Nel linguaggio scritto si usa preferibilmente la virgoletta doppia, come hai visto nel testo di questa guida. Nella programmazione spesso questa viene accettata, ma più spesso viene preferita la virgoletta singola. Esiste anche una terza virgoletta, il backtick: si scrive ` (`) ed è come un accento grave. In questa guida non viene usato.
Ed ecco una possibile lista dei valori per questo esempio.
INSERT INTO oggetti (oggetto, marca, modello, descrizione, quantità, collocazione, prezzo)
VALUES
('Drone', 'DJI', 'Mavic Air 2', 'Drone 4K', 5, 'OGG.001', 1200),
('Visore 3D', 'Oculus', 'Quest 2', 'Visore VR', 3, 'OGG.002', 500),
('AR Glasses', 'Google', 'Glass Enterprise Edition 2', 'Occhiali AR', 2, 'OGG.003', 2500),
('3D Printer', 'Ultimaker', 'S5', 'Stampante 3D', 4, 'OGG.004', 2200),
('3D Scanner', 'Shining3D', 'EinScan Pro 2X', 'Scanner 3D', 3, 'OGG.005', 2800),
('Laser Cutter', 'Trotec', 'Speedy 360', 'Taglierina laser', 2, 'OGG.006', 3000),
('Smartwatch', 'Apple', 'Watch Series 7', 'Orologio intelligente', 7, 'OGG.007', 800),
('E-bike', 'Specialized', 'Turbo Vado 6.0', 'Bicicletta elettrica', 6, 'OGG.008', 2000);
Come noti, la sintassi è molto simile all’inglese corrente. Il codice spiega di inserire (INSERT) all’interno (INTO) della tabella di “oggetti” le specifiche di ciascuno di loro.
Visualizzare la tabella (come vedrai, con il comando SELECT), porta ad un output molto simile a quello che segue:
+----+--------------+---------------------+----------------+----------+------------------+-----------+
| id | marca | modello | descrizione | quantità | collocazione | prezzo |
+----+--------------+---------------------+----------------+----------+------------------+-----------+
| 1 | DJI | Phantom 4 | Drone | 2 | AA.001 | 1500.00 |
| 2 | Sony | HMZ-T3Q | Visore 3D | 4 | BB.002 | 2000.00 |
| 3 | Vuzix | Blade AR | AR glasses | 3 | CC.003 | 2500.00 |
| 4 | Ultimaker | S5 | 3D printer | 5 | DD.004 | 2800.00 |
| 5 | Artec3D | Eva | 3D scanner | 2 | EE.005 | 1800.00 |
| 6 | Epilog Laser | Zing 16 | Laser cutter | 7 | FF.006 | 3000.00 |
| 7 | Samsung | Galaxy Watch | Smartwatch | 6 | GG.007 | 1200.00 |
| 8 | Giant | Trance E+1 Pro | E-bike | 9 | HH.008 | 2900.00 |
+----+-----------------+-------------------+---------------+----------+----------------+-------------+
La colonna id è una colonna auto-incrementale che viene generata automaticamente per ogni riga inserita nella tabella.
Può essere utile mostrare subito l’istruzione che visualizza questa tabella:
SELECT * FROM oggetti;
Si tratta di una frase semplice in inglese semplificato: scegli e visualizza (select) tutti gli oggetti (asterisco) dalla (from) tabella di nome “oggetti”.
Ma adesso basta teoria! Mettiamo, finalmente, le mani sul codice. Ma come?
Scopriamolo proseguendo la guida!
3
Tool di SQL editing
3.1
MySQL cos è
Quando si parla di database in genere si fa riferimento ai diversi ambienti SQL a pagamento disponibili sul mercato. Certamente il più noto è Oracle, anche al grande pubblico, viste le molte sponsorizzazioni di eventi anche sportivi, come l’America’s Cup di vela, che ha anche vinto con un proprio equipaggio.
Nel mondo del Web, invece, grande fama ha MySQL, anche per l’esteso uso che se ne fa nei siti web di tutto il mondo. Ma che cos’è MySQL?
MySQL cos è
MySQL è un popolare sistema di gestione dei database relazionali (RDBMS) open source, creato nel 1995 da Michael Widenius e David Axmark. Esso utilizza il linguaggio SQL per creare, gestire e manipolare i dati all'interno delle tabelle del database.
MySQL è noto per la sua scalabilità, affidabilità e velocità, nonché per facilità d’uso, il che lo rende adatto per una vasta gamma di applicazioni, dai siti web personali ai sistemi aziendali di grandi dimensioni. Grazie alla sua natura open source, MySQL è gratuito e può essere utilizzato e modificato da chiunque, anche se esistono anche versioni commerciali con supporto e funzionalità aggiuntive. MySQL è compatibile con una grande varietà di sistemi operativi, tra cui Windows, macOS, Linux e altri sistemi Unix-like. Inoltre, MySQL si integra facilmente con numerosi linguaggi di programmazione, come il linguaggio PHP, il linguaggio Python, il linguaggio Java e Ruby, rendendolo una soluzione ideale per lo sviluppo di siti web dinamici e applicazioni web.
Ovviamente, esistono svariati prodotti commerciali, così come molti tool gratuiti da scaricare sul desktop. Vediamoli insieme, con la premessa che, per questa guida, verrà utilizzato un servizio gratuito fruibile online
3.2
Cinque prodotti commerciali per interagire con SQL
Esistono molti tool software per interagire con il linguaggio SQL. Guardiamo insieme cinque prodotti commerciali per poterlo fare.
5 prodotti commerciali per interagire col linguaggio SQL
Tra i più noti, partendo da Oracle, troviamo:
Oracle SQL Developer: questo ambiente SQL è sviluppato da Oracle ed è specifico per l'utilizzo con il database Oracle. Offre una vasta gamma di funzionalità, tra cui un editor SQL, debugger, visualizzatore di dati, reportistica e altro ancora.
Microsoft SQL Server Management Studio. Ovviamente è specifico per SQL Server di Microsoft. Offre una vasta gamma di funzionalità, tra cui editor, debugger, gestione degli oggetti del database, importazione/esportazione dei dati, reportistica e altro ancora.
IBM Data Studio. Ideale per i database IBM, tra cui DB2, Informix e altri. Offre un'interfaccia utente intuitiva, un editor, la gestione degli oggetti del database, l'importazione/esportazione dei dati, la creazione di report e altro ancora.
PostgreSQL. Questo RDBMS (come hai visto, la R sta per 'relazionale') è gratuito e open source con conformità SQL. Originariamente chiamato Postgres, è stato rinominato PostgreSQL nel 1996 per riflettere il suo supporto per SQL. PostgreSQL segue il paradigma ACID, con transazioni con proprietà Atomicity, Consistency, Isolation e Durability, viste aggiornabili automaticamente, viste materializzate, trigger, chiavi esterne e stored procedures.
SAP SQL Anywhere Studio. SAP lo ha studiato per il suo database SQL Anywhere. Offre un'interfaccia utente intuitiva, un editor, la gestione degli oggetti del database, l'importazione/esportazione dei dati, la creazione di report e altro ancora.
Come vedi dalle brevi descrizioni, alcuni punti di confronto sono l’apertura a più database, l’integrazione e il tipo di licenza, oltre ovviamente alle funzionalità. Prima di scegliere quale ambiente SQL acquistare, è consigliabile fare ricerche e confronti.
In generale, è il committente del progetto a proporre l’uno o l’altro a seconda delle sue necessità.
3.3
Cinque tool online gratuiti per interagire con SQL
L’uso di tool online, con i loro pregi e difetti, è spesso preferibile. Per quanto riguarda il linguaggio SQL, ne esistono svariati di tipo gratuito. Eccone alcuni.
SQL Fiddle crea, testa e condivide codice SQL per diversi database, come MySQL, PostgreSQL, Oracle e SQLite.
DB Fiddle è simile a SQL Fiddle, ma supporta solo PostgreSQL, MySQL e SQLite.
SQLite Online supporta solo SQLite.
W3Schools SQL Editor: offre un'interfaccia utente semplice. Mette a disposizione un database di esempio per eseguire query.
MySQL Online Editor scrive ed esegue codice MySQL online.
Ricorda che questi strumenti sono disponibili online e potrebbero non garantire la sicurezza dei dati, quindi non dovresti inserire informazioni sensibili come password o informazioni personali. Inoltre, le funzionalità gratuite potrebbero essere limitate, anche fortemente
3.4
Cinque tool SQL desktop gratuiti per Windows e MacOS
Anche per il desktop esistono numerosi software gratuiti. Non esiste un tool migliore in assoluto, ma bisogna vedere le singole necessità. In genere, tutti funzionano per i principali sistemi operativi (Windows, MacOS e Linux). Sequel è solo per MacOS, mentre TablePlus supporta anche iOS. Per Linux bisogna sempre vedere di quale distribuzione si parla.
Ecco alcuni suggerimenti.
MySQL Workbench opera su MySQL. Ha un’eccellente interfaccia utente ed è compatibile con Windows, MacOS e Linux.
Sequel Pro è stato progettato specificamente per MacOS. Offre funzionalità di gestione, sviluppo e interrogazione dei dati. C’è solo per MacOS.
TablePlus è un'applicazione di gestione del database con un'interfaccia utente intuitiva e funzionalità avanzate per la gestione e l'analisi dei dati MySQL PostgreSQL, MongoDB ed altri. Disponibile per Windows, MacOS, iOS e Linux.
DBeaver è un'applicazione open source con auto completamento e suggerimenti. Supporta MySQL, PostgreSQL, SQLite, Oracle e altri. Windows, MacOS e Linux.
Valentina Studio è un open source per MySQL, PostgreSQL, MariaDB, il loro database proprietario Valentina DB e altri database. L’editor SQL evidenzia la sintassi e permette di eseguire più query contemporaneamente. Il supporto non riceve spesso dei complimenti. C’è per Windows, MacOS e Linux.
Le versioni gratuite spesso limitano le funzionalità limitate rispetto alle versioni a pagamento. A te la scelta!
3.5
MySQL online
La nostra scelta è ricaduta su un tool chiamato MySQL online. Negli esempi che seguono abbiamo usato, infatti, proprio questo tool. Si tratta di uno degli infiniti strumenti per la programmazione disponibili sul sito di Extend Class. Al momento in cui scriviamo, è operativa la versione 8.0 di MySQL.
Per scrivere e verificare il codice non è necessario neanche iscriversi: ovviamente, tuttavia, è doveroso farlo.
MSO per Windows
La finestra di MySQL online è di semplicissima interpretazione.
Cliccando sul link si vede una schermata come quella appena riportata, con un esempio già attivo, completata da alcuni avvisi.
L’intera guida è sviluppata tenendo conto di soli cinque elementi:
la finestra testo;
l’evidenziazione del testo;
il comando RUN (in alto a destra, in verde);
la riga dei messaggi del sistema;
Lo spazio di stampa dei risultati.
Nella prima finestra non c’è stampa dei risultati, quindi alcuni elementi non si vedono.
Se clicchi su RUN, il codice di esempio viene eseguito e si evidenziano tutti gli spazi dei quali abbiamo bisogno. Per rendere più visibili i vari elementi, l’immagine originale è stata migliorata.
la finestra testo riporta il codice di esempio;
l’evidenziazione del testo non è ancora mostrata;
il comando RUN è sempre in alto a destra;
la riga dei messaggi del sistema riporta “3 rows”, poiché è stato chiesto di stampare un database di 3 righe (più l’intestazione);
lo spazio di stampa dei risultati è la tabella posta in basso.
Per evidenziare il testo si usano i metodi tradizionali, ovvero il click del mouse oppure le freccette. Dare RUN senza testo evidenziato esegue l’intero codice; evidenziando una parte del codice, invece, solo quella sarà eseguita.
Banalmente, evidenziare parte del testo porta alla consueta visualizzazione.
In questa guida svolgeremo degli esempi. La scelta di un tool online rende comodo avere il codice tutto insieme: ecco perché lo trovi nelle varie appendici, pronto per il cut and paste!
MySQL Online per MacOS
Il tool scelto funziona perfettamente anche su MacOS. Per quanto riguarda il codice, fa comodo averlo tutto insieme: lo trovi nelle varie appendici, al termine di questa guida.
MySQL Online su Safari per MacOS
L’immagine è leggermente rielaborata per compattezza.
MySQL Online su Chrome per MacOS
Anche in questo caso, l’immagine è leggermente rielaborata per compattezza. Appare praticamente identica!
3.6
Il primo esempio
Ti avevamo promesso mani in pasta, ed eccoci qui: diamo un po' di concretezza a quanto detto!
Con MySQL Online, l’esempio teorico visto nei capitoli precedenti appare scritto così:
CREATE TABLE oggetti (id integer PRIMARY KEY AUTO_INCREMENT, oggetto varchar(50), marca varchar(50), modello varchar(50), descr varchar(10), collocazione VARCHAR(8), quantita integer, prezzo decimal);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('Drone', 'DJI', 'Mavic Air 2', 'descr', 'OGG.001', 10, 1000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('Visore 3D', 'Oculus', 'Quest 2', 'descr', 'OGG.001', 10, 1000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('AR Glasses', 'Google', 'Glass Edition 2', 'descr', 'OGG.001', 10, 2000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('3D Printer', 'Ultimaker', 'S5', 'descr', 'OGG.001', 10, 1200);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('3D Scanner', 'Shining3D', 'EinScan Pro 2X', 'descr', 'OGG.002', 10, 1000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('Laser Cutter', 'Trotec', 'Speedy 360', 'descr', 'OGG.002', 10, 1000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('Smartwatch', 'Apple', 'Watch Series 7', 'descr', 'OGG.002', 10, 2000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('E-bike', 'Specialized', 'Turbo Vado 6.0', 'descr', 'OGG.002', 10, 1200);
SELECT * FROM oggetti;
In MySQL online la schermata è quella qui riportata.
La schermata ha funzione esplicativa
È rilevante la stampa dei risultati (5), ovvero l’output:
Una prima cosa da notare è che nel dichiarare la variabile ‘prezzo’ viene usato ‘decimal’ senza nessuna altra specificazione. In genere, si preferisce specificare il numero di cifre permesse, secondo la notazione (numero_cifre_intere.numero_cifre_decimali). Per un prezzo si potrebbe indicare (5.2), per cinque cifre intere (massimo 99.999) e due cifre decimali (da 00 a 99).
Una seconda cosa è che gli oggetti hanno due sole collocazioni, OGG.001 e OGG.002. In generale, questa scelta genererebbe confusione, perché mentalmente siamo abituati ad avere una sola collocazione per ciascun oggetto.
In realtà, alcuni database automatici usano una stessa area fisica per depositare temporaneamente oggetti diversi. Le stesse immagini che vediamo nei magazzini automatici funzionano in questo modo.
4
Filtrare e ordinare i dati in SQL
4.1
SELECT SQL
La prima modalità di filtro è l’uso di SELECT per il suo vero utilizzo: scegliere alcune colonne e non altre. Finora l’hai visto con l’asterisco, che indica tutte le colonne e, quindi, non fa alcuna scelta.
Se dall’esempio corrente usi una SELECT diversa puoi nascondere le colonne che vuoi.
SELECT marca, modello, prezzo FROM oggetti;
mostrerà solo tre colonne
Se poi vuoi mettere le colonne in ordine diverso, basta modificare l’elenco successivo alla SELECT.
SELECT prezzo, marca, modello FROM oggetti;
4.2
WHERE SQL
WHERE e HAVING sono due clausole dell’istruzione SELECT. Vediamo come funzionano.
Supponi di voler selezionare solo gli oggetti con marca 'Trotec'.
SELECT * FROM oggetti WHERE marca='Trotec';
Questo restituirebbe solo le righe della tabella 'oggetti' in cui la marca è 'Trotec', nel nostro esempio, il laser cutter.
Invece, per scegliere tutti e soli gli oggetti di prezzo pari a 1.000 (euro), puoi scrivere così:
SELECT * FROM oggetti WHERE prezzo='1000';
Il risultato è un elenco dei 4 oggetti con quel prezzo.
4.3
GROUP SQL
Un’altra clausola molto usata con SELECT è GROUP.
Supponi di voler conoscere il numero totale di oggetti presenti per collocazione. Puoi usare la clausola GROUP BY. Per fare le cose un po’ più interessanti, nell’esempio che segue trovi alcune variazioni sul tema, con le clausole COUNT, AS e SUM: capisci a che servono?
SELECT collocazione, COUNT(*) AS num_oggetti, SUM(prezzo) AS totale_prezzo FROM oggetti GROUP BY collocazione;
Questa query svolge le seguenti funzioni:
Separa gli oggetti per collocazione;
conta il numero di oggetti presenti in ogni collocazione;
calcola il totale dei prezzi di tutti gli oggetti in ogni collocazione
per ogni valore del campo collocazione, stampa una riga con i totali di prezzo.
Il risultato è il seguente:
4.4
ORDER SQL
Un tipo di filtro molto interessante è l’ordinamento dei dati. Vari tipi di ordinamento sono fondamentali per un uso efficace dei database. Sempre partendo dall’istruzione SELECT, le clausole usate sono ORDER e GROUP.
Per ordinare gli oggetti in base al prezzo, dal più basso al più alto, puoi usare ORDER BY:
SELECT * FROM oggetti ORDER BY prezzo ASC;
Questa richiesta (query) restituisce tutte le righe della tabella 'oggetti' ordinate in base al prezzo, come richiesto ovvero dal più basso al più alto. Noterai che è stata introdotta l’ulteriore clausola ASC, che indica l'ordinamento ascendente (ascending).
Come vedi, le prime quattro voci sono quelle di prezzo minore, sempre pari a 1.000 (euro).
Puoi provare da solo a verificare l'ordinamento inverso, dal più alto al più basso, attraverso la clausola DESC, descending.
4.5
HAVING SQL
Supponi, ora, di voler conoscere il numero totale di oggetti presenti solo per le marche con almeno un oggetto con prezzo uguale a 1000. La clausola HAVING filtra i dati raggruppati:
SELECT marca, SUM(quantita) as totale_oggetti
FROM oggetti
WHERE prezzo = 1000
GROUP BY marca
HAVING totale_oggetti > 0;
Questa query restituisce una tabella con le marche e il numero totale di oggetti per quella marca, ma solo per le marche che hanno almeno un oggetto con prezzo uguale a 1.000. La clausola 'WHERE' filtra le righe in cui il prezzo è uguale a 1.000, mentre la clausola 'HAVING' filtra almeno un oggetto con prezzo uguale a 1.000.
Il risultato, come previsto, è una lista dei quattro oggetti di prezzo pari a 1.000 (euro).
5
Unire più tabelle in SQL
5.1
UNION SQL
L'operatore UNION unisce il risultato di due o più SELECT in un unico risultato. Il risultato dell'UNION contiene tutte le righe restituite dalle query coinvolte nell'operazione senza duplicati.
Ad esempio, potremmo unire le righe della tabella "oggetti" dove il prezzo è uguale a 1000 con quelle dove la collocazione è "OGG.002". Ecco un esempio di query:
SELECT id, oggetto, marca, modello, descr, collocazione, quantita, prezzo
FROM oggetti
WHERE prezzo = 1000
UNION
SELECT id, oggetto, marca, modello, descr, collocazione, quantita, prezzo
FROM oggetti
WHERE collocazione = 'OGG.002'
Questa query restituirà tutte le righe dove il prezzo è uguale a 1000 unite alle righe dove la collocazione è "OGG.002".
È molto importante notare che le righe presenti in entrambi i risultati vengono scoperte e visualizzate una sola volta.
Nel nostro database abbiamo 4 risultanze per la ricerca con prezzo pari a 1.000 e altre 4 con collocazione OGG.002, a due di loro (scanner e cutter) hanno entrambi i parametri, per cui appaiono una volta sola. La tabella finale ha, quindi, 6 elementi.
UNION ALL SQL
In alcuni casi, però, servono anche le occorrenze duplicate. In questo caso la clausola UNION si modifica in UNION ALL. Il codice appena visto, con l’aggiunta di ALL, non filtra la duplicazione di scanner e cutter e visualizza una lista di 8 elementi.
Per convincerti, prova ad aggiungere ALL e a rieseguire quelle linee.
5.2
JOIN SQL
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.
6
linguaggio SQL: come aggiungere e modificare campi
6.1
Aggiungere e modificare campi in SQL
Per aggiungere, cancellare o modificare i campi si usano le istruzioni ALTER. Per fare degli esempi senza creare confusione su MySQL online useremo una tabella a parte, un calendario di appuntamenti.
Supponiamo di avere i seguenti appuntamenti:
Lunedì 25/04 ore 16 visita da Gregory House al Plainsboro Teaching Hospital di Princeton, NJ (New Jersey);
Martedì 26/04 ore 18 visita da Randolph Bell al Chastain Park Memorial Hospital di Atlanta, GA (Georgia);
Giovedì 28/04 ore 11 visita da Meredith Grey al Grey Sloan Memorial Hospital di Seattle, WA (Washington).
La relativa agenda in SQL può essere scritta in questo modo:
CREATE TABLE agenda (id integer PRIMARY KEY AUTO_INCREMENT, dottore varchar(30), data DATE, giorno varchar(10), ospedale varchar(30), citta varchar(10), Stato varchar(2));
INSERT INTO agenda (dottore, data, giorno, ospedale, citta, Stato) VALUES ('Gregory House', '2023-04-25', 'Lunedì', 'Plainsboro', 'Princeton', 'NJ');
INSERT INTO agenda (dottore, data, giorno, ospedale, citta, Stato) VALUES ('Randolph Bell', '2023-04-26', 'Martedì', 'Chastain', 'Atlanta', 'GA');
INSERT INTO agenda (dottore, data, giorno, ospedale, citta, Stato) VALUES ('Meredith Grey', '2023-04-28', 'Giovedì', 'Grey Sloan', 'Seattle', 'WA');
SELECT * FROM agenda
Il formato della data dipende dal database impiegato e in genere dalle impostazioni regionali del sistema. Ad esempio, MySQL online segue "YYYY-MM-DD" (anno-mese-giorno), ed è per questo che come data trovi 2023-04-25 ed altre simili.
Nota che MySQL online aggiunge alla data anche l’orario, HH.MM.SS.mmm, con ore, minuti, secondi e millesimi di secondi.
In SQL si chiama formato standard 127, secondo la norma ISO8601 con time zone Z.
Questa scelta rende la tabella poco leggibile. Per ora trascura questo elemento.
6.2
ALTER TABLE / ADD / UPDATE SQL
Se hai fatto attenzione, hai notato anche che rispetto alla lista discorsiva alla tabella manca una informazione: l’orario. I tre appuntamenti sono infatti rispettivamente alle 16, 18 ed 11 in orario locale.
Per completare la tabella bisogna quindi aggiungere un campo. A questo serve l'istruzione ALTER TABLE, ovvero modifica la tabella. Per aggiungere alla tabella agenda il campo per l’orario, che è di tipo TIME, puoi usare il seguente comando:
ALTER TABLE agenda ADD orario TIME;
A questo punto, visualizzando tutta la tabella con il solito comando:
SELECT * FROM agenda
Si ottiene una tabella identica alla precedente, ma con una nuova colonna per l’orario.
Successivamente, dovrai inserire i valori per i campi della nuova colonna degli orari. Puoi fare così:
UPDATE agenda
SET orario = '16:00'
WHERE id = 1;
UPDATE agenda
SET orario = '18:00'
WHERE id = 2;
UPDATE agenda
SET orario = '11:00'
WHERE id = 3;
A questo punto la query SELECT * FROM agenda darà il risultato completo:
6.3
ALTER TABLE / DROP SQL
Per cancellare un campo da una tabella serve l'istruzione ALTER TABLE. Ad esempio, per cancellare il campo "giorno" dalla tabella "agenda", puoi usare il seguente comando:
ALTER TABLE agenda DROP COLUMN giorno;
Una volta eseguita, questa istruzione riduce la tabella. Chiedendo al sistema di mostrare il risultato con la solita SELECT, otterrai questa nuova tabella:
In realtà, il giorno della settimana può essere utile in un’agenda, quindi lo terremo. Purtroppo la colonna relativa è stata eliminata e non può essere ripristinata: con MySQL Online dovrai ricominciare da capo! Questa evenienza serve per ricordarti di usare DROP con estrema parsimonia, perché il suo operato è irreversibile e alle volte questo può essere un danno.
Ricarica il codice nel sistema online e ripristina la situazione precedente la cancellazione del giorno della settimana. Fatto? Ora possiamo andare avanti.
Passiamo ad un punto più rilevante. La data è ancora nel formato standard, completa ma difficile da leggere. Per eliminare l’inconveniente puoi ricorrere a due passaggi successivi: aggiungere una colonna con la data più comoda e poi eliminare la vecchia colonna della data troppo lunga.
Per aggiungere una colonna con la data corretta si usa la clausola DATE_FORMAT:
SELECT *, DATE_FORMAT(data, '%d-%m-%Y') as data_ok FROM agenda;
Per eliminare la colonna ‘Stato’ userai l’ALTER TABLE / DROP che hai già visto:
ALTER TABLE agenda DROP COLUMN Stato;
A questo punto, bisogna nascondere il campo ‘data’ e riordinare le colonne. Il campo ‘data’ non può essere eliminato, perché è dai suoi contenuti che viene ricavato il campo ‘data_ok’: eliminare il primo porta all’eliminazione anche del secondo. Ma puoi non mostrarlo, come hai visto nella descrizione della SELECT.
Sempre in quella parte della guida hai visto che puoi stampare solo le colonne che vuoi.
SELECT id, dottore, citta, ospedale, giorno, DATE_FORMAT(data, '%d-%m-%Y') as data_ok, orario FROM agenda;
Ottimo! I nostri appuntamenti sono in ordine. O no?
7
Funzioni e operatori del linguaggio SQL
7.1
COUNT, SUM; AND, OR, NOT SQL
Passeremo velocemente su questa parte, poiché davvero semplice. Avrai comunque modo di eseguire alcune operazioni che ti mostrino in pratica le possibilità di base e ti consentano, se avrai voglia, di fare autonomamente sperimentazioni più ampie con le clausole che vedrai. Inoltre, avrai le basi per cercare autonomamente le altre clausole ed istruzioni offerte dal linguaggio SQL.
COUNT, SUM; AND, OR, NOT SQL
Funzioni e operatori aritmetici
Come qualsiasi linguaggio di programmazione, anche il linguaggio SQL consente di manipolare i dati con funzioni ed operatori aritmetici.
COUNT e SUM le hai già usate in un esempio precedente. Sai, quindi, già che gli operatori aritmetici, come l'addizione, la sottrazione, la moltiplicazione e la divisione, sono clausole dell’istruzione SELECT.
Funzioni e operatori logici
Gli operatori logici, come AND, OR e NOT, non li hai usati negli esempi precedenti. Ma, niente paura! In genere, sono clausole dell’istruzione WHERE per filtrare i dati in base a determinate condizioni.
UPPER, CONCAT, SUBSTRING; DATEDIFF SQL
Funzioni per la manipolazione di stringhe
Le funzioni di manipolazione delle stringhe sono molto importanti.
SUBSTRING estrae una sottostringa da una stringa.
REPLACE sostituisce una sottostringa con un'altra.
CONCAT concatena due o più stringhe in una sola.
UPPER e LOWER convertono una stringa rispettivamente in maiuscolo (uppercase) o minuscolo (lowercase).
LEN calcola la lunghezza (length) di una stringa
TRIM rimuove gli spazi vuoti.
Funzioni per la manipolazione di date
Anche le date sono importanti in SQL. Le funzioni per la manipolazione delle date consentono di eseguire operazioni su date e ore.
DATEPART estrae parti specifiche da una data, come il giorno, il mese o l'anno.
DATEADD aggiunge un intervallo di tempo, ad esempio un numero di giorni o ore.
DATEDIFF calcola la differenza tra due date in giorni o ore.
A partire dalla tabella ‘agenda’, ipotizziamo di voler fare le seguenti modifiche:
- mettere in maiuscolo i contenuti del campo 'giorno', ad es.‘Lunedì’ -> “LUNEDÌ”
- dal campo 'dottore' trasformi il nome proprio nella sola iniziale seguita da un punto, es. Gregory House -> G. House;
- calcolare la differenza in giorni dal 01-01-2023 e la data dell'appuntamento, e metterla in una nuova colonna di nome 'da 1 gennaio'.
-- Per mettere in maiuscolo il campo 'giorno'
UPDATE agenda SET giorno = UPPER(giorno);
-- Per modificare il campo 'dottore' da ‘Nome Cognome’ in ‘N. Cognome’
UPDATE agenda SET dottore = CONCAT(LEFT(dottore, 1), '. ', SUBSTRING_INDEX(dottore, ' ', -1));
/*
Per aggiungere una nuova colonna
con la differenza in giorni dal 01-01-2023
*/
ALTER TABLE agenda ADD COLUMN da_1_genn INT;
UPDATE agenda SET da_1_genn = DATEDIFF(data, '2023-01-01');
Il risultato finale, visualizzato con la solita SELECT * FROM agenda, sarà il seguente:
Essendo partiti dalla tabella ‘agenda’ senza modifiche, la data viene mostrata comprensiva di orario (che non abbiamo aggiornato) e senza il campo orario. Queste modifiche le abbiamo già fatte insieme: sei in grado di ripeterle da solo?
7.2
AVG, MIN e MAX SQL
Funzioni di aggregazione come AVG, MIN e MAX per calcolo statistiche sui dati.
Vediamo come fare una media e trovare massimo e minimo dei tre numeri nella colonna da_1_genn.
SELECT AVG(da_1_genn) AS media, MIN(da_1_genn) AS minimo, MAX(da_1_genn) AS massimo FROM agenda;
Essendo una SELECT, non modifica la tabella ‘agenda’ ma presenta direttamente i risultati.
7.3
Commenti in SQL
Se hai prestato attenzione nella pagina precedente, avrai certamente notato che nel codice abbiamo inserito nuovi caratteri, composti dal doppio trattino -- o da una combinazione di slash ed asterisco (/*, */).
Tutti i linguaggi di programmazione permettono di inserire dei commenti utili per modificare il codice, ma che non vengono eseguiti. In genere nelle varie versioni di SQL vengono accettati due tipi di commento:
quello su una sola linea, preceduto dai due trattini – ;
quello su più linee, anticipato da /* (su una sua linea) e seguito da */ (su una sua linea).
I commenti sono essenziali per rendere leggibile il codice a sviluppatori diversi dall’ideatore di quelle righe, come anche a lui stesso, per modificarlo in tempi successivi, quando non ricorderà tutto in modo esatto!
8
Suggerimenti
8.1
Sviluppi successivi a questa guida SQL
In questa guida hai visto le basi elementari della gestione di basi di dati a partire da tabelle che vengono manipolate e messe in relazione tra loro. Senza entrare nel dettaglio operativo, è opportuno che tu sappia fin d’ora in quale ambiente ti troverai a lavorare realmente in questo mondo.
Per ridurre al massimo i problemi derivanti dall’inesperienza, gli esempi sono stati svolti in un ambiente online che allo stesso tempo memorizza le tabelle ed esegue modifiche e query.
Non è questa la modalità operativa con la quale lavorerai in SQL: le due fasi andranno separate ed userai software e servizi diversi.
La sicurezza è un argomento centrale in tutte le cose, ed il linguaggio SQL non sfugge. Inoltre, ha alcune sue specificità, tra le quali la cosiddetta SQL Injection. Il momento nel quale un’applicazione database presenta al cliente una maschera di selezione delle opzioni (pensa sempre ad un e-commerce) è spesso trascurato. In pratica, la sicurezza di questa pagina è ridotta: un cyber-criminale può accedere a questa pagina, modificare le opzioni impostate dall’utente ed accedere in lettura e modifica a molti dei dati del database.
Per evitare che ciò accada, è necessario svolgere un’operazione di validazione dell'input dell'utente: controllare che i dati inseriti dall'utente siano corretti e sicuri prima di usarli nelle query reali. Tra i controlli troviamo la lunghezza dei dati inseriti dall'utente, la presenza di caratteri speciali o simboli non validi per evitare attacchi di tipo injection, cross-site scripting (XSS) o altri attacchi,validità dei dati inseriti (nel campo data c’è davvero una data?) e via discorrendo.
Ti ricordiamo, comunque, che per farti prendere dimestichezza col linguggio SQL abbiamo preparato per te 5 esercizi SQL con cui esercitarti! Cosa aspetti?
9
Codice SQL dei precedenti capitoli
9.1
Codice SQL per i capitoli 3 e 4
Questa è la tabella ‘oggetti’
CREATE TABLE oggetti (id integer PRIMARY KEY AUTO_INCREMENT, oggetto varchar(50), marca varchar(50), modello varchar(50), descr varchar(10), collocazione VARCHAR(8), quantita integer, prezzo decimal);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('Drone', 'DJI', 'Mavic Air 2', 'descr', 'OGG.001', 10, 1000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('Visore 3D', 'Oculus', 'Quest 2', 'descr', 'OGG.001', 10, 1000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('AR Glasses', 'Google', 'Glass Edition 2', 'descr', 'OGG.001', 10, 2000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('3D Printer', 'Ultimaker', 'S5', 'descr', 'OGG.001', 10, 1200);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('3D Scanner', 'Shining3D', 'EinScan Pro 2X', 'descr', 'OGG.002', 10, 1000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('Laser Cutter', 'Trotec', 'Speedy 360', 'descr', 'OGG.002', 10, 1000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('Smartwatch', 'Apple', 'Watch Series 7', 'descr', 'OGG.002', 10, 2000);
INSERT INTO oggetti (oggetto, marca, modello, descr, collocazione, quantita, prezzo) VALUES ('E-bike', 'Specialized', 'Turbo Vado 6.0', 'descr', 'OGG.002', 10, 1200);
Queste sono le query
SELECT * FROM oggetti;
SELECT * FROM oggetti WHERE marca='Trotec';
SELECT marca, SUM(quantita) as totale_oggetti
FROM oggetti
WHERE prezzo = 1000
GROUP BY marca
HAVING totale_oggetti > 0;
SELECT * FROM oggetti ORDER BY prezzo ASC;
SELECT collocazione, COUNT(*) AS num_oggetti, SUM(prezzo) AS totale_prezzo FROM oggetti GROUP BY collocazione;
9.2
Codice SQL per il capitolo 5
In questo capitolo si usano gli esempi dei due precedenti, collegati alla tabella ‘oggetti’, e poi il seguente codice, prima relativo alla tabella ‘fornitori’, poi dall’unione dei due.
Questa è la tabella ‘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);
Queste sono le query
SELECT * FROM fornitori;
SELECT oggetti.*, fornitori.* FROM oggetti INNER JOIN fornitori ON oggetti.marca = fornitori.marca;
9.3
Codice SQL per i capitoli 6 e 7
Questa è la tabella ‘dottori’
CREATE TABLE agenda (id integer PRIMARY KEY AUTO_INCREMENT, dottore varchar(30), data DATE, giorno varchar(10), ospedale varchar(30), citta varchar(10), Stato varchar(2));
INSERT INTO agenda (dottore, data, giorno, ospedale, citta, Stato) VALUES ('Gregory House', '2023-04-25', 'Lunedì', 'Plainsboro', 'Princeton', 'NJ');
INSERT INTO agenda (dottore, data, giorno, ospedale, citta, Stato) VALUES ('Randolph Bell', '2023-04-26', 'Martedì', 'Chastain', 'Atlanta', 'GA');
INSERT INTO agenda (dottore, data, giorno, ospedale, citta, Stato) VALUES ('Meredith Grey', '2023-04-28', 'Giovedì', 'Grey Sloan', 'Seattle', 'WA');
Queste sono le query e le modifiche del capitolo 6
SELECT * FROM agenda
ALTER TABLE agenda ADD orario TIME;
UPDATE agenda
SET orario = '16:00'
WHERE id = 1;
UPDATE agenda
SET orario = '18:00'
WHERE id = 2;
UPDATE agenda
SET orario = '11:00'
WHERE id = 3;
ALTER TABLE agenda DROP COLUMN giorno;
ALTER TABLE agenda DROP COLUMN Stato;
SELECT *, DATE_FORMAT(data, '%d-%m-%Y') as data_ok FROM agenda;
SELECT id, dottore, citta, ospedale, giorno, DATE_FORMAT(data, '%d-%m-%Y') as data_ok, orario FROM agenda;
Queste sono query e modifiche del capitolo 7
-- Per mettere in maiuscolo il campo 'giorno'
UPDATE agenda SET giorno = UPPER(giorno);
-- Per modificare il campo 'dottore' da ‘Nome Cognome’ in ‘N. Cognome’
UPDATE agenda SET dottore = CONCAT(LEFT(dottore, 1), '. ', SUBSTRING_INDEX(dottore, ' ', -1));
/*
Per aggiungere una nuova colonna
con la differenza in giorni dal 01-01-2023
*/
ALTER TABLE agenda ADD COLUMN da_1_genn INT;
UPDATE agenda SET da_1_genn = DATEDIFF(data, '2023-01-01');
/*
Per visualizzare media, minimo e massimo
del campo da_1_genn
*/
SELECT AVG(da_1_genn) AS media, MIN(da_1_genn) AS minimo, MAX(da_1_genn) AS massimo FROM agenda;
CONTENUTI GRATUITI IN EVIDENZA
Guide per aspiranti programmatori 👨🏻🚀
Vuoi muovere i primi passi nel Digital e Tech? Abbiamo preparato alcune guide per aiutarti a orientarti negli ambiti più richiesti oggi.