mercoledì 12 novembre 2025

Corso di SQL: 6 – Relazioni tra Tabelle

6 – Relazioni tra Tabelle

Contenuti

  • Chiavi primarie e chiavi esterne

    • La chiave primaria (Primary Key, PK) è un attributo (o un insieme di attributi) che identifica in modo univoco una tupla in una tabella.

    • La chiave esterna (Foreign Key, FK) è un attributo che crea un legame tra due tabelle, puntando a una PK di un’altra tabella.

  • Relazioni tra tabelle

    • 1:1 (uno a uno) → ogni record di una tabella corrisponde a uno solo in un’altra tabella.
      Esempio: tabella Persone e tabella CodiciFiscali.

    • 1:N (uno a molti) → un record di una tabella è collegato a più record di un’altra.
      Esempio: un Corso seguito da più Studenti.

    • N:M (molti a molti) → gestita tramite una tabella di collegamento.
      Esempio: StudentiCorsi, con tabella Iscrizioni.

  • Join tra tabelle

    • INNER JOIN → restituisce solo i record con corrispondenza in entrambe le tabelle.

    • LEFT JOIN → restituisce tutti i record della tabella di sinistra e i corrispondenti (se esistono) della destra.

    • RIGHT JOIN → simile, ma prende tutti i record della tabella di destra.

    • FULL JOIN → restituisce tutti i record da entrambe le tabelle, con valori NULL se non ci sono corrispondenze.


Esempio pratico – Database studenti e corsi

Supponiamo di avere tre tabelle:

CREATE TABLE Studenti (
    id_studente INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(50),
    cognome VARCHAR(50)
);

CREATE TABLE Corsi (
    id_corso INT PRIMARY KEY AUTO_INCREMENT,
    nome_corso VARCHAR(100)
);

CREATE TABLE Iscrizioni (
    id_studente INT,
    id_corso INT,
    PRIMARY KEY (id_studente, id_corso),
    FOREIGN KEY (id_studente) REFERENCES Studenti(id_studente),
    FOREIGN KEY (id_corso) REFERENCES Corsi(id_corso)
);

Inserimento dati di esempio

INSERT INTO Studenti (nome, cognome) VALUES
('Anna', 'Rossi'),
('Marco', 'Bianchi'),
('Luca', 'Verdi');

INSERT INTO Corsi (nome_corso) VALUES
('Matematica'),
('Fisica'),
('Informatica');

INSERT INTO Iscrizioni (id_studente, id_corso) VALUES
(1, 1), -- Anna segue Matematica
(1, 3), -- Anna segue Informatica
(2, 2), -- Marco segue Fisica
(3, 1), -- Luca segue Matematica
(3, 2); -- Luca segue Fisica

Query con JOIN

  1. INNER JOIN – elenco studenti con i corsi che frequentano:

SELECT s.nome, s.cognome, c.nome_corso
FROM Studenti s
INNER JOIN Iscrizioni i ON s.id_studente = i.id_studente
INNER JOIN Corsi c ON i.id_corso = c.id_corso;

Risultato:

nome cognome nome_corso
Anna Rossi Matematica
Anna Rossi Informatica
Marco Bianchi Fisica
Luca Verdi Matematica
Luca Verdi Fisica

  1. LEFT JOIN – elenco di tutti gli studenti con eventuali corsi:

SELECT s.nome, s.cognome, c.nome_corso
FROM Studenti s
LEFT JOIN Iscrizioni i ON s.id_studente = i.id_studente
LEFT JOIN Corsi c ON i.id_corso = c.id_corso;

⚡ Se aggiungessimo uno studente non iscritto a nessun corso, comparirebbe con NULL nella colonna nome_corso.


  1. FULL JOIN (se supportato, ad es. in PostgreSQL) – elenco completo studenti e corsi:

SELECT s.nome, s.cognome, c.nome_corso
FROM Studenti s
FULL JOIN Iscrizioni i ON s.id_studente = i.id_studente
FULL JOIN Corsi c ON i.id_corso = c.id_corso;

Esercizio proposto

Creare un database scolastico che gestisca:

  • Studenti, corsi e professori.

  • Relazione N:M tra studenti e corsi.

  • Relazione 1:N tra corsi e professori (un professore può insegnare più corsi).

📌 Scrivere query che:

  1. Elenchino i corsi seguiti da ogni studente.

  2. Mostrino i professori con i corsi che insegnano.

  3. Indichino gli studenti che non sono iscritti a nessun corso.

Nessun commento:

Posta un commento

Corso Fondamenti di Informatica e Reti: 6 Reti di computer e Internet

Reti di computer e Internet Introduzione Prova a pensare alla vita quotidiana senza reti informatiche: niente messaggi WhatsApp, niente m...