MySQL — Basi (CRUD)

SELECT · INSERT · UPDATE · DELETE · WHERE · ORDER BY · MySQL 9.7 LTS · Marco Consiglio
Volta Institute · Napoli
A.A. 2026
🗄️ Tabelle — la struttura di base di un database relazionale
Un database MySQL organizza i dati in tabelle, ciascuna con colonne (i campi, es. nome, email) e righe (i singoli record, es. un utente specifico) — concettualmente identico all'array multidimensionale (array di array associativi) visto nella guida PHP sugli Array.
CREATE TABLE studenti ( id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(100) NOT NULL, email VARCHAR(150) UNIQUE, voto INT, data_iscrizione DATE DEFAULT (CURRENT_DATE) );
💡 AUTO_INCREMENT genera automaticamente un numero univoco crescente per ogni nuova riga — praticamente sempre usato per la colonna id, la chiave primaria che identifica univocamente ogni record.
🔍 SELECT — leggere i dati
SELECT * FROM studenti; -- restituisce TUTTE le colonne di TUTTE le righe della tabella SELECT nome, voto FROM studenti; -- restituisce SOLO le colonne nome e voto, per tutte le righe
⚠️ SELECT * è comodo per esplorare i dati durante l'apprendimento, ma in produzione è buona pratica specificare sempre le colonne necessarie: query più veloci e codice più chiaro su cosa viene effettivamente utilizzato.
🎯 WHERE — filtrare le righe
SELECT nome, voto FROM studenti WHERE voto >= 18; -- restituisce solo gli studenti promossi SELECT * FROM studenti WHERE nome LIKE 'M%'; -- WHERE + LIKE: trova nomi che iniziano con 'M' (% è un jolly per "qualsiasi cosa segua")
nomevoto
Marco28
Giulia30
💡 WHERE è l'equivalente SQL di array_filter() visto in PHP, o .filter() in JavaScript: seleziona solo le righe che soddisfano una condizione.
➕ INSERT — aggiungere nuove righe
INSERT INTO studenti (nome, email, voto) VALUES ('Marco', 'marco@volta.it', 28); -- Inserire più righe in una sola istruzione: INSERT INTO studenti (nome, email, voto) VALUES ('Giulia', 'giulia@volta.it', 30), ('Luca', 'luca@volta.it', 24);
💡 Non serve specificare id né data_iscrizione: il primo si genera da solo con AUTO_INCREMENT, il secondo prende il valore di default CURRENT_DATE dichiarato nella creazione della tabella.
✏️ UPDATE — modificare righe esistenti
UPDATE studenti SET voto = 30 WHERE nome = 'Marco'; -- Aggiornare più colonne insieme: UPDATE studenti SET voto = 27, email = 'marco.rossi@volta.it' WHERE id = 1;
⚠️ Il pericolo numero uno di UPDATE: dimenticare la clausola WHERE — UPDATE studenti SET voto = 30; senza WHERE aggiorna TUTTE le righe della tabella con quel valore, non solo quella desiderata. Verifica sempre la clausola WHERE prima di eseguire un UPDATE.
🗑️ DELETE — rimuovere righe
DELETE FROM studenti WHERE id = 3; -- rimuove SOLO lo studente con id 3 -- ⚠️ SENZA WHERE, cancella TUTTE le righe della tabella: -- DELETE FROM studenti; ← da usare con estrema cautela!
⚠️ Stesso rischio di UPDATE, ma ancora più grave: DELETE FROM tabella; senza WHERE svuota completamente la tabella, senza possibilità di annullamento immediato. Sempre buona pratica: prima un SELECT con la stessa condizione, per verificare quali righe verrebbero colpite, POI il DELETE.
🔀 ORDER BY — ordinare i risultati
SELECT nome, voto FROM studenti ORDER BY voto DESC; -- ordina per voto DECRESCENTE (dal più alto al più basso) SELECT * FROM studenti ORDER BY nome ASC; -- ordina alfabeticamente CRESCENTE (default se ASC/DESC non specificato)
✂️ LIMIT — restituire solo un numero limitato di righe
SELECT nome, voto FROM studenti ORDER BY voto DESC LIMIT 3; -- restituisce solo i primi 3 studenti con il voto più alto
✅ ORDER BY + LIMIT combinati sono il pattern classico per query come "top 10 prodotti più venduti" o "ultimi 5 ordini ricevuti" — estremamente comune in dashboard e report.