AUTOMATIZZARE SISTEMA DI GESTIONE E ISCRIZIONE ONLINE PRESSO UN’AGENZIA INTERINALE: analisi+SQL.

Anatomia SQL
Anatomia SQL

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.

** Se puoi sostenere il mio lavoro, comprami un libro | Buy me a book! **
** ISCRIVITI ALLA NEWSLETTER ! **

About the Author

Sergio Mauri
Blogger, autore. Perito in Sistemi Informativi Aziendali, musicista e compositore, Laurea in Discipline storiche e filosofiche e in Filosofia. Premio speciale al Concorso Claudia Ruggeri nel 2007; terzo posto al Premio Igor Slavich nel 2020. Ha pubblicato con Terra d'Ulivi nel 2007 e nel 2011, con Hammerle Editori nel 2013 e 2014, con PGreco nel 2015 con Historica Edizioni e Alcova Letteraria nel 2022 con Silele Edizioni (La Tela Nera) nel 2023 e con Amazon Kdp nel 2024 e 2025.