Corso
Hai mai notato che MySQL è richiesto in quasi tutte le job description legate ai database? C’è un buon motivo — MySQL alimenta praticamente di tutto, dalle tue piattaforme social preferite alle app che usi ogni giorno.
Ho messo insieme questa guida per aiutarti ad affrontare le domande di un colloquio su MySQL. Coprirò tutto, dalle basi che uno sviluppatore junior dovrebbe conoscere agli aspetti più complessi richiesti per ruoli senior. Condividerò anche alcuni suggerimenti per aiutarti a presentarti come un candidato sicuro nei prossimi colloqui legati ai dati.
Che cos’è MySQL?
MySQL è un RDBMS open source (relational database management system) basato su SQL che organizza i dati in tabelle strutturate. È stato sviluppato da Oracle Corporation.
Si è classificato come il DBMS più popolare nel 2024. Tuttavia, un sondaggio di Stack Overflow del 2025 ha mostrato che PostgreSQL si è classificato come il database più utilizzato tra gli sviluppatori professionisti, superando per la prima volta MySQL.
Attenzione: MySQL è ancora enormemente popolare — raggiungendo il 40,5% di utilizzo tra gli sviluppatori nel 2025 — e alimenta ancora innumerevoli applicazioni web, sistemi di gestione dei contenuti e strumenti enterprise. E soprattutto, se lavori con applicazioni web o lo stack LAMP, MySQL è una competenza di primo livello da avere.

Nel 2024, MySQL è stato il DBMS open source più popolare al mondo, con un punteggio di 1061. Fonte: Statista.
Domande di base su MySQL
Nella fase iniziale del colloquio, l’intervistatore può porre domande fondamentali per valutare la tua comprensione dei concetti di base dei database e di MySQL.
1. Che cos’è un database e in cosa si differenzia da un DBMS?
Un database è un contenitore di archiviazione che contiene dati a cui possiamo accedere, che possiamo modificare e analizzare. Ad esempio, le piattaforme social memorizzano in database i dati su chi ha messo Mi piace ai nostri post.
Un DBMS (Database Management System) è il software che ci permette di interagire con quei dati e gestirli, creando utenti e gestendone gli accessi. MySQL è uno dei DBMS più popolari. Altri esempi includono PostgreSQL, MongoDB e Microsoft SQL Server.
2. In cosa MySQL differisce dagli altri sistemi di gestione di database relazionali?
MySQL è un sistema di gestione di database relazionali (RDBMS) open source che usa SQL per gestire i dati. È noto per la sua facilità d’uso, velocità e compatibilità con le applicazioni web.
Ecco come MySQL differisce da altri RDBMS:
- Semplicità e prestazioni: MySQL è spesso apprezzato per la semplicità e le prestazioni ottimizzate, il che lo rende una scelta di riferimento per sviluppatori web e startup.
- Funzionalità avanzate: Pur eccellendo nella facilità d’uso, MySQL può mancare di funzionalità avanzate presenti in altri RDBMS come PostgreSQL, ad esempio un supporto più completo per le transazioni ACID, l’indicizzazione avanzata e un set più ampio di tipi di dato.
- Motori di archiviazione: MySQL ti consente di scegliere tra diversi motori di archiviazione (ad es. InnoDB, MyISAM) per le tabelle, offrendo flessibilità per casi d’uso specifici.
MySQL è ideale negli scenari che richiedono velocità e scalabilità; per funzionalità più complesse o di livello enterprise, potrebbe essere preferibile PostgreSQL.
3. Quali sono i principali tipi di dato disponibili in MySQL?
MySQL supporta diversi tipi di dato, categorizzati come:
-
Numerici:
INT,DECIMAL,FLOAT,DOUBLE, ecc. -
Stringa:
CHAR,VARCHAR,TEXT,BLOB. -
Data/ora:
DATE,DATETIME,TIMESTAMP,TIME. -
JSON: Per archiviare oggetti JSON.
4. Qual è la differenza tra i tipi di dato INT e DECIMAL?
INT memorizza numeri interi senza decimali. Possiamo usarlo quando non servono frazioni. Al contrario, DECIMAL può memorizzare valori finanziari ed è adatto a calcoli precisi con decimali.
5. In MySQL, in cosa DATE è diverso da DATETIME?
La funzione DATE in MySQL memorizza la data in formato anno, mese, giorno:
YYYY-MM-DD
La funzione DATETIME, invece, memorizza la data con l’ora, in questo formato:
YYYY-MM-DD HH:MM:SS
6. Che cos’è una chiave esterna e come la useresti nei database?
Una chiave esterna è un campo in una tabella che collega la chiave primaria di un’altra tabella.
Per esempio, in una tabella customers che memorizza le informazioni sui clienti, ogni cliente ha un customer_id univoco — in un’altra tabella chiamata transactions (che memorizza gli acquisti), usiamo customer_id come chiave esterna. Il customer_id nella tabella delle transazioni collegherà ogni acquisto a uno specifico cliente nella tabella customers .
Ecco come appare in SQL:
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE transactions (
transaction_id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10,2),
date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
7. Quali sono le differenze tra INNER JOIN, LEFT JOIN, RIGHT JOIN e FULL JOIN?
I join combinano righe di due o più tabelle in base a colonne correlate. Ecco le differenze:
-
INNER JOIN: restituisce le righe in cui c’è una corrispondenza in entrambe le tabelle.
-
LEFT JOIN: restituisce tutte le righe della tabella di sinistra e le righe corrispondenti della tabella di destra. Se non c’è corrispondenza, viene restituito
NULLper le colonne della tabella di destra. -
RIGHT JOIN: simile a
LEFT JOIN, restituisce tutte le righe della tabella di destra e le righe corrispondenti di quella di sinistra. -
FULL JOIN: combina i risultati di
LEFT JOINeRIGHT JOIN, includendo le righe senza corrispondenza di entrambe le tabelle. Nota: MySQL non supporta nativamente la sintassiFULL JOIN. Per ottenere lo stesso risultato, usa unaUNIONdi unLEFT JOINe unRIGHT JOIN
8. Qual è la differenza tra DELETE, TRUNCATE e DROP in MySQL?
Comandi come DELETE, TRUNCATE e DROP possono sembrare simili, ma in realtà si comportano in modo diverso:
DELETE: rimuove righe da una tabella in base a una condizione. Può essere annullato se all’interno di una transazione. Esempio:
DELETE FROM employees WHERE department_id = 5;
TRUNCATE: cancella tutte le righe di una tabella, ma la struttura resta intatta. È più veloce di DELETE e non può essere annullato. Esempio:
TRUNCATE TABLE employees;
DROP: rimuove completamente struttura e dati della tabella, insieme a eventuali dipendenze come gli indici. Esempio:
DROP TABLE employees;
9. Come si crea e modifica una tabella in MySQL? Fornisci esempi.
Per creare tabelle, puoi usare l’istruzione CREATE TABLE e, per modificarle, di solito ALTER TABLE. Ecco alcuni esempi:
Creare una tabella:
CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), department VARCHAR(50));
Modificare per aggiungere una colonna:
ALTER TABLE employees ADD COLUMN salary DECIMAL(10, 2);
10. Che cos’è una tabella temporanea in SQL?
Una tabella temporanea esiste solo durante la sessione di database corrente. Una volta chiusa la sessione, la tabella viene eliminata. Questo tipo di tabella può archiviare temporaneamente risultati intermedi. Possiamo usarla per test, filtraggio o preparazione dei dati prima di inserirli in una tabella permanente.
Ecco un esempio:
CREATE TEMPORARY TABLE temp_employees (
id INT,
name VARCHAR(50)
);
INSERT INTO temp_employees VALUES (1, 'John Doe');
SELECT * FROM temp_employees;
11. Che cos’è una sottoquery in MySQL? Spiega con un esempio.
Una sottoquery (nota anche come query annidata) è annidata all’interno di un’altra query. Scompone operazioni complesse sul database in passaggi più gestibili. Ad esempio, puoi creare una sottoquery per trovare i dipendenti che guadagnano oltre la media:
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
Vediamo nel dettaglio:
-
La query interna
SELECT AVG(salary) FROM employeescalcola prima lo stipendio medio. -
La query esterna usa poi questa media per trovare i dipendenti che guadagnano più di essa.
12. Come useresti un’istruzione INSERT in MySQL per aggiungere dati a una tabella? Hai anche delle best practice?
Possiamo usare l’istruzione INSERT per aggiungere dati a una tabella. La sintassi di base è:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
Ecco alcune best practice da seguire quando usi INSERT
-
Elenca esplicitamente le colonne. Rende il codice più chiaro e previene errori se la struttura della tabella cambia in seguito.
-
Per colonne con
AUTO_INCREMENTcome gli ID, saltale nell’istruzioneINSERT. MySQL le gestisce automaticamente per evitare ID duplicati. -
Sii coerente con gli apici per le stringhe. Personalmente preferisco gli apici singoli, ma entrambi funzionano.
-
Se stai inserendo più righe, puoi farlo in un’unica istruzione per migliori prestazioni.
13. Qual è il significato dell’attributo AUTO_INCREMENT in MySQL?
L’attributo AUTO_INCREMENT in MySQL genera numeri univoci e sequenziali per una colonna, di solito la chiave primaria di una tabella.
Ecco un esempio di creazione di una tabella con una colonna AUTO_INCREMENT:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50)
);
E per inserire righe al suo interno:
INSERT INTO employees (name, department) VALUES ('John Doe', 'Sales');
INSERT INTO employees (name, department) VALUES ('Jane Smith', 'Marketing');
14. Che cos’è una vista in MySQL?
Una vista è una query salvata che funziona come una tabella virtuale. Con questa, possiamo prendere una query complessa, darle un nome e usarla come tabella per query future. In questo modo non devi riscrivere l’intera query ogni volta.
Per esempio, per semplificare l’interrogazione dei dettagli dei dipendenti insieme ai nomi dei reparti, puoi creare una vista:
CREATE VIEW employee_details AS
SELECT
e.id,
e.name,
d.department_name,
e.salary
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id;
Ora puoi interrogare la vista employee_details proprio come una tabella:
SELECT * FROM employee_details;
Tuttavia, non possiamo usare le viste per inserire e aggiornare i dati. La maggior parte supporta l’opzione di sola lettura e impedisce agli utenti di accedere direttamente al database, migliorando la sicurezza dei dati. Le viste a volte possono rallentare le query, poiché eseguono la query sottostante ogni volta che vengono richiamate.
Domande intermedie su MySQL
In questa sezione tratteremo argomenti di livello intermedio. Queste domande vengono poste principalmente per testare la tua conoscenza dei tipi di dato e della struttura di MySQL.
15. Cosa sono le tabelle versionate dal sistema e come funzionano?
Le tabelle versionate dal sistema mantengono una cronologia completa delle modifiche apportate a una tabella. Poiché conservano le versioni precedenti di ogni riga, possiamo usarle per audit e ripristino dei dati.
Funzionano aggiungendo due colonne extra — StartTime ed EndTime — per registrare quando ogni riga è valida. Quando inseriamo, aggiorniamo o eliminiamo dati, questi timestamp vengono aggiornati:
-
Insert: viene aggiunta una nuova riga con
StartTimeimpostato al timestamp corrente eEndTimea9999-12-31 23:59:59— il valoreDATETIMEmassimo di MySQL, usato come sentinella per indicare "riga attiva" -
Update: l’
EndTimedella riga originale viene aggiornato al timestamp corrente per segnarla come non più valida. Poi viene creata una nuova riga con i dati aggiornati,StartTimeimpostato al timestamp corrente edEndTime"infinito". -
Delete: l’
EndTimedella riga esistente viene aggiornato al timestamp corrente, indicando che la riga non è più valida.
Usando la clausola FOR SYSTEM_TIME di SQL, puoi interrogare la tabella per vederne lo stato in un momento specifico o su un intervallo di tempo. Per esempio:
-
FOR SYSTEM_TIME AS OF '2024-01-01': recupera lo stato della tabella com’era il 1° gennaio 2024. -
FOR SYSTEM_TIME BETWEEN '2024-01-01' AND '2024-12-31': mostra tutte le righe valide in questo intervallo di date.
16. Cosa sono le transazioni in MySQL e come si usano?
Le transazioni sono un insieme di operazioni eseguite come un’unica unità. Garantiscono l’integrità dei dati consentendo a tutte le operazioni di riuscire o fallire insieme.
Ecco un esempio d’uso:
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 500 WHERE account_id = 2;
COMMIT; -- Salva le modifiche in modo permanente
-- oppure
ROLLBACK; -- Annulla le modifiche
17. Che cos’è un vincolo di default in MySQL? Come imposti un valore predefinito per una colonna?
Un vincolo di default in MySQL assegna un valore predefinito a una colonna quando non viene fornito un valore esplicito durante un’operazione di INSERT. Ciò garantisce che la colonna sia valida anche se l’utente la omette in fase di inserimento.
Ecco come creare una tabella con un valore predefinito:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
status VARCHAR(10) DEFAULT 'active'
);
Poi puoi inserire una riga senza specificare status:
INSERT INTO employees (name) VALUES ('John Doe');
Questo approccio riduce la probabilità di NULL o dati non validi in colonne critiche e semplifica le query eliminando la necessità di gestire esplicitamente i casi predefiniti.
|
Campo |
Tipo |
Null |
Chiave |
Default |
Extra |
|
id |
INT |
NO |
PRI |
NULL |
AUTO_INCREMENT |
|
name |
VARCHAR(50) |
YES |
NULL |
||
|
status |
VARCHAR(10) |
YES |
active |
Questo comando è utile perché:
- Aiuta gli sviluppatori a comprendere lo schema della tabella prima di scrivere le query.
- Può essere usato per il debug, soprattutto quando si lavora con database non familiari.
- Identifica rapidamente i vincoli, come chiavi primarie o default.
18. Qual è la differenza tra CHAR e VARCHAR in MySQL?
Entrambi memorizzano dati di tipo stringa, ma gestiscono l’archiviazione in modo diverso:
-
CHAR(n)memorizza sempre esattamentencaratteri, riempiendo con spazi se il valore è più corto. È a lunghezza fissa, il che lo rende leggermente più veloce per colonne in cui tutti i valori hanno la stessa lunghezza, come codici paese o flag di stato. -
VARCHAR(n)memorizza solo i caratteri effettivi inseriti, fino a un massimo din. Usa meno spazio per dati a lunghezza variabile ma ha un piccolo overhead per tracciare la lunghezza.
CREATE TABLE example (
country_code CHAR(2), -- Always 2 chars, e.g. 'US', 'UK'
email VARCHAR(255) -- Variable length up to 255 chars
);
Regola pratica: usa CHAR per valori a lunghezza fissa, VARCHAR per tutto il resto.
19. Come useresti le funzioni sulle stringhe in SQL per gestire il testo?
Diverse funzioni sulle stringhe in SQL lavorano con nomi e altri dati testuali. Per esempio:
-
La funzione
LENGTH()mostra il numero di caratteri in un nome. -
UPPER()eLOWER()convertono il testo tutto in maiuscolo o minuscolo. -
CONCAT()unisce nome e cognome in una colonna. -
SUBSTRING()estrae parti specifiche del testo. Per esempio, possiamo usarla per separare il mese dalla data di nascita.
Ecco una query di esempio:
SELECT
UPPER(first_name) AS upper_name,
CONCAT(first_name, ' ', last_name) AS full_name,
SUBSTRING(birthdate, 6, 2) AS birth_month,
TRIM(last_name) AS trimmed_last_name,
REPLACE(first_name, 'a', '@') AS replaced_name
FROM employees;
Questa query:
-
Converte i nomi in maiuscolo.
-
Combina nome e cognome in un nome completo.
-
Estrae il mese di nascita dalla colonna
birthdate. -
Rimuove gli spazi dai cognomi.
-
Sostituisce tutte le occorrenze di "a" con "@" nei nomi.
20. Come aggiorneresti una riga specifica in un database con SQL?
Puoi usare l’istruzione UPDATE e la clausola WHERE per identificare il record da modificare.
Per esempio, se vuoi aggiornare il genere del film “Inception” del 2010 in “Sci-fi”, puoi usare la seguente query:
UPDATE movies
SET genre = 'Sci-Fi'
WHERE movie_title = 'Inception' AND year = 2010;
Qui, UPDATE movies specifica la tabella da aggiornare e la clausola WHERE seleziona la riga in cui il titolo è “Inception” e l’anno è “2010”.
Domande avanzate su MySQL
Le domande avanzate valutano la tua capacità di gestire scenari complessi in MySQL e danno all’intervistatore un’idea delle tue capacità decisionali.
21. Che cos’è un trigger in MySQL? Come lo implementi?
In MySQL, un trigger è un insieme di azioni che si esegue quando si verifica un evento nel database. I trigger possono essere configurati per eseguire prima o dopo eventi come INSERT, UPDATE o DELETE.
Per esempio, supponiamo che ci sia una tabella orders in cui vengono aggiunti nuovi ordini. Possiamo creare un trigger che registra ogni nuovo ordine in una tabella order_history:
CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_history (order_id, action, timestamp)
VALUES (NEW.order_id, 'inserted', NOW());
END;
Dopo l’esecuzione del trigger, la tabella order_history si aggiorna automaticamente:
|
history_id |
order_id |
action |
timestamp |
|
1 |
1 |
inserted |
2024-12-24 10:00:00 |
|
2 |
2 |
inserted |
2024-12-24 11:00:00 |
22. Perché aggiungere un indice rende le query SQL più veloci?
Se non c’è un indice, il database deve scansionare ogni riga per trovare una voce specifica. Un indice funziona come un sommario, consentendo al database di accedere alle righe pertinenti. Quindi, aggiungere un indice riduce i tempi di ricerca e velocizza le query.
Gli indici sono tipicamente implementati con strutture dati come B-tree o hash table, che permettono al database di eseguire ricerche, lookup e scansioni di intervalli in modo efficiente.
Ecco un esempio di creazione di un indice:
-- Senza indice:
SELECT * FROM employees WHERE last_name = 'Smith';
-- Aggiungere un indice sulla colonna last_name:
CREATE INDEX idx_last_name ON employees(last_name);
-- Con l'indice, il database può individuare rapidamente le righe con 'Smith' nella colonna last_name.
Gli indici hanno anche degli svantaggi, per esempio:
-
Operazioni di scrittura più lente:
INSERT,UPDATEeDELETEsono più lenti perché l’indice deve essere aggiornato a ogni modifica dei dati. -
Costo in termini di spazio: gli indici richiedono spazio di archiviazione aggiuntivo.
23. Quale tipo di dato usiamo per peso e prezzo di un prodotto in una tabella SQL, e perché?
Per il peso, DECIMAL è in genere la scelta più sicura. Sebbene FLOAT e REAL possano memorizzare valori decimali, usano l’aritmetica in virgola mobile, che può introdurre piccoli errori di arrotondamento.
Per pesi di prodotto in cui l’accuratezza è importante (ad es. calcoli di spedizione, inventario), DECIMAL(8, 3) ti dà un controllo preciso con 3 decimali e senza sorprese di arrotondamento. FLOAT è accettabile solo quando un piccolo margine di errore è tollerabile.
24. Come trovi le righe duplicate in SQL con una funzione finestra?
Ecco come puoi trovare i duplicati usando la funzione finestra ROW_NUMBER():
WITH DuplicateCheck AS (
SELECT product_name,
category,
ROW_NUMBER() OVER(
PARTITION BY product_name, category
ORDER BY id
) AS row_num
FROM sales
)
SELECT *
FROM DuplicateCheck
WHERE row_num > 1;
Vediamo come funziona:
1. ROW_NUMBER() assegna un numero a ogni riga nel risultato.
2. PARTITION BY raggruppa le righe per product_name e category.
3. All’interno di ogni gruppo, le righe sono numerate a partire da 1.
4. Qualsiasi row_num maggiore di 1 indica un duplicato.
Per esempio, se abbiamo questi record:
- Prodotto A, Categoria X, row_num = 1
- Prodotto A, Categoria X, row_num = 2 (duplicato)
- Prodotto B, Categoria Y, row_num = 1
La query mostrerà la seconda riga poiché il suo row_num è maggiore di 1.
25. Come crei e usi una stored procedure con parametri in MySQL? Spiega con un esempio.
Possiamo salvare e riutilizzare query complesse con le stored procedure per rendere le operazioni sul database più efficienti e manutenibili. Vediamo come crearle e usarle con parametri tramite un esempio pratico.
Supponiamo di avere un database di studenti e di voler creare una procedura per filtrare gli studenti per età. Ecco come possiamo fare:
Per prima cosa, creiamo una semplice stored procedure che accetta un parametro età:
CREATE PROCEDURE get_student_info(IN age INT)
BEGIN
SELECT * FROM student WHERE student.age = age;
END;
Per usare questa procedura, la CALLiamo con l’età desiderata:
CALL get_student_info(21);
Possiamo rendere le procedure più sofisticate usando parametri di output. Per esempio, creiamo una procedura che conta gli studenti di una specifica età:
CREATE PROCEDURE count_students_by_age(IN age INT, OUT student_count INT)
BEGIN
SELECT COUNT(*) INTO student_count FROM students WHERE students.age = age;
END;
Per ottenere il risultato da questa procedura:
SET @count = 0;
CALL count_students_by_age(21, @count);
SELECT @count AS total_students;
26. Perché l’integrità referenziale è importante in un database?
L’integrità referenziale mantiene accurate le relazioni tra tabelle. Quando creiamo una chiave esterna, garantisce che i valori in una tabella corrispondano a quelli univoci nella tabella di riferimento.
Esempio pratico: supponi di gestire un database e-commerce. Hai una tabella Customers e una tabella Orders. Ogni ordine deve appartenere a un cliente reale. L’integrità referenziale, implementata tramite chiavi esterne, impone questa relazione assicurando che:
- Non puoi creare un ordine per un cliente inesistente.
- Non puoi eliminare un cliente con ordini esistenti (a meno di configurare esplicitamente cosa accade a quegli ordini).
- Non puoi aggiornare l’ID di un cliente se quel cliente ha ordini esistenti.
Quindi, quando crei un vincolo di chiave esterna come questo:
ALTER TABLE Orders
ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);
Il database applica automaticamente queste regole:
-
Ogni
CustomerIDnella tabellaOrdersdeve esistere nella tabellaCustomers. -
I tentativi di violare queste regole (come inserire un
CustomerIDnon valido) verranno rifiutati.
Questo previene inconsistenze che potrebbero causare problemi seri, come ordini non riconducibili a clienti reali o report generati con informazioni cliente mancanti.
Domande su MySQL per amministratori di database
Se stai candidandoti specificamente per un ruolo di amministratore di database, ecco alcune domande che i recruiter possono farti.
27. Perché un’applicazione di grandi dimensioni userebbe lo sharding del database? E quali sono le sfide?
Un’applicazione di grandi dimensioni usa il database sharding per dividere grandi quantità di dati su più server. Ogni parte o shard contiene una piccola porzione dei dati. Poiché distribuisce il carico, non serve hardware di fascia alta. Anche velocità e scalabilità migliorano, ma ci sono sfide:
- Alcune query come i join possono non funzionare, complicando la gestione dei dati.
- Quando i dati crescono, gli shard possono sovraccaricarsi, creando hotspot che rallentano le prestazioni.
28. Spiega il ruolo dei redo log nel ripristino dopo crash in MySQL.
Ogni volta che i dati vengono modificati in MySQL, devono essere scritti su disco. Tuttavia, scrivere direttamente sui file di dati è lento e rischioso. Per questo, prima di modificare qualsiasi file di dati, MySQL annota nel redo log cosa farà. Questo è più sicuro che aggiornare i file a caso.
Quindi, poniamo che tu aggiorni l’indirizzo di un cliente:
- MySQL scrive prima questa modifica nel redo log.
- Poi conferma la tua transazione come eseguita (committed).
- Infine applica la modifica ai file di dati effettivi.
Il ripristino dopo un crash è importante se MySQL si arresta dopo il punto 1 o 2 ma prima del punto 3. Al riavvio, MySQL guarda i redo log e completa qualsiasi lavoro in sospeso riproducendo (replaying) le modifiche registrate nei redo log. Questo garantisce che le transazioni confermate non vadano perse, anche se MySQL si arresta nel momento sbagliato.
29. Quali sono i diversi motori di archiviazione disponibili in MySQL e in cosa differiscono?
MySQL supporta più motori di archiviazione , ognuno ottimizzato per casi d’uso diversi. Ecco un confronto dei più comuni:
| Motore di archiviazione | Caratteristiche chiave | Ideale per |
|---|---|---|
| InnoDB | Motore predefinito. Conforme ACID, lock a livello di riga, transazioni e chiavi esterne. | E-commerce, sistemi finanziari, tutto ciò che richiede integrità dei dati. |
| MyISAM | Letture veloci, lock a livello di tabella. Niente transazioni o chiavi esterne. | App con molte letture dove la velocità conta più dell’integrità. |
| Memory | Dati in RAM. Estremamente veloce ma persi al riavvio. | Caching, gestione sessioni, dati temporanei. |
| CSV | Memorizza i dati come file CSV. Nessun indice. | Scambio dati tra app o semplice archiviazione flat-file. |
| Archive | Alta compressione. Solo INSERT e SELECT. Nessun indice. | Dati di log o record storici interrogati di rado. |
| NDB (Clustered) | Archiviazione distribuita, alta disponibilità, tolleranza ai guasti, supporta transazioni. | App distribuite su larga scala che necessitano prestazioni in tempo reale. |
30. Come imposteresti un motore di archiviazione predefinito in MySQL?
Per prima cosa, puoi verificare il motore di archiviazione predefinito attuale:
SHOW ENGINES;
InnoDB è consigliato come motore predefinito poiché supporta funzionalità importanti come:
- Transazioni conformi ad ACID
- Vincoli di chiave esterna
- Ripristino dopo crash
- Lock a livello di riga
Per cambiare temporaneamente il motore predefinito nella sessione corrente, puoi usare:
SET default_storage_engine = 'InnoDB';
Per una modifica permanente, puoi modificare il file di configurazione di MySQL aggiungendo questa riga nella sezione [mysqld]:
default-storage-engine = InnoDB
31. Come ripareresti tabelle corrotte in MySQL?
Per prima cosa, puoi controllare tutti i database con questo comando:
mysqlcheck --check --all-databases -u root -p
Scannerà tutte le tabelle e segnalerà eventuali corruzioni. Poi puoi eseguire questa query per riparare la tabella:
mysqlcheck --repair database_name table_name -u root -p
Le riparazioni possono comportare perdita di dati in caso di grave corruzione, quindi assicurati di eseguire un backup.
Domande su scenari e problem solving in MySQL
Queste domande valutano la tua esperienza con scenari complessi reali e le capacità di problem solving.
32. Spiega uno scenario in cui hai usato sottoquery in MySQL.
Ecco come puoi rispondere a una domanda del genere:
Nel mio ultimo lavoro ho gestito il database di un negozio e-commerce, dove ho dovuto preparare un report sui prodotti. L’obiettivo era trovare i prodotti che generavano vendite superiori alla media, il che richiedeva l’uso di sottoquery per eseguire questa analisi in più passaggi.
Ecco la query SQL che ho sviluppato per risolvere il problema:
SELECT
p.product_id,
p.product_name,
s.sales_amount
FROM products p
JOIN sales s ON p.product_id = s.product_id
WHERE s.sales_amount > (
SELECT AVG(sales_amount)
FROM sales
)
ORDER BY s.sales_amount DESC;
Per prima cosa, ho stabilito un riferimento calcolando la vendita media su tutti i prodotti. Per farlo, ho usato una sottoquery nella clausola WHERE che calcolava AVG(sales_amount) dalla tabella delle vendite. Questa sottoquery fungeva da soglia dinamica con cui misurare le prestazioni di ogni prodotto.
La query principale quindi univa le tabelle prodotti e vendite per ottenere i dettagli rilevanti, mentre la clausola WHERE filtrava i prodotti con vendite sotto la media calcolata.
Strutturando la query in questo modo, ho potuto identificare i prodotti ad alte prestazioni con un’unica operazione sul database, anziché eseguire più query separate.
33. Puoi spiegare una situazione in cui hai usato i join SQL per combinare dati da più tabelle?
Ecco una risposta di esempio alla domanda:
Recentemente ho lavorato a un progetto con due tabelle principali — una con i dati delle vendite dei prodotti e un’altra con i dettagli dei prodotti. Il mio compito era creare un report che mostrasse vendite, nome prodotto, categoria e prezzo.
Per combinare i dati rilevanti, ho usato un INNER JOIN sulla colonna comune product_id per collegare le transazioni di vendita ai dettagli dei prodotti:
SELECT
s.sales_date,
p.product_name,
p.category,
s.quantity_sold,
p.price
FROM
sales s
INNER JOIN
products p
ON
s.product_id = p.product_id;
Il report ha fornito un quadro chiaro delle tendenze di vendita, aiutando gli stakeholder a identificare quali categorie di prodotto performavano bene e quali necessitavano attenzione.
34. Hai esperienza con i trigger? Spiega come li hai usati.
Ecco una risposta di esempio alla domanda:
Sì, ho una notevole esperienza con i trigger. Nel mio recente ruolo, ho implementato un trigger AFTER UPDATE per l’audit delle variazioni di prezzo.
Ti spiego l’implementazione specifica: ho creato un trigger che cattura automaticamente la cronologia dei prezzi ogni volta che cambia il prezzo di un prodotto. Ecco lo script SQL che ho sviluppato:
CREATE TRIGGER tr_AuditPriceChanges
AFTER UPDATE ON Products
FOR EACH ROW
BEGIN
-- Only log if the price actually changed
IF OLD.UnitPrice <> NEW.UnitPrice THEN
INSERT INTO PriceAudit (
ProductID,
OldPrice,
NewPrice,
ChangedBy,
ChangeDate,
PercentageChange
)
VALUES (
NEW.ProductID,
OLD.UnitPrice,
NEW.UnitPrice,
CURRENT_USER(),
NOW(),
ROUND(((NEW.UnitPrice - OLD.UnitPrice) / OLD.UnitPrice * 100), 2)
);
END IF;
END;
Ciò che ha reso questa soluzione particolarmente efficace è stato:
- Viene eseguita solo quando avviene realmente un cambio di prezzo.
- Cattura l’utente che ha effettuato la modifica usando
SYSTEM_USER. - Calcola la variazione percentuale per fini di reportistica.
- Include una clausola
WHEREper filtrare i non-cambi che potrebbero verificarsi da aggiornamenti di altre colonne.
Ho anche aggiunto gestione degli errori e logging quando abbiamo notato alcuni edge case con prezzi NULL.
Suggerimenti per prepararti a un colloquio su MySQL
Se stai iniziando la tua carriera, ecco alcuni suggerimenti che ti aiuteranno a superare il prossimo colloquio:
Padroneggia i concetti core di MySQL: Impara le basi dei database come indicizzazione, transazioni e ottimizzatore di query. Comprendi come MySQL elabora le query e gestisce l’archiviazione dei dati. Questo ti aiuterà a scrivere query efficienti e a spiegare le tue soluzioni durante il colloquio.
Fai pratica concreta: Installa MySQL sul tuo computer e pratica regolarmente. Crea database di test, scrivi diversi tipi di query e prova a ottimizzarle. La pratica reale è il modo migliore per capire come funzionano le cose e acquisire sicurezza per il colloquio.
Per rinfrescare ulteriormente le tue conoscenze, dai un’occhiata alle risorse di DataCamp:
- Per un’introduzione a SQL: Introduction to SQL Course
- Per esercitarti con SQL: Applying SQL to real-world problems
Scopri gli strumenti e le integrazioni di MySQL: Familiarizza con MySQL Workbench o altri strumenti per la gestione del database e il monitoraggio di base. Puoi anche esplorare come MySQL funziona con Python e framework rilevanti, dimostrando che sai lavorare in un ambiente di sviluppo reale.
Conclusione
Ecco fatto! Ho coperto le 34 principali domande su MySQL per aiutarti a ottenere il tuo prossimo lavoro. Che tu stia candidandoti per un ruolo entry-level o per una posizione avanzata da amministratore dei dati, devi avere una solida padronanza dei fondamenti di MySQL, dell’ottimizzazione delle query e della gestione dei database per distinguerti.
Per ampliare ulteriormente le tue conoscenze su altri sistemi di gestione di database, dai un’occhiata ai corsi SQL di DataCamp.
Sono una content strategist: mi piace semplificare argomenti complessi. Ho aiutato aziende come Splunk, Hackernoon e Tiiny Host a creare contenuti coinvolgenti e informativi per il loro pubblico.


