Esempio pratico completo e realistico per l’automazione del sistema di gestione e iscrizione online presso un’agenzia interinale (agenzia per il lavoro), comprensivo di:
- analisi del sistema
- progettazione database
- creazione tabelle SQL
- inserimento dati di esempio
- query SQL operative
- controlli di matching candidati-offerte
Compatibile con MySQL / PostgreSQL.
Sistema di gestione e iscrizione online per agenzia interinale.
1. Scenario reale.
Un’agenzia interinale gestisce:
- iscrizione candidati
- pubblicazione offerte di lavoro
- gestione aziende clienti
- candidatura alle offerte
- organizzazione colloqui
- monitoraggio assunzioni
2. Funzionalità principali.
Candidati
- Registrazione online
- Inserimento CV e competenze
- Consultazione offerte
- Invio candidature
Aziende
- Inserimento offerte di lavoro
- Valutazione candidati
- Prenotazione colloqui
Operatori agenzia
- Verifica candidature
- Matching candidati-offerte
- Monitoraggio inserimenti lavorativi
3. Progettazione Database.
Tabelle principali
- CANDIDATI
- AZIENDE
- COMPETENZE
- CANDIDATI_COMPETENZE
- OFFERTE_LAVORO
- OFFERTE_COMPETENZE
- CANDIDATURE
- COLLOQUI
4. Creazione Tabelle SQL.
Tabella CANDIDATI
CREATE TABLE Candidati (
idCandidato INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(50),
cognome VARCHAR(50),
email VARCHAR(100) UNIQUE NOT NULL,
telefono VARCHAR(20),
titoloStudio VARCHAR(100),
anniEsperienza INT
);
Tabella AZIENDE
CREATE TABLE Aziende (
idAzienda INT PRIMARY KEY AUTO_INCREMENT,
ragioneSociale VARCHAR(100),
settore VARCHAR(50),
email VARCHAR(100),
telefono VARCHAR(20)
);
Tabella COMPETENZE
CREATE TABLE Competenze (
idCompetenza INT PRIMARY KEY AUTO_INCREMENT,
nomeCompetenza VARCHAR(100)
);
Tabella CANDIDATI_COMPETENZE
CREATE TABLE CandidatiCompetenze (
idCandidato INT,
idCompetenza INT,
livello VARCHAR(20),
PRIMARY KEY (idCandidato, idCompetenza),
FOREIGN KEY (idCandidato) REFERENCES Candidati(idCandidato),
FOREIGN KEY (idCompetenza) REFERENCES Competenze(idCompetenza)
);
Tabella OFFERTE_LAVORO
CREATE TABLE OfferteLavoro (
idOfferta INT PRIMARY KEY AUTO_INCREMENT,
idAzienda INT,
ruolo VARCHAR(100),
descrizione TEXT,
sede VARCHAR(100),
dataPubblicazione DATE,
stato VARCHAR(30),
FOREIGN KEY (idAzienda) REFERENCES Aziende(idAzienda)
);
Tabella OFFERTE_COMPETENZE
CREATE TABLE OfferteCompetenze (
idOfferta INT,
idCompetenza INT,
PRIMARY KEY (idOfferta, idCompetenza),
FOREIGN KEY (idOfferta) REFERENCES OfferteLavoro(idOfferta),
FOREIGN KEY (idCompetenza) REFERENCES Competenze(idCompetenza)
);
Tabella CANDIDATURE
CREATE TABLE Candidature (
idCandidatura INT PRIMARY KEY AUTO_INCREMENT,
idCandidato INT,
idOfferta INT,
dataCandidatura DATE,
stato VARCHAR(30),
FOREIGN KEY (idCandidato) REFERENCES Candidati(idCandidato),
FOREIGN KEY (idOfferta) REFERENCES OfferteLavoro(idOfferta)
);
Tabella COLLOQUI
CREATE TABLE Colloqui (
idColloquio INT PRIMARY KEY AUTO_INCREMENT,
idCandidatura INT,
dataColloquio DATETIME,
esito VARCHAR(50),
FOREIGN KEY (idCandidatura) REFERENCES Candidature(idCandidatura)
);
5. Inserimento dati di esempio.
Inserimento candidati
INSERT INTO Candidati (nome, cognome, email, titoloStudio, anniEsperienza)
VALUES (‘Marco’, ‘Rossi’, ‘marco@email.it’, ‘Diploma Informatica’, 3);
Inserimento azienda
INSERT INTO Aziende (ragioneSociale, settore, email)
VALUES (‘Tech Solutions SRL’, ‘Informatica’, ‘hr@techsolutions.it’);
Inserimento competenze
INSERT INTO Competenze (nomeCompetenza)
VALUES (‘Java’), (‘SQL’), (‘Networking’);
Collegamento competenze candidato
INSERT INTO CandidatiCompetenze
VALUES (1, 1, ‘Buono’),
(1, 2, ‘Ottimo’);
Inserimento offerta lavoro
INSERT INTO OfferteLavoro
(idAzienda, ruolo, descrizione, sede, dataPubblicazione, stato)
VALUES
(1, ‘Programmatore Java’, ‘Sviluppo software aziendale’, ‘Venezia’, ‘2026-03-01’, ‘Aperta’);
Collegamento competenze richieste
INSERT INTO OfferteCompetenze
VALUES (1, 1), (1, 2);
Inserimento candidatura
INSERT INTO Candidature
(idCandidato, idOfferta, dataCandidatura, stato)
VALUES (1, 1, CURRENT_DATE, ‘In valutazione’);
Inserimento colloquio
INSERT INTO Colloqui
(idCandidatura, dataColloquio, esito)
VALUES (1, ‘2026-03-10 10:00’, ‘Da svolgere’);
6. Query SQL operative.
Visualizzare offerte disponibili
SELECT ruolo, sede
FROM OfferteLavoro
WHERE stato = ‘Aperta’;
Visualizzare competenze di un candidato
SELECT C.nomeCompetenza, CC.livello
FROM CandidatiCompetenze CC
JOIN Competenze C ON CC.idCompetenza = C.idCompetenza
WHERE CC.idCandidato = 1;
Visualizzare candidati per una offerta
SELECT CA.nome, CA.cognome
FROM Candidature CD
JOIN Candidati CA ON CD.idCandidato = CA.idCandidato
WHERE CD.idOfferta = 1;
Matching candidati-offerta
Trova candidati con tutte le competenze richieste.
SELECT CA.idCandidato, CA.nome, CA.cognome
FROM Candidati CA
JOIN CandidatiCompetenze CC ON CA.idCandidato = CC.idCandidato
WHERE CC.idCompetenza IN[1] (
SELECT idCompetenza
FROM OfferteCompetenze
WHERE idOfferta = 1
)
GROUP BY CA.idCandidato, CA.nome, CA.cognome
HAVING COUNT[2](CC.idCompetenza) =
(
SELECT COUNT(*)
FROM OfferteCompetenze
WHERE idOfferta = 1
);
Storico candidature di un candidato
SELECT O.ruolo, CD.stato
FROM Candidature CD
JOIN OfferteLavoro O ON CD.idOfferta = O.idOfferta
WHERE CD.idCandidato = 1;
Colloqui programmati
SELECT CA.nome, O.ruolo, C.dataColloquio
FROM Colloqui C
JOIN Candidature CD ON C.idCandidatura = CD.idCandidatura
JOIN Candidati CA ON CD.idCandidato = CA.idCandidato
JOIN OfferteLavoro O ON CD.idOfferta = O.idOfferta;
7. Automazioni possibili.
– Matching automatico CV-offerte
– Invio notifiche email ai candidati
– Promemoria colloqui
– Report occupazione
– Generazione contratti digitali
– Dashboard aziende clienti
8. Estensioni avanzate.
- Analisi CV tramite AI
- Video colloqui integrati
- Firma digitale contratti
- Integrazione LinkedIn
- Sistema rating candidati
Benefici del sistema
- Riduzione tempi selezione
- Migliore gestione dati candidati
- Comunicazione automatizzata
- Tracciabilità processo selezione
[1] La clausola IN è un operatore di confronto usato insieme a WHERE per filtrare le righe di una query verificando se il valore di una colonna appartiene a un insieme specificato di valori. È un modo compatto per esprimere più condizioni OR sullo stesso attributo.
[2] HAVING è una clausola che permette di filtrare i risultati di un raggruppamento (GROUP BY) applicando una condizione sulle funzioni aggregate. HAVING COUNT nello specifico filtra i gruppi in base al numero di righe che li compongono. Non è possibile usare WHERE per filtrare funzioni aggregate come COUNT, SUM, AVG — per questo esiste HAVING.
