Come usare la JOIN in SQL nelle relazioni 1 a 1, 1 a N, N a M

Oggi ti propongo tre esercizi svolti, uno per ciascun tipo di associazione (1 a 1, 1 a N, N a M), seguendo la logica dell’algebra relazionale e mostrando anche il corrispettivo in SQL, passo dopo passo. Useremo i concetti teorici dell’algebra relazionale come π (proiezione), σ (selezione), (join naturale), e ρ (rinominazione, se serve).

Esercizio 1 – Associazione 1 a 1

Testo

Ogni persona può avere al massimo una carta d’identità, e ogni carta d’identità appartiene ad una sola persona.

Schema relazionale

Persona(CF, Nome)
CartaIdentita(NumCarta, DataScadenza, CF)
  • CF è chiave primaria in Persona
  • NumCarta è chiave primaria in CartaIdentita
  • CF è anche chiave esterna in CartaIdentita riferita a Persona(CF)

Questa è una relazione 1 a 1, poiché ogni Persona può avere al massimo una CartaIdentita, e viceversa.

Obiettivo

Mostrare Nome, Numero della carta, Data di scadenza per tutte le persone che hanno una carta d’identità.

Algebra relazionale

π[Nome, NumCarta, DataScadenza](Persona ⋈ CartaIdentita)

SQL

SELECT Nome, NumCarta, DataScadenza
FROM Persona
JOIN CartaIdentita ON Persona.CF = CartaIdentita.CF;

Esercizio 2 – Associazione 1 a N

Testo

Un autore può scrivere più libri, ma ogni libro ha un solo autore.

Schema relazionale

Autore(CodAutore, Nome)
Libro(CodLibro, Titolo, CodAutore)
  • CodAutore è chiave primaria in Autore
  • CodAutore in Libro è chiave esterna verso Autore

Associazione 1 a N: uno (autore) → molti (libri)

Obiettivo

Mostrare tutti i libri con il nome del loro autore.

Algebra relazionale

π[Titolo, Nome](Autore ⋈ Libro)
  1. Join tra Autore e Libro usando CodAutore
  2. Proiezione degli attributi Titolo e Nome

SQL

SELECT Titolo, Nome
FROM Autore
JOIN Libro ON Autore.CodAutore = Libro.CodAutore;

Esercizio 3 – Associazione N a M

Testo

Gli studenti possono iscriversi a più corsi, e ogni corso può avere più studenti iscritti.

Schema relazionale

Studente(Matricola, Nome)
Corso(CodCorso, Titolo)
Iscrizione(Matricola, CodCorso)
  • Iscrizione è la relazione intermedia
  • Chiave primaria composta: (Matricola, CodCorso)
  • Foreign key da Iscrizione a Studente e a Corso

Associazione N a M

Obiettivo

Mostrare il nome dello studente e il titolo dei corsi a cui è iscritto.

Algebra relazionale (step by step)

  1. Join Studente con Iscrizione su Matricola

    Studente ⋈ Iscrizione
  2. Join con Corso su CodCorso

    (Studente ⋈ Iscrizione) ⋈ Corso
  3. Proiezione dei campi rilevanti

    π[Nome, Titolo]((Studente ⋈ Iscrizione) ⋈ Corso)

SQL

SELECT Studente.Nome, Corso.Titolo
FROM Studente
JOIN Iscrizione ON Studente.Matricola = Iscrizione.Matricola
JOIN Corso ON Iscrizione.CodCorso = Corso.CodCorso;

Riepilogo

TipoChiave esternaTabella intermediaJoin
1 a 1Su uno dei dueDiretto
1 a NSu lato “molti”Diretto
N a MEntrambiDue join