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: Studenti ↔ Corsi, 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
NULLse 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
-
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 |
-
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.
-
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:
-
Elenchino i corsi seguiti da ogni studente.
-
Mostrino i professori con i corsi che insegnano.
-
Indichino gli studenti che non sono iscritti a nessun corso.

Nessun commento:
Posta un commento