Vai al contenuto principale

Le 34 migliori domande (con risposte) su MySQL per i colloqui nel 2026

Padroneggia MySQL con questa guida alle domande da colloquio, con esempi reali e consigli esperti per eccellere nel tuo prossimo colloquio sui database!
Aggiornato 2 giu 2026  · 15 min leggi

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.

Grafico che mostra i database più popolari nel 2024, con MySQL come il più popolare, seguito da PostgreSQL.

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 NULL per 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 JOIN e RIGHT JOIN, includendo le righe senza corrispondenza di entrambe le tabelle. Nota: MySQL non supporta nativamente la sintassi FULL JOIN. Per ottenere lo stesso risultato, usa una UNION di un LEFT JOIN e un RIGHT 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:

  1. La query interna SELECT AVG(salary) FROM employees calcola prima lo stipendio medio.

  2. 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

  1. Elenca esplicitamente le colonne. Rende il codice più chiaro e previene errori se la struttura della tabella cambia in seguito.

  2. Per colonne con AUTO_INCREMENT come gli ID, saltale nell’istruzione INSERT. MySQL le gestisce automaticamente per evitare ID duplicati. 

  3. Sii coerente con gli apici per le stringhe. Personalmente preferisco gli apici singoli, ma entrambi funzionano.

  4. 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 StartTime impostato al timestamp corrente e EndTime a 9999-12-31 23:59:59 — il valore DATETIME massimo di MySQL, usato come sentinella per indicare "riga attiva"

  • Update: l’EndTime della riga originale viene aggiornato al timestamp corrente per segnarla come non più valida. Poi viene creata una nuova riga con i dati aggiornati, StartTime impostato al timestamp corrente ed EndTime "infinito".

  • Delete: l’EndTime della 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 esattamente n caratteri, 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 di n. 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() e LOWER() 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, UPDATE e DELETE sono 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 CustomerID nella tabella Orders deve esistere nella tabella Customers.

  • I tentativi di violare queste regole (come inserire un CustomerID non 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:

  1. MySQL scrive prima questa modifica nel redo log.
  2. Poi conferma la tua transazione come eseguita (committed).
  3. 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:

  1. Viene eseguita solo quando avviene realmente un cambio di prezzo.
  2. Cattura l’utente che ha effettuato la modifica usando SYSTEM_USER.
  3. Calcola la variazione percentuale per fini di reportistica.
  4. Include una clausola WHERE per 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: 

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.


Laiba Siddiqui's photo
Author
Laiba Siddiqui
LinkedIn
Twitter

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.

Argomenti

Approfondisci SQL con questi corsi!

Corso

Manipolazione dei dati in SQL

4 h
323.5K
Vedi dettagliRight Arrow
Inizia il corso
Mostra altroRight Arrow
Correlato

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

Mostra altroMostra altro