Il diagramma E/R viene costruito passo passo.
Gli articoli e le lettere
ARTICOLO
- Un articolo può essere pubblicato in un numero della rivista
NUMERO
- Un numero della rivista contiene uno o più articoli
LETTERA
- Una lettera è inviata da un abbonato
ABBONATO
- Un abbonato può inviare una o più lettere
Le lettere pubblicate
Un numero settimanale contiene anche alcune lettere
ARTICOLO
- Un articolo può essere pubblicato in un numero della rivista
NUMERO
- Un numero della rivista contiene uno o più articoli
- Un numero della rivista può contenere una o più lettere
LETTERA
- Una lettera è inviata da un abbonato
- Una lettera può essere pubblicata in un numero
ABBONATO
- Un abbonato può inviare una o più lettere
Autore?
Anche gli articoli hanno un autore (o più di uno?)
AUTORE
- Un autore può scrivere uno o più articoli
ARTICOLO
- Un articolo può essere pubblicato in un numero della rivista
- Un articolo è stato scritto da un autore
NUMERO
- Un numero della rivista contiene uno o più articoli
- Un numero della rivista può contenere una o più lettere
LETTERA
- Una lettera è inviata da un abbonato
- Una lettera può essere pubblicata in un numero
ABBONATO
- Un abbonato può inviare una o più lettere
Ancora?
Il database potrebbe essere arricchito con ulteriori informazioni
- Gli accessi degli abbonati agli articoli
- Il voto, da parte dei lettori, per ogni articolo
- Un abbonato si abbona più volte, in periodi diversi
- Un articolo potrebbe avere più di un autore
- …
Schema relazionale
Considera prima i diversi sottoschemi e poi riuniscili.
Gli articoli e le lettere
Query
Articoli per titolo
1 2 3 |
SELECT ARTICOLO.* FROM ARTICOLO WHERE (Titolo LIKE "*" & [Parola chiave?] & "*") |
Articoli per settimana
1 2 3 |
SELECT ARTICOLO.* FROM ARTICOLO INNER JOIN NUMERO ON (ARTICOLO.pubblicatoIN = NUMERO.IDnumero) WHERE (IDnumero = [Numero rivista?]) |
Articoli per titolo e settimana
1 2 3 |
SELECT ARTICOLO.* FROM ARTICOLO INNER JOIN NUMERO ON (ARTICOLO.pubblicatoIN = NUMERO.IDnumero) WHERE (Titolo LIKE "*" & [Parola chiave] & "*") AND (IDnumero = [Numero rivista?]) |
Lettere per nome dell’autore
1 2 3 |
SELECT LETTERA.* FROM LETTERA INNER JOIN ABBONATO ON (LETTERA.scrittaDA = ABBONATO.IDabbonato) WHERE (Cognome = [Cognome abbonato?]) AND (Nome = [Nome abbonato?]) |
Lettere per periodo
1 2 3 |
SELECT LETTERA.* FROM LETTERA WHERE (DATA BETWEEN [Dal...] AND [Al...]) |
Lettere per nome e per periodo
1 2 3 4 5 |
SELECT LETTERA.* FROM LETTERA INNER JOIN ABBONATO ON (LETTERA.scrittaDA = ABBONATO.IDabbonato) WHERE (Cognome = [Cognome abbonato?]) AND (Nome = [Nome abbonato?]) AND (DATA BETWEEN [Dal...] AND [Al...]) |
Articoli non pubblicati
1 2 3 |
SELECT ARTICOLO.* FROM ARTICOLO WHERE (pubblicatoIN IS NULL) |
Le lettere pubblicate
Query
Le lettere di un abbonato, dati nome e cognome
1 2 3 4 |
SELECT LETTERA.* FROM ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato = LETTERA.scrittaDA) WHERE (Cognome=[Cognome abbonato?]) AND (Nome=[Nome abbonato?]) |
Gli articoli che trattano “arte” nel titolo
1 2 3 |
SELECT * FROM ARTICOLO WHERE (Titolo LIKE "*arte*") |
Gli articoli che NON trattano “arte” nel titolo
1 2 3 |
SELECT * FROM ARTICOLO WHERE (Titolo NOT LIKE "*arte*") |
Gli articoli che trattano un certo TESTO nel titolo
1 2 3 |
SELECT * FROM ARTICOLO WHERE (Titolo LIKE "*" & [Testo contenuto?] & "*") |
Quanti articoli in archivio?
1 2 |
SELECT COUNT(*) FROM ARTICOLO |
Quanti articoli PUBBLICATI?
1 2 |
SELECT COUNT(pubblicatoIN) FROM ARTICOLO |
oppure
1 2 3 |
SELECT COUNT(*) FROM ARTICOLO WHERE (pubblicatoIN IS NOT NULL) |
Quante lettere ricevute in un certo periodo?
1 2 3 |
SELECT COUNT(*) FROM LETTERA WHERE (DATA BETWEEN [Dalla DATA?] AND [Alla DATA?]) |
Gli abbonati che hanno scritto almeno una lettera
1 2 |
SELECT DISTINCT ABBONATO.* FROM ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA) |
oppure
1 2 3 4 |
SELECT * FROM ABBONATO WHERE IDabbonato IN (SELECT scrittaDA FROM LETTERA) |
Gli abbonati che hanno scritto almeno X lettere
1 2 3 4 5 6 |
SELECT IDabbonato, cognome, nome FROM ABBONATO WHERE IDabbonato IN (SELECT scrittaDA FROM LETTERA GROUP BY scrittaDA HAVING (COUNT(*) >= [Numero minimo lettere?])) |
oppure
1 2 3 4 |
SELECT IDabbonato, cognome, nome FROM ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA) GROUP BY IDabbonato, cognome, nome HAVING (COUNT(*) >= [Numero minimo lettere?]) |
…, e quante
1 2 3 4 |
SELECT IDabbonato, cognome, nome, COUNT(*) AS [Numero lettere] FROM ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA) GROUP BY IDabbonato, cognome, nome HAVING (COUNT(*) >= [Numero minimo lettere?]) |
Classifica per numero di lettere scritte
1 2 3 4 |
SELECT IDabbonato, cognome, nome, COUNT(*) AS [Numero lettere] FROM ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA) GROUP BY IDabbonato, cognome, nome ORDER BY COUNT(*) DESC |
Classifica per numero di lettere scritte (i primi 5)
1 2 3 4 |
SELECT TOP 5 IDabbonato, cognome, nome, COUNT(*) AS [Numero lettere] FROM ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA) GROUP BY IDabbonato, cognome, nome ORDER BY COUNT(*) DESC |
Classifica per numero di lettere scritte, almeno X
1 2 3 4 5 |
SELECT IDabbonato, cognome, nome, COUNT(*) AS [Numero lettere] FROM ABBONATO INNER JOIN LETTERA ON (ABBONATO.IDabbonato=LETTERA.scrittaDA) GROUP BY IDabbonato, cognome, nome HAVING (COUNT(*) >= [Numero minimo lettere?]) ORDER BY COUNT(*) DESC |
Finale
Schema esaustivo delle richieste?