Vai al contenuto principale

Le 34 migliori domande e risposte su MySQL per i colloqui nel 2026

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

Hai mai notato che MySQL è richiesto in quasi tutte le descrizioni di lavoro legate ai database? C’è un buon motivo: MySQL alimenta praticamente tutto, dalle tue piattaforme social preferite alle app che usi ogni giorno.

Ho messo insieme questa guida per aiutarti ad affrontare le domande sui colloqui MySQL. Coprirò tutto, dalle basi che dovrebbero conoscere gli sviluppatori junior agli aspetti più complessi richiesti per i ruoli senior. Inoltre, condividerò alcuni consigli per aiutarti a presentarti come un candidato sicuro nei tuoi prossimi colloqui per ruoli data-related. 

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 perché sempre più aziende stanno migrando i loro dati su MySQL. Ecco perché, se stai pensando di trovare lavoro con i database, è così importante conoscere MySQL e i database relazionali. 

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

A giugno 2024, MySQL è il DBMS open source più popolare al mondo, con un punteggio di 1061. Fonte: Statista.

Domande base per colloqui MySQL

Nella fase iniziale del colloquio, l’intervistatore può porre domande fondamentali per valutare la tua comprensione dei concetti di base di database e MySQL. 

1. Che cos’è un database e in cosa differisce 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 e gestire quei dati creando utenti e gestendo i loro accessi. MySQL è una delle opzioni di 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 sua semplicità e le prestazioni ottimizzate, rendendolo 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, indicizzazione avanzata e un set più ampio di tipi di dato.
  • Motori di archiviazione: MySQL ti permette di scegliere diversi motori di archiviazione (es. InnoDB, MyISAM) per le tabelle, offrendo flessibilità per casi d’uso specifici.

MySQL è ideale per scenari che richiedono velocità e scalabilità, ma per funzionalità più complesse o di livello enterprise, PostgreSQL potrebbe essere una scelta migliore.

3. Quali sono i principali tipi di dato disponibili in MySQL?

MySQL supporta una varietà di tipi di dato, classificati come:

  • Numerici: INT, DECIMAL, FLOAT, DOUBLE, ecc.
  • Stringa: CHAR, VARCHAR, TEXT, BLOB.
  • Data/ora: DATE, DATETIME, TIMESTAMP, TIME.
  • JSON: Per memorizzare 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 per calcoli precisi con decimali. 

5. In MySQL, in cosa differiscono DATE e DATETIME? 

La funzione DATE in MySQL memorizza la data in formato anno, mese e giorno: 

YYYY-MM-DD

La funzione DATETIME, invece, memorizza la data con l’ora, e appare così: 

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 alla chiave primaria di un’altra tabella. 

Per esempio, in una tabella customers che memorizza le informazioni dei 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?

Le join combinano righe da 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 della sinistra.
  • FULL JOIN: Combina i risultati di LEFT JOIN e RIGHT JOIN, includendo le righe senza corrispondenza di entrambe le tabelle.

8. Qual è la differenza tra DELETE, TRUNCATE e DROP in MySQL?

Comandi come DELETE, TRUNCATE e DROP possono sembrare simili, ma in realtà hanno comportamenti diversi:

  • DELETE: Rimuove le 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: Elimina tutte le righe da una tabella, ma la struttura rimane intatta. È più veloce di DELETE e non può essere annullato. Esempio:
TRUNCATE TABLE employees;
  • DROP: Rimuove completamente la struttura e i dati della tabella, insieme a eventuali dipendenze come indici. Esempio:
DROP TABLE employees;

9. Come si crea e si modifica una tabella in MySQL? Fornisci esempi.

Per creare tabelle, puoi usare l’istruzione CREATE TABLE, e per modificarle in genere 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 corrente del database. Quando chiudiamo la sessione, la tabella viene eliminata. Questo tipo di tabella può memorizzare temporaneamente risultati intermedi. Possiamo usarla per testare, filtrare o preparare i 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 in passaggi più gestibili. Per esempio, puoi creare una sottoquery per trovare i dipendenti che guadagnano sopra la media: 

SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
);

Vediamo come funziona:

  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 qualche 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 che puoi seguire quando uso l’istruzione 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 AUTO_INCREMENT come gli ID, saltale nell’istruzione INSERT(). MySQL le gestisce automaticamente per evitare ID duplicati. 
  3. Sii coerente con le virgolette per le stringhe. Personalmente preferisco gli apici singoli, ma entrambi funzionano.
  4. Se stai inserendo più righe, puoi farlo in un’unica istruzione per prestazioni migliori.

13. Qual è il significato dell’attributo AUTO_INCREMENT in MySQL?

L’attributo AUTO_INCREMENT in MySQL genera numeri univoci e sequenziali per una colonna, tipicamente 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 una tabella per future interrogazioni. 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 possono talvolta rallentare le query, poiché eseguono la query sottostante ogni volta che vengono accessibili.

Domande intermedie per colloqui MySQL

In questa sezione, copriremo argomenti di livello intermedio. Queste domande sono poste principalmente per testare la tua conoscenza dei tipi di dato e della struttura in MySQL.

15. Cosa sono le tabelle con versioning di sistema e come funzionano? 

Le tabelle con versioning di 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 (o un valore simile che rappresenta "per sempre"). Questo indica che la riga è attualmente valida.
  • Update: L’EndTime della riga originale viene aggiornato al timestamp corrente per contrassegnarla come non più valida. Quindi, viene creata una nuova riga con i dati aggiornati, con StartTime impostato al timestamp corrente ed EndTime a "per sempre".
  • 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 visualizzare il suo 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 al 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 MySQL e come si usano?

Le transazioni sono un insieme di operazioni eseguite come un’unica unità. Garantiscono l’integrità dei dati permettendo a tutte le operazioni di riuscire o fallire insieme.

Ecco un esempio di utilizzo:

START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 500 WHERE account_id = 2;
COMMIT; -- Salva definitivamente le modifiche
-- 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 alcun valore esplicito durante un’operazione di INSERT. Questo assicura 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 rimuovendo la necessità di gestire esplicitamente i casi predefiniti.

Risultato:

Campo

Tipo

Null

Chiave

Default

Extra

id

INT

NO

PRI

NULL

AUTO_INCREMENT

name

VARCHAR(50)

 

NULL

 

status

VARCHAR(10)

 

active

 

Questo comando è utile perché:

  • Aiuta gli sviluppatori a comprendere lo schema della tabella prima di scrivere query.
  • Può essere usato per il debugging, soprattutto quando si lavora con database poco familiari.
  • Identifica rapidamente i vincoli, come chiavi primarie o valori di default.

19. Come useresti le funzioni per le stringhe in SQL per gestire il testo? 

Diverse funzioni per le 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 il nome e il cognome in una colonna. 
  • SUBSTRING() estrae parti specifiche del testo. Ad esempio, possiamo usarla per separare il mese dalla data di nascita. 

Ecco un esempio di query:

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 da una 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 che vuoi cambiare. 

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 che vogliamo aggiornare, e la clausola WHERE prende di mira la riga in cui il titolo è “Inception” e l’anno è “2010”. 

Domande avanzate per colloqui MySQL

Le domande avanzate testano la tua capacità di gestire scenari MySQL complessi 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 vengono eseguite 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 dovrà eseguire una scansione di ogni riga per trovare una voce specifica. Un indice funziona come un indice analitico di un libro, consentendo al database di accedere alle righe rilevanti. Quindi, aggiungere un indice riduce i tempi di ricerca e rende le query più rapide. 

Gli indici sono in genere implementati usando strutture dati come B-tree o tabelle hash, che permettono al database di effettuare ricerche, lookup e scansioni per intervalli in modo efficiente.

Ecco un esempio di creazione di un indice:

-- Senza indice:
SELECT * FROM employees WHERE last_name = 'Smith';
-- Aggiunta di un indice sulla colonna last_name:
CREATE INDEX idx_last_name ON employees(last_name);
-- Con l'indice, il database può localizzare rapidamente le righe con 'Smith' nella colonna last_name.

Gli indici hanno alcuni svantaggi, per esempio:

  • Operazioni di scrittura più lente: INSERT, UPDATE e DELETE sono più lenti perché l’indice deve essere aggiornato ogni volta che i dati cambiano.
  • Costo di archiviazione: gli indici richiedono spazio di archiviazione aggiuntivo.

23. Quale tipo di dato usiamo per il peso e il prezzo di un prodotto in una tabella SQL, e perché? 

Usiamo i tipi di dato FLOAT o REAL per memorizzare il peso perché spesso include valori decimali e accetta un piccolo margine di errore. Poiché questi tipi possono memorizzare valori approssimati, sono più adatti per le colonne del peso. 

Il tipo di dato DECIMAL è comunemente usato per memorizzare i prezzi perché i valori finanziari come i prezzi non tollerano nemmeno piccoli errori di arrotondamento. Questa accuratezza si ottiene solo con il tipo decimale (es., DECIMAL(10, 2) per 10 cifre, di cui 2 dopo il punto decimale).

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 nostro 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 attraverso 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, basta richiamarla con l’età desiderata tramite CALL:

CALL get_student_info(21);

Possiamo rendere le nostre 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 le tabelle. Quando creiamo una chiave esterna, essa garantisce che i valori in una tabella corrispondano al valore univoco nella tabella di riferimento.

Ecco un 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 garantendo che:

  • Non puoi creare un ordine per un cliente inesistente.
  • Non puoi eliminare un cliente con ordini esistenti (a meno che non configuri specificamente cosa deve accadere 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 respinti.

Questo previene incoerenze nei dati che potrebbero causare seri problemi, come ordini che non possono essere ricondotti a clienti reali o report generati con informazioni cliente mancanti. 

Domande MySQL per amministratori di database

Se ti stai candidando 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 lo sharding del database per suddividere grandi volumi di dati su più server. Ogni parte o shard contiene una piccola porzione dei dati. Poiché distribuisce il carico dei dati, non c’è bisogno di hardware di fascia alta. Sebbene anche velocità e scalabilità migliorino, presenta alcune sfide: 

  • Alcune query come le join potrebbero 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 di 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. Ecco perché, prima di modificare qualsiasi file di dati, MySQL annota innanzitutto ciò che farà nel redo log. Questo è più sicuro che aggiornare i file di dati in modo casuale.

Mettiamo che tu aggiorni l’indirizzo di un cliente:

  1. MySQL scrive prima questa modifica nel redo log.
  2. Poi riconosce la tua transazione come confermata (committed).
  3. Infine, applica la modifica ai file di dati effettivi.

Il ripristino dopo un crash è importante se MySQL va in crash dopo il punto 1 o 2 ma prima del 3. Quando MySQL si riavvia, consulta i redo log e completa il lavoro non terminato riproducendo le modifiche registrate nei redo log. Questo garantisce che le transazioni confermate non vadano perse, anche se MySQL si blocca in un momento scomodo.

29. Quali sono i diversi motori di archiviazione disponibili in MySQL e in cosa differiscono?

MySQL supporta più motori di archiviazione (storage engine), ciascuno ottimizzato per casi d’uso diversi. Ecco un confronto tra i più comuni:

Motore di archiviazione

Caratteristiche

Casi d’uso

InnoDB

- Motore predefinito.

- Conforme ACID.

- Lock a livello di riga.

- Supporta transazioni e chiavi esterne.

Applicazioni che richiedono elevata integrità dei dati, come piattaforme e-commerce o sistemi finanziari.

MyISAM

- Veloce per operazioni con prevalenza di lettura.

- Lock a livello di tabella.

- Nessun supporto per transazioni o chiavi esterne.

Applicazioni a prevalenza di lettura in cui la velocità è più critica dell’integrità dei dati.

Memory

- Memorizza i dati in RAM.

- Estremamente veloce.

- I dati si perdono al riavvio.

- Dimensioni limitate.

Archiviazione temporanea, caching o gestione delle sessioni.

CSV

- Memorizza i dati in file CSV in chiaro.

- Integrazione semplice con strumenti esterni.

- Nessun supporto per indici.

Scambio dati tra applicazioni o semplice archiviazione senza necessità di interrogazioni complesse.

Archive

- Ottimizzato per alta compressione.

- Supporta solo operazioni INSERT e SELECT.

- Nessun indice.

Archiviazione di dati storici o di log, dove il recupero è poco frequente.

NDB (Clustered)

- Archiviazione distribuita per MySQL Cluster.

- Alta disponibilità e tolleranza ai guasti.

- Supporta le transazioni.

Applicazioni distribuite su larga scala che richiedono prestazioni in tempo reale.

30. Come imposteresti un motore di archiviazione predefinito in MySQL? 

Per prima cosa, puoi verificare il motore di archiviazione predefinito corrente:

SHOW ENGINES;

InnoDB è consigliato come motore predefinito poiché supporta funzionalità importanti come:

  • Transazioni conformi ACID
  • Vincoli di chiave esterna
  • Ripristino dopo crash
  • Lock a livello di riga

Per modificare temporaneamente il motore predefinito per la sessione corrente, puoi usare:

SET default_storage_engine = 'InnoDB';

Per un cambiamento 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

Eseguirà la scansione di tutte le tabelle e segnalerà eventuali corruzioni. Poi, puoi eseguire la seguente query per riparare la tabella: 

mysqlcheck --repair database_name table_name -u root -p

Le riparazioni possono comportare perdita di dati in caso di corruzione grave, quindi assicurati di eseguire un backup dei dati.

Domande MySQL basate su scenari e problem solving

Queste domande valutano la tua esperienza con scenari reali complessi e le capacità di problem solving.

32. Spiega uno scenario in cui hai usato sottoquery in MySQL.

Ecco come puoi rispondere a una domanda di questo tipo:

Nel mio ultimo lavoro ho gestito il database di un negozio e-commerce, dove dovevo preparare un report sui prodotti. L’obiettivo era trovare i prodotti che generavano vendite sopra la media, il che richiedeva l’uso di sottoquery per eseguire questa analisi in più passaggi.

Ecco la query SQL che ho sviluppato per risolverlo:

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 ciascun prodotto.

La query principale ha quindi unito le tabelle prodotti e vendite per estrarre i dettagli rilevanti dei prodotti, mentre la clausola WHERE ha filtrato i prodotti con vendite inferiori alla nostra media calcolata. 

Strutturando la query in questo modo, ho potuto identificare i prodotti ad alte prestazioni con una singola operazione sul database invece di eseguire più query separate.

33. Puoi spiegare una situazione in cui hai usato join SQL per combinare dati da più tabelle? 

Ecco una risposta di esempio alla domanda sopra:

Recentemente, ho lavorato a un progetto in cui avevamo 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 sales, product name, category e price.

Per combinare i dati rilevanti, ho usato una INNER JOIN sulla colonna in comune, product_id, per collegare le transazioni di vendita con i 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 stavano performando bene e quali necessitavano attenzione.

34. Hai esperienza con i trigger? Spiega come li hai usati.

Ecco una risposta di esempio alla domanda sopra:

Sì, ho una vasta esperienza con i trigger di database. Nel mio ruolo più recente, 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
ON Products
AFTER UPDATE AS
BEGIN
    -- Esegui solo se il prezzo è effettivamente cambiato
    IF UPDATE(UnitPrice)
    BEGIN
        INSERT INTO PriceAudit (
            ProductID,
            OldPrice,
            NewPrice,
            ChangedBy,
            ChangeDate,
            PercentageChange
        )
        SELECT 
            i.ProductID,
            d.UnitPrice AS OldPrice,
            i.UnitPrice AS NewPrice,
            SYSTEM_USER,
            GETDATE(),
            ROUND(((i.UnitPrice - d.UnitPrice) / d.UnitPrice * 100), 2)
        FROM INSERTED i
        JOIN DELETED d ON i.ProductID = d.ProductID
        WHERE i.UnitPrice <> d.UnitPrice;
    END
END;

Ciò che ha reso questa soluzione particolarmente efficace è stato:

  1. Si attiva solo quando avvengono effettivamente cambi di prezzo.
  2. Cattura l’utente che effettua la modifica usando SYSTEM_USER.
  3. Calcola la variazione percentuale per finalità di reporting.
  4. Include una clausola WHERE per filtrare i non-cambiamenti 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.

Consigli per prepararti a un colloquio MySQL

Se stai iniziando la tua carriera, ecco alcuni consigli che ti aiuteranno a superare il tuo prossimo colloquio:

Padroneggia i concetti core di MySQL: Le basi di progettazione dei database come indicizzazione, transazioni e query optimizer. 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 esperienza pratica: 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 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 pertinenti, dimostrando che sai lavorare in un ambiente di sviluppo reale.

Conclusione

Ecco fatto! Ho coperto le 34 principali domande per colloqui su MySQL per aiutarti a ottenere il tuo prossimo lavoro. Che tu stia candidandoti per un ruolo entry-level o per una posizione avanzata di 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 dei 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
317K
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