Il 0% ha trovato utile questo documento (0 voti)
10 visualizzazioni38 pagine

Informatica

Le forme normali sono regole per progettare database efficienti, mirate a ridurre la ridondanza e migliorare l'integrità dei dati. Le principali forme normali includono la Prima Forma Normale (1NF), la Seconda Forma Normale (2NF) e la Terza Forma Normale (3NF), ognuna con requisiti crescenti. La normalizzazione è un processo iterativo che bilancia la riduzione della ridondanza con la complessità delle query.

Caricato da

s8884497p
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
10 visualizzazioni38 pagine

Informatica

Le forme normali sono regole per progettare database efficienti, mirate a ridurre la ridondanza e migliorare l'integrità dei dati. Le principali forme normali includono la Prima Forma Normale (1NF), la Seconda Forma Normale (2NF) e la Terza Forma Normale (3NF), ognuna con requisiti crescenti. La normalizzazione è un processo iterativo che bilancia la riduzione della ridondanza con la complessità delle query.

Caricato da

s8884497p
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

Forme normali

Forme normali
Le forme normali di un database sono un insieme di regole che aiutano a progettare schemi di database
efficienti e ben strutturati. L'obiettivo principale è eliminare la ridondanza dei dati e migliorare l'integrità dei
dati, evitando anomalie durante le operazioni di inserimento, aggiornamento ed eliminazione. Esistono
diverse forme normali, ognuna con requisiti più stringenti rispetto alla precedente. Le più comuni sono:

Prima Forma Normale (1NF):


1. Tutti gli attributi hanno valori atomici (non ulteriormente divisibili)
2. Esiste una chiave primaria, ovvero un attributo della tabella che identifica ogni riga in modo univoco.
Seconda Forma Normale (2NF):
1. È in 1NF
2. Ogni attributo non chiave dipende funzionalmente dalla chiave primaria intera. Questo significa che
se una tabella ha una chiave primaria composta (formata da più attributi), ogni attributo non chiave
deve dipendere da tutti gli attributi della chiave primaria, e non solo da una parte di essa. In termini di
dipendenza funzionale, non ci devono essere dipendenze parziali.
Dipendenza funzionale: Un attributo Y dipende funzionalmente da un insieme di attributi X se i
valori di X determinano univocamente il valore di Y (X -> Y).
Dipendenza funzionale parziale: Y dipende da un sottoinsieme di X.
Dipendenza funzionale completa: Y dipende da tutti gli elementi di X.
Terza Forma Normale (3NF):
1. È già in 2NF
2. Ogni attributo non chiave non dipende transitivamente dalla chiave primaria. In altre parole, un
attributo non chiave non deve dipendere da un altro attributo non chiave. Se esiste una dipendenza
transitiva, è necessario scomporre la tabella in tabelle più piccole.

La normalizzazione è un processo iterativo. Si inizia con la 1NF e si procede verso forme normali più elevate
fino a raggiungere un livello di normalizzazione considerato adeguato per le esigenze dell'applicazione. La
scelta del livello di normalizzazione dipende da un compromesso tra la riduzione della ridondanza e la
complessità delle query. Un'eccessiva normalizzazione può portare a un numero elevato di join, che possono
influire negativamente sulle prestazioni.

1 / 38
Forme normali

Esempi di Normalizzazione

PRIMA FORMA NORMALE (1NF)


Tabella NON in 1NF (valori non atomici)
Studenti

Matricola Nome Telefoni


S1 Mario Rossi 3201112222, 3334445555
S2 Anna Verdi 3409998888

Colonna "Telefoni" con valori multipli → Non in 1NF

Tabella IN 1NF (valori atomici)


Studenti

Matricola Nome Telefono


S1 Mario Rossi 3201112222
S1 Mario Rossi 3334445555
S2 Anna Verdi 3409998888

Ogni campo contiene un solo valore atomico → In 1NF

SECONDA FORMA NORMALE (2NF)


Tabella NON in 2NF (dipendenza parziale da una chiave composta)
Iscrizioni

Matricola Cod_Corso Nome_Studente Nome_Corso


S1 C1 Marco Neri Reti
S1 C2 Marco Neri Basi di Dati
S2 C1 Anna Bianchi Reti

Nome_Studente dipende solo da Matricola, non dalla chiave composta → Non in 2NF

Tabelle IN 2NF (nessuna dipendenza parziale)


Studenti

Matricola Nome_Studente
S1 Marco Neri
S2 Anna Bianchi

2 / 38
Forme normali

Iscrizioni

Matricola Cod_Corso
S1 C1
S1 C2
S2 C1

Corsi

Cod_Corso Nome_Corso
C1 Reti
C2 Basi di Dati

Nessuna dipendenza parziale → In 2NF

TERZA FORMA NORMALE (3NF)


Tabella NON in 3NF (dipendenza transitiva)
Corsi

Cod_Corso Nome_Corso ID_Docente Nome_Docente


C1 Reti D1 Prof. Verdi
C2 Sistemi D2 Prof. Bianchi

Nome_Docente dipende da ID_Docente , che dipende da Cod_Corso → Dipendenza transitiva → Non


in 3NF

Tabelle IN 3NF (nessuna dipendenza transitiva)


Corsi

Cod_Corso Nome_Corso ID_Docente


C1 Reti D1
C2 Sistemi D2

Docenti

ID_Docente Nome_Docente
D1 Prof. Verdi
D2 Prof. Bianchi

Nessuna dipendenza transitiva → In 3NF

3 / 38
Forme normali

Database
Un database è una raccolta organizzata di dati, generalmente memorizzati e accessibili elettronicamente da
un sistema informatico. I database sono progettati per gestire grandi quantità di informazioni in modo
efficiente, consentendo agli utenti di archiviare, recuperare, aggiornare e cancellare dati in modo strutturato.

Concetti Chiave
Schema: La struttura del database, che definisce come i dati sono organizzati, inclusi i tipi di dati, le
tabelle, le relazioni e i vincoli.
Tabella: Una collezione di dati correlati organizzati in righe e colonne. Ogni riga rappresenta un record, e
ogni colonna rappresenta un attributo del record.
Record (Riga): Un insieme di campi che contengono informazioni su una specifica entità.
Campo (Colonna): Un singolo elemento di informazione all'interno di un record.
Chiave Primaria: Un attributo (o insieme di attributi) che identifica univocamente ogni record in una
tabella.
Chiave Esterna: Un attributo in una tabella che fa riferimento alla chiave primaria di un'altra tabella,
stabilendo una relazione tra le due tabelle.
Query: Una richiesta di dati da un database. Le query sono espresse in un linguaggio specifico, come
SQL.

Fasi per la creazione di un DB Relazionale:


1. Osservazione della realtà
2. Produrre uno schema concettuale (E/R)
3. Tradurre lo schema Concettuale (E/R) in uno schema logico tramite le Regole di Derivazione
4. Creazione del DB Fisico

Tipi di Database
Esistono diversi tipi di database, ognuno con le proprie caratteristiche e adatto a specifici casi d'uso:

Database Relazionali (SQL): Organizzano i dati in tabelle con righe e colonne, e utilizzano SQL
(Structured Query Language) per interrogare e gestire i dati. Esempi includono MySQL.
Database Non Relazionali (NoSQL): Offrono modelli di dati diversi dai database relazionali, adatti per
gestire dati non strutturati o semi-strutturati. Esempi includono MongoDB (database orientato ai
documenti), Cassandra (database a colonne larghe), Redis (database chiave-valore) e Neo4j (database
a grafo).

4 / 38
Forme normali

Operazioni Fondamentali (CRUD)


Le operazioni fondamentali che si possono eseguire su un database sono spesso riassunte con l'acronimo
CRUD:

Create (Insert): Aggiungere nuovi dati al database.


Read (Select): Recuperare dati esistenti dal database.
Update (Update): Modificare dati esistenti nel database.
Delete (Delete): Rimuovere dati dal database.

Vantaggi dei Database


Integrità dei Dati: I database assicurano che i dati siano accurati e coerenti.
Efficienza: I database permettono di accedere e manipolare grandi quantità di dati rapidamente.
Scalabilità: I database possono essere scalati per gestire quantità crescenti di dati e utenti.
Sicurezza: I database offrono meccanismi per proteggere i dati da accessi non autorizzati.
Condivisione dei Dati: I database permettono a più utenti e applicazioni di accedere e condividere i dati
contemporaneamente.

5 / 38
Forme normali

Deployment Diagram
Il Deployment diagram : è un diagramma UML (Unified Modeling Language) che mostra come i
componenti software sono distribuiti sui dispositivi hardware. I nodi (ambienti di esecuzione )
rappresentano le macchine fisiche o virtuali (come server, PC, smartphone), i componenti sono le parti
software installate su di essi (come applicazioni o database), e le connessioni indicano le comunicazioni tra
i nodi (come reti locali o Internet).
Serve a visualizzare l’architettura fisica del sistema e come interagiscono i suoi elementi.

DBMS (Database Management System) : è un software che permette di creare, gestire,


manipolare un db in modo sicuro ed efficace

6 / 38
Forme normali

ACID
Le proprietà ACID sono un insieme di caratteristiche che garantiscono l'affidabilità delle transazioni in un
database. ACID è un acronimo che sta per:

1. Atomicità (Atomicity):
La transazione è considerata un'unità indivisibile di lavoro.
Significa che o tutte le operazioni all'interno della transazione vengono completate con successo,
oppure, in caso di errore, l'intera transazione viene annullata (ROLLBACK).
In altre parole, non ci sono stati intermedi: la transazione è "tutto o niente".
2. Coerenza (Consistency):
Ogni transazione deve mantenere l'integrità del database.
Dopo il completamento di una transazione, il database deve passare da uno stato valido a un altro
stato valido.
La transazione deve rispettare tutte le regole e i vincoli definiti nel database (es: chiavi primarie,
chiavi esterne, vincoli di dominio).
3. Isolamento (Isolation):
Le transazioni devono essere eseguite in modo isolato l'una dall'altra.
Una transazione in corso non deve essere influenzata da altre transazioni concorrenti.
Questo significa che i risultati intermedi di una transazione non dovrebbero essere visibili ad altre
transazioni finché la prima non viene completata (COMMIT).
I livelli di isolamento (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ,
SERIALIZABLE) controllano il grado di isolamento tra le transazioni.
4. Durabilità (Durability):
Una volta che una transazione è stata completata con successo (COMMIT), le modifiche apportate al
database devono essere permanenti.
Queste modifiche devono sopravvivere a eventuali guasti del sistema (es: crash del server,
interruzioni di corrente).
Il database deve essere in grado di ripristinare lo stato delle transazioni completate anche in caso di
problemi.

7 / 38
Forme normali

MySQL
MySQL è un sistema di gestione di database relazionale (RDBMS) open-source. In termini più semplici, è un
software che ti permette di organizzare, archiviare e recuperare dati in modo efficiente.

Caratteristiche di MySQL:

Relazionale
Open-source
Client - Server
SQL language
Ampia diffusione

8 / 38
Forme normali

MongoDB
MongoDB è un database NoSQL orientato ai documenti. Invece di utilizzare tabelle e righe come i database
relazionali, MongoDB utilizza documenti e raccolte. Un documento è un insieme di coppie chiave-valore, e
una raccolta è un gruppo di documenti.

Caratteristiche principali:

Orientato ai documenti: I dati sono memorizzati in documenti flessibili, simili a JSON, che possono
variare in struttura.
Schema-less: Non è necessario definire uno schema rigido in anticipo. Questo permette una maggiore
flessibilità e velocità di sviluppo.
Scalabilità: MongoDB è progettato per essere scalabile orizzontalmente, distribuendo i dati su più
server.
Alte prestazioni: Grazie alla sua architettura e all'utilizzo di indici, MongoDB offre buone prestazioni per
una vasta gamma di carichi di lavoro.
Supporto per indici: È possibile creare indici per migliorare le prestazioni delle query.
Replica set: Supporta la replica dei dati per garantire l'alta disponibilità e la tolleranza ai guasti.

Concetti chiave:

Database: Un contenitore per le raccolte.


Collection (Raccolta): Un gruppo di documenti. È analoga a una tabella in un database relazionale.
Document (Documento): Un insieme di coppie chiave-valore. I documenti sono memorizzati in formato
BSON (Binary JSON).
Field (Campo): Una coppia chiave-valore in un documento.
_id: Un campo univoco che identifica ogni documento in una raccolta. MongoDB genera
automaticamente un valore per questo campo se non viene fornito.

Operazioni di base (CRUD):

Create (Crea): Inserire nuovi documenti in una raccolta.


Read (Leggi): Recuperare documenti da una raccolta.
Update (Aggiorna): Modificare documenti esistenti in una raccolta.
Delete (Elimina): Rimuovere documenti da una raccolta.

Esempio di documento:

{
"_id": ObjectId("64f..."),
"nome": "Mario",
"cognome": "Rossi",
"età": 30,
"indirizzo": {
"via": "Via Roma, 1",
"città": "Milano"
},
"interessi": ["programmazione", "sport"]
}

Vantaggi di MongoDB:

9 / 38
Forme normali

Flessibilità: Adatto per applicazioni con requisiti di dati in evoluzione.


Scalabilità: Gestisce grandi volumi di dati e traffico.
Facilità d'uso: La sintassi delle query è intuitiva.
Prestazioni: Ottime prestazioni per applicazioni di lettura e scrittura intensive.

Svantaggi di MongoDB:

Mancanza di transazioni ACID complete: Anche se MongoDB supporta transazioni ACID, non sono
complete come nei database relazionali.
Join complesse: Le join tra raccolte sono meno efficienti rispetto ai database relazionali.
Coerenza: La coerenza dei dati potrebbe essere un problema in alcuni scenari, a seconda del livello di
coerenza configurato.

Quando usare MongoDB:

Applicazioni web e mobile


Gestione di contenuti
Cataloghi di prodotti
Analisi dei dati in tempo reale
Internet of Things (IoT)

10 / 38
Forme normali

DCL
Il Data Control Language (DCL) è un sottolinguaggio di SQL utilizzato per controllare l'accesso ai dati nel
database. Si occupa principalmente di autorizzazioni, controllo degli accessi e gestione degli utenti.

Comprende i seguenti comandi:

GRANT: Utilizzato per concedere privilegi specifici a utenti o ruoli del database.
REVOKE: Utilizzato per revocare privilegi precedentemente concessi a utenti o ruoli del database.

Esempi
CREATE USER

1. Creazione di un nuovo utente con una password:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

Questo comando crea un nuovo utente chiamato 'newuser' che può connettersi solo da 'localhost'
e richiede la password 'password' .
2. Creazione di un nuovo utente senza specificare un host (può connettersi da qualsiasi host):

CREATE USER 'anotheruser'@'%' IDENTIFIED BY 'securepassword';

Questo comando crea un nuovo utente chiamato 'anotheruser' che può connettersi da qualsiasi host
e richiede la password 'securepassword' .

ALTER USER

1. Modifica della password di un utente:

ALTER USER 'newuser'@'localhost' IDENTIFIED BY 'newpassword';

Questo comando modifica la password dell'utente 'newuser' che si connette da 'localhost' in


'newpassword' .
2. Rinominare un utente (la sintassi può variare a seconda del DBMS):

RENAME USER 'olduser'@'localhost' TO 'newuser'@'localhost';

Questo comando rinomina l'utente 'olduser' in 'newuser' , mantenendo l'host 'localhost' . Nota:
Questo comando potrebbe non essere supportato da tutti i DBMS.

DROP USER

1. Eliminazione di un utente:

DROP USER 'newuser'@'localhost';

Questo comando elimina l'utente 'newuser' che si connette da 'localhost' .


2. Eliminazione di un utente che può connettersi da qualsiasi host:

DROP USER 'anotheruser'@'%';

11 / 38
Forme normali

Questo comando elimina l'utente 'anotheruser' che può connettersi da qualsiasi host.

GRANT

1. Concessione del privilegio di SELECT su una tabella a un utente:

GRANT SELECT ON Employees TO 'user1'@'localhost';

Questo comando concede all'utente 'user1' che si connette da 'localhost' il permesso di eseguire
query SELECT sulla tabella Employees .
2. Concessione di tutti i privilegi su un database a un utente:

GRANT ALL PRIVILEGES ON CompanyDB.* TO 'admin'@'%';

Questo comando concede all'utente 'admin' che si connette da qualsiasi host ( '%' ) tutti i privilegi sul
database CompanyDB e su tutte le sue tabelle.

REVOKE

1. Revoca del privilegio di INSERT su una tabella a un utente:

REVOKE INSERT ON Employees FROM 'user1'@'localhost';

Questo comando revoca all'utente 'user1' che si connette da 'localhost' il permesso di inserire dati
nella tabella Employees .
2. Revoca di tutti i privilegi su un database a un utente:

REVOKE ALL PRIVILEGES ON CompanyDB.* FROM 'admin'@'%';

Questo comando revoca all'utente 'admin' che si connette da qualsiasi host ( '%' ) tutti i privilegi sul
database CompanyDB e su tutte le sue tabelle.

12 / 38
Forme normali

DDL
Il Data Definition Language (DDL) è un sottolinguaggio di SQL che permette di modificare la struttura del
database.

Comprende i seguenti comandi e opzioni:

CREATE: Utilizzato per creare nuovi oggetti del database, come tabelle, viste, indici, stored procedure,
trigger e utenti.
ALTER: Permette di modificare la struttura di un oggetto esistente nel database. Si può usare per
aggiungere, eliminare o modificare colonne in una tabella, cambiare il tipo di dati di una colonna,
aggiungere o rimuovere vincoli, ecc.
DROP: Utilizzato per eliminare oggetti dal database, come tabelle, viste, indici, ecc. È un'operazione
irreversibile, quindi va usata con cautela.
TRUNCATE: Elimina tutti i dati da una tabella, ma mantiene la struttura della tabella stessa. È più veloce
di DELETE perché non registra le singole eliminazioni nel log delle transazioni.
RENAME: Permette di rinominare un oggetto del database.

Esempi
CREATE

1. Creazione di una tabella:

CREATE TABLE Employees (


ID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Department VARCHAR(50)
);

2. Creazione di un database:

CREATE DATABASE CompanyDB;

ALTER

1. Aggiunta di una colonna a una tabella:

ALTER TABLE Employees


ADD Salary DECIMAL(10, 2);

2. Modifica del tipo di dati di una colonna:

ALTER TABLE Employees


ALTER COLUMN Salary DECIMAL(12, 2);

DROP

1. Eliminazione di una tabella:

13 / 38
Forme normali

DROP TABLE Employees;

2. Eliminazione di un database:

DROP DATABASE CompanyDB;

TRUNCATE

1. Troncamento di una tabella (rimuove tutti i dati):

TRUNCATE TABLE Employees;

COMMENT

1. Aggiunta di un commento a una tabella:

COMMENT ON TABLE Employees IS 'Table to store employee information';

2. Aggiunta di un commento a una colonna:

COMMENT ON COLUMN [Link] IS 'Annual salary of the employee';

14 / 38
Forme normali

DML
Il Data Manipulation Language (DML) è un sottolinguaggio di SQL utilizzato per accedere e manipolare i
dati in un database.

Comprende i seguenti comandi:

INSERT: Utilizzato per inserire nuovi dati in una tabella.


UPDATE: Utilizzato per modificare i dati esistenti in una tabella.
DELETE: Utilizzato per eliminare righe da una tabella.
MERGE: Utilizzato per combinare operazioni di inserimento, aggiornamento ed eliminazione in un'unica
istruzione.

Esempi
INSERT

1. Inserimento di una nuova riga in una tabella:

INSERT INTO Employees (ID, FirstName, LastName, Department)


VALUES (1, 'John', 'Doe', 'Engineering');

2. Inserimento di più righe in una tabella:

INSERT INTO Employees (ID, FirstName, LastName, Department) VALUES


(2, 'Jane', 'Smith', 'Marketing'),
(3, 'Robert', 'Jones', 'Sales');

UPDATE

1. Aggiornamento di una colonna per una riga specifica:

UPDATE Employees
SET Salary = 60000
WHERE ID = 1;

2. Aggiornamento di più colonne per più righe:

UPDATE Employees
SET Salary = Salary * 1.10, Department = 'Management'
WHERE Department = 'Sales';

DELETE

1. Eliminazione di una riga specifica:

DELETE FROM Employees


WHERE ID = 3;

2. Eliminazione di tutte le righe da una tabella che soddisfano una condizione:

15 / 38
Forme normali

DELETE FROM Employees


WHERE Department = 'Marketing';

16 / 38
Forme normali

DQL-Group By
La clausola GROUP BY in SQL viene utilizzata per raggruppare righe che hanno gli stessi valori in una o più
colonne in un'unica riga di riepilogo. Viene spesso utilizzata in combinazione con le funzioni aggregate
(come COUNT() , SUM() , AVG() , MAX() , MIN() ) per calcolare statistiche per ciascun gruppo.

Sintassi
La sintassi di base della clausola GROUP BY è la seguente:

SELECT colonna1, colonna2, ...., funzione_aggregata(colonna)


FROM tabella
WHERE condizione
GROUP BY colonna1, colonna2, ....
HAVING condizione
ORDER BY colonna1, colonna2, .... ASC/DESC;

colonna1, colonna2, ... : Le colonne in base alle quali si desidera raggruppare i risultati.
funzione_aggregata(colonna) : Una funzione aggregata applicata a una colonna.
tabella : La tabella da cui si estraggono i dati.
WHERE condizione : (Opzionale) Una condizione per filtrare le righe prima del raggruppamento.
HAVING condizione : (Opzionale) Una condizione per filtrare le righe dopo il raggruppamento.
ORDER BY : (Opzionale) Specifica l'ordinamento dei risultati raggruppati.

Come Funziona
1. Selezione delle Righe: La clausola WHERE (se presente) filtra le righe della tabella in base alla
condizione specificata.
2. Raggruppamento: La clausola GROUP BY raggruppa le righe risultanti in base ai valori delle colonne
specificate. Tutte le righe con gli stessi valori nelle colonne di raggruppamento vengono combinate in un
unico gruppo.
3. Calcolo delle Funzioni Aggregate: Per ogni gruppo, vengono calcolate le funzioni aggregate
specificate nella clausola SELECT .
4. Restituzione dei Risultati: Viene restituita una riga per ogni gruppo, contenente i valori delle colonne di
raggruppamento e i risultati delle funzioni aggregate.

Esempi Pratici
1. Calcolare il numero di esami sostenuti da ogni studente

SELECT [Link], COUNT(e.ID_Esame) AS NumeroEsami


FROM Studenti s
LEFT JOIN Esami e ON s.ID_Studente = e.ID_Studente
GROUP BY [Link];

Spiegazione:

Questa query utilizza un LEFT JOIN per includere tutti gli studenti, anche quelli che non hanno
sostenuto alcun esame.
COUNT(e.ID_Esame) conta il numero di esami per ogni studente.
GROUP BY [Link] raggruppa i risultati per nome dello studente.

17 / 38
Forme normali

2. Trovare l'età media degli studenti che hanno ottenuto un voto superiore a
27

SELECT AVG([Link]) AS EtaMedia


FROM Studenti s
WHERE s.ID_Studente IN (SELECT DISTINCT ID_Studente FROM Esami WHERE Voto > 27);

Spiegazione:

La subquery SELECT DISTINCT ID_Studente FROM Esami WHERE Voto > 27 seleziona gli ID degli
studenti che hanno ottenuto un voto superiore a 27.
La query principale calcola l'età media degli studenti il cui ID è presente nel risultato della subquery.

3. Calcolare la media dei voti per ogni studente, mostrando solo quelli con
una media superiore a 27

SELECT [Link], AVG([Link]) AS MediaVoti


FROM Studenti s
JOIN Esami e ON s.ID_Studente = e.ID_Studente
GROUP BY [Link]
HAVING AVG([Link]) > 27;

Spiegazione:

JOIN Esami e ON s.ID_Studente = e.ID_Studente unisce le tabelle Studenti ed Esami.


GROUP BY [Link] raggruppa i risultati per nome dello studente.
AVG([Link]) calcola la media dei voti per ogni studente.
HAVING AVG([Link]) > 27 filtra i risultati, mostrando solo gli studenti con una media superiore a 27.

18 / 38
Forme normali

DQL-Subquery
1. Concetto di Chiusura
Definizione: In SQL, la proprietà di chiusura significa che il risultato di una query è sempre una tabella
(virtuale o meno). Questa tabella può essere utilizzata come input per altre query, incluse le subquery.
Esempio:

SELECT Nome
FROM (
SELECT Nome
FROM Studenti
WHERE Eta > 20
) AS StudentiMaggioriDi20;

2. Subquery
Le subquery sono query SQL nidificate all'interno di altre query. Il risultato della subquery viene utilizzato
dalla query principale.

Tipi di Subquery
Subquery Scalari: Restituiscono un singolo valore.
Subquery che restituiscono righe: Restituiscono una o più righe.
Subquery che restituiscono colonne: Restituiscono una o più colonne.

Utilizzo di EXISTS/ANY/ALL
EXISTS: Verifica se una subquery restituisce almeno una riga.
ANY: Confronta un valore con un insieme di valori restituiti da una subquery. La condizione è vera se
almeno uno dei confronti è vero.
ALL: Confronta un valore con tutti i valori restituiti da una subquery. La condizione è vera solo se tutti i
confronti sono veri.

Subquery Correlate vs. Non Correlate


Subquery Non Correlate: Possono essere eseguite indipendentemente dalla query principale.
Esempio:

SELECT Nome, Eta


FROM Studenti
WHERE Eta = (SELECT MAX(Eta) FROM Studenti);

Subquery Correlate: Fanno riferimento a colonne della query principale. Vengono eseguite
ripetutamente, una volta per ogni riga della query principale.
Esempio:

SELECT Nome
FROM Studenti s
WHERE EXISTS (
SELECT 1

19 / 38
Forme normali
FROM Esami e
WHERE e.ID_Studente = s.ID_Studente AND [Link] >= 28
);

CTE (Common Table Expression)


Anche se non sono propriamente subquery, le CTE agiscono in modo simile, definendo tabelle
temporanee riutilizzabili all'interno di una query.
Sintassi:

WITH NomeCTE AS (
SELECT Colonne
FROM Tabella
WHERE Condizioni
)
SELECT Colonne
FROM NomeCTE
WHERE AltreCondizioni;

Esempi Pratici
1. Studenti ed Esami

CREATE TABLE Studenti (


ID_Studente INT PRIMARY KEY,
Nome VARCHAR(100),
Eta INT
);

CREATE TABLE Esami (


ID_Esame INT,
ID_Studente INT,
Voto INT,
PRIMARY KEY(Id_Esame,ID_Studente),
FOREIGN KEY (ID_Studente) REFERENCES Studenti(ID_Studente)
);

INSERT INTO Studenti (ID_Studente, Nome, Eta)


VALUES
(101, 'Maria', 22),
(102, 'Giovanni', 23),
(103, 'Anna', 21);

INSERT INTO Esami (ID_Esame, ID_Studente, Voto)


VALUES
(1, 101, 28),
(1, 102, 30),
(2, 103, 25),
(2, 101, 27),
(2, 102, 27);

2. Vendite Prodotti

20 / 38
Forme normali

CREATE TABLE `vendite` (


`id` int(11) NOT NULL,
`prodotto` varchar(50) DEFAULT NULL,
`quantità` int(11) DEFAULT NULL,
`prezzo` decimal(5,2) DEFAULT NULL
) ENGINE=InnoDB;

INSERT INTO `vendite` (`id`, `prodotto`, `quantità`, `prezzo`)


VALUES
(1, 'mela', 10, 2.50),
(2, 'mela', 5, 1.50),
(3, 'banana', 8, 1.00),
(4, 'arancia', 7, 2.00),
(5, 'banana', 6, 1.00);

ALTER TABLE `vendite`


ADD PRIMARY KEY (`id`);

COMMIT;

Esempi di Query
Subquery nella clausola WHERE

SELECT Nome
FROM Studenti
WHERE ID_Studente IN (
SELECT ID_Studente
FROM Esami
WHERE Voto = (SELECT MAX(Voto) FROM Esami WHERE ID_Esame = 2)
);

Subquery nella clausola FROM

SELECT [Link], AVG([Link]) AS Media_Voti


FROM Studenti s INNER JOIN (
SELECT ID_Studente, Voto
FROM Esami
) e
ON s.ID_Studente = e.ID_Studente
GROUP BY [Link];

Subquery scalare

SELECT Nome, Eta


FROM Studenti
WHERE Eta = (SELECT MAX(Eta) FROM Studenti);

Subquery con ANY

SELECT Nome
FROM Studenti s
WHERE ID_Studente =

21 / 38
Forme normali
ANY ( SELECT ID_Studente FROM Esami WHERE Voto >
( SELECT AVG(Voto) FROM Esami ) );

Subquery con EXISTS

SELECT DISTINCT Prodotto


FROM Vendite v1
WHERE EXISTS (
SELECT 1
FROM Vendite v2
WHERE [Link] = [Link]
AND [Link] <> [Link]
);

Subquery con ALL

SELECT Prodotto
FROM Vendite
WHERE Prezzo > ALL (
SELECT Prezzo
FROM Vendite
WHERE Prodotto = 'mela'
);

CTE

WITH RicaviPerProdotto AS (
SELECT Prodotto, SUM(Quantità * Prezzo) AS TotaleRicavi
FROM Vendite
GROUP BY Prodotto
)
SELECT Prodotto
FROM RicaviPerProdotto
WHERE TotaleRicavi > 1000;

Quando Usare Subquery vs. JOIN


Subquery Correlate: Utili quando è necessario calcolare un valore aggregato per ogni riga della query
principale o quando si desidera verificare una condizione esistenziale.
JOIN: Generalmente più efficienti per operazioni su dataset grandi e quando si ha bisogno di accedere a
più colonne da entrambe le tabelle.

22 / 38
Forme normali

DQL
Il Data Query Language (DQL) è un sottolinguaggio di SQL utilizzato per interrogare e recuperare dati da
un database. Il comando principale del DQL è SELECT , che permette di specificare quali dati estrarre, da
quali tabelle e con quali condizioni.

Comandi DQL
SELECT: Utilizzato per recuperare dati da una o più tabelle.

Composizione di una Query DQL


Una query DQL tipica è composta dalle seguenti clausole:

SELECT: Elenca le colonne che si desidera visualizzare nel risultato della query.
FROM: Indica le tabelle da cui provengono i dati. È possibile specificare più tabelle per eseguire
operazioni di join.
WHERE: Filtra le righe in base a una o più condizioni. Le condizioni possono includere operatori logici
come AND , OR e NOT .

Ecco un esempio di struttura di una query DQL:

SELECT colonna1, colonna2, colonna3


FROM tabella1, tabella2, tabella3
WHERE condizione1 AND condizione2 OR condizione3;

Opzioni in "SELECT"
La clausola SELECT offre diverse opzioni per personalizzare la selezione dei dati:

DISTINCT : Seleziona solo valori univoci.


* o 1 : Seleziona tutte le colonne della tabella.
Funzioni aggregate
Alias ( AS ): Assegna un nome temporaneo a una colonna o a una tabella per semplificare la lettura dei
risultati.

Funzioni aggregate
Le funzioni aggregate permettono di eseguire calcoli su insiemi di righe e restituire un singolo valore. Alcune
delle funzioni aggregate più comuni includono:

COUNT() : Restituisce il numero di righe.


SUM() : Restituisce la somma dei valori di una colonna.
AVG() : Restituisce la media dei valori di una colonna.
MIN() : Restituisce il valore minimo di una colonna.
MAX() : Restituisce il valore massimo di una colonna.

Opzioni in "FROM"
La clausola FROM permette di specificare diverse opzioni per la selezione delle tabelle:

JOIN (INNER, LEFT, RIGHT, FULL): Combina righe da due o più tabelle in base a una condizione di join.
Ad esempio, un INNER JOIN restituisce solo le righe che hanno una corrispondenza in entrambe le
23 / 38
Forme normali

tabelle, mentre un LEFT JOIN restituisce tutte le righe dalla tabella a sinistra e le righe corrispondenti
dalla tabella a destra (e NULL se non c'è corrispondenza).
Alias ( AS ): Assegna un nome temporaneo a una tabella. Questo è utile per semplificare le query,
soprattutto quando si utilizzano nomi di tabella lunghi o quando si fa riferimento alla stessa tabella più
volte nella stessa query. Ad esempio: SELECT * FROM customers AS c WHERE [Link] = 'New York';
Subquery: Utilizza il risultato di un'altra query come tabella temporanea. Le subquery nella clausola
FROM devono avere un alias. Ad esempio: SELECT * FROM (SELECT id, name FROM products WHERE
price > 100) AS expensive_products;
Funzioni Table-Valued: Alcuni database supportano funzioni che restituiscono una tabella, che può
essere utilizzata nella clausola FROM .
WITH Clause (Common Table Expressions - CTE): Definisce una tabella temporanea che può essere
referenziata più volte all'interno della query. Le CTE sono utili per semplificare query complesse e
migliorare la leggibilità. Ad esempio:

WITH
HighValueOrders AS (
SELECT order_id, customer_id
FROM orders
WHERE total_amount > 1000
)
SELECT
c.customer_name,
COUNT(hvo.order_id) AS high_value_order_count
FROM
customers c
JOIN
HighValueOrders hvo ON c.customer_id = hvo.customer_id
GROUP BY
c.customer_name
ORDER BY
high_value_order_count DESC;

Queste opzioni offrono flessibilità e potenza nella costruzione di query SQL complesse, permettendo di
manipolare e combinare dati da diverse fonti in modo efficace.

JOIN
Le "join" sono operazioni che combinano righe da due o più tabelle in un database basandosi su una
colonna correlata tra di loro. Immagina di avere due tabelle, una con informazioni sui clienti e un'altra con
informazioni sugli ordini. Puoi usare una join per combinare queste tabelle e ottenere un elenco di tutti i
clienti con i loro ordini corrispondenti.

Esistono diversi tipi di join, ognuno con un comportamento specifico:

1. INNER JOIN (Unione Interna):


Restituisce solo le righe in cui c'è una corrispondenza tra le tabelle.
2. LEFT JOIN (o LEFT OUTER JOIN) (Unione Sinistra):
Restituisce tutte le righe dalla tabella di sinistra (la prima tabella menzionata nella query) e le righe
corrispondenti dalla tabella di destra.
3. RIGHT JOIN (o RIGHT OUTER JOIN) (Unione Destra):
Simile alla LEFT JOIN , ma inverte le tabelle. Restituisce tutte le righe dalla tabella di destra e le
righe corrispondenti dalla tabella di sinistra.

24 / 38
Forme normali

4. FULL JOIN (o FULL OUTER JOIN) (Unione Completa):


Restituisce tutte le righe da entrambe le tabelle.
5. CROSS JOIN (Unione Cartesiana):
Restituisce il prodotto cartesiano delle righe delle due tabelle.
Ogni riga della prima tabella viene combinata con ogni riga della seconda tabella.

Sintassi di base (esempio in SQL):

SELECT *
FROM tabella1
JOIN tabella2
ON tabella1.colonna_fk = [Link];

SELECT * : Seleziona tutte le colonne.


FROM tabella1 : Specifica la prima tabella.
JOIN tabella2 : Specifica il tipo di join e la seconda tabella.
ON tabella1.colonna_fk = [Link] : Specifica la clausola di join, cioè la colonna che collega le
due tabelle.

Sintassi di base per la INNER JOIN implicita

SELECT *
FROM tabella1 t1, tabella2 t2
WHERE t1.colonna_fk = [Link];

SELECT * : Seleziona tutte le colonne.


FROM tabella t1, tabella2 t2 : Specifica le tabelle.
WHERE t1.colonna_fk = [Link] : Specifica la clausola di join, cioè la colonna che collega le due tabelle.

Opzioni in "WHERE e HAVING"

Tipo Operatore / Funzione Descrizione


Confronto base = Uguale a
!= , <> Diverso da
> Maggiore di
< Minore di
>= Maggiore o uguale a
<= Minore o uguale a
Confronti multipli IN (val1, val2, ...) Verifica se il valore è in un insieme
NOT IN (val1, val2, ...) Verifica se il valore non è in un insieme
Intervalli BETWEEN val1 AND val2 Compreso tra due valori inclusivi
NOT BETWEEN val1 AND val2 Non compreso tra due valori inclusivi
Pattern matching LIKE 'pattern' Confronto con caratteri jolly ( % , _ )
NOT LIKE 'pattern' Contrario del precedente
Valori nulli IS NULL Il valore è NULL
IS NOT NULL Il valore non è NULL
Logici AND Tutte le condizioni devono essere vere

25 / 38
Forme normali

Tipo Operatore / Funzione Descrizione


OR Almeno una condizione deve essere vera
NOT Negazione di una condizione
Esistenza EXISTS (subquery) Vero se la subquery restituisce righe
NOT EXISTS (subquery) Vero se la subquery non restituisce righe
Quantificatori ALL Tutte le righe devono soddisfare la condizione
( > ALL (subquery) )
ANY , SOME Almeno una riga soddisfa la condizione ( = ANY
(subquery) )

Aggregazioni COUNT() , SUM() , AVG() , Usati con HAVING per filtrare gruppi aggregati
(HAVING) MIN() , MAX()

Alias & espressioni HAVING alias > valore Può usare alias di colonne calcolate nel
SELECT , se supportato

Funzioni stringa LENGTH(col) , UPPER(col) Filtri basati su manipolazioni di stringhe


ecc.
Funzioni data/ora YEAR(col) , DATE(col) , Per confronti su campi di tipo data
NOW()

Gestione delle date in MySQLLa gestione delle date nella clausola WHERE
richiede un'attenzione particolare, poiché i formati delle date possono
variare a seconda del sistema di database utilizzato.
Formati Data:

Ogni database (MySQL, PostgreSQL, SQL Server, Oracle, ecc.) ha i suoi formati di data predefiniti. Alcuni
formati comuni includono:

YYYY-MM-DD (ISO 8601)


MM/DD/YYYY
DD/MM/YYYY

È importante conoscere il formato di data utilizzato dal tuo database per evitare errori.

Funzioni Data:

Categoria Funzione / Sintassi Descrizione


Date correnti NOW() Data e ora corrente (es: 2025-06-11
14:30:00 )

CURDATE() Solo la data corrente (es: 2025-06-11 )


CURTIME() Solo l'ora corrente (es: 14:30:00 )
Estrazione YEAR(data) , MONTH(data) , Estrae rispettivamente anno, mese, giorno
DAY(data)

HOUR(data) , MINUTE(data) , Estrae rispettivamente ora, minuti, secondi


SECOND(data)

DAYNAME(data) , MONTHNAME(data) Nome del giorno o del mese (es: Monday ,


June )
WEEK(data) , QUARTER(data) Numero della settimana o del trimestre
DAYOFWEEK(data) Ritorna il numero del giorno della settimana
(1=Sunday)
26 / 38
Forme normali

Categoria Funzione / Sintassi Descrizione


DAYOFYEAR(data) Giorno dell'anno (1-366)
Formattazione DATE_FORMAT(data, '%d/%m/%Y') Restituisce la data formattata secondo il
pattern indicato
TIME_FORMAT(ora, '%H:%i') Formatta l’orario
Conversione STR_TO_DATE(stringa, formato) Converte stringa in data secondo il formato
DATE(data_ora) Estrae solo la parte data
TIME(data_ora) Estrae solo la parte ora
CAST(... AS DATE) Converte a tipo DATE
Operazioni data + INTERVAL n unità Aggiunge intervallo a una data (es: +
INTERVAL 7 DAY )
data - INTERVAL n unità Sottrae intervallo da una data
DATEDIFF(data1, data2) Differenza in giorni tra due date
TIMESTAMPDIFF(unit, data1, data2) Differenza in una specifica unità ( SECOND ,
MINUTE , DAY , MONTH , YEAR , ecc.)

ADDDATE(data, INTERVAL n unità) Aggiunge un intervallo alla data


SUBDATE(data, INTERVAL n unità) Sottrae un intervallo dalla data
Composizione MAKEDATE(anno, giornoAnno) Crea una data dall’anno e giorno dell’anno
MAKETIME(ora, minuto, secondo) Crea un orario
TIMESTAMP(data, ora) Combina una data e un orario in un datetime
Confronti date WHERE data = '2025-06-11' Confronto diretto
WHERE data BETWEEN '2025-01-01' Intervallo di date
AND '2025-12-31'

WHERE DATE(data_ora) = CURDATE() Confronto ignorando l'orario

27 / 38
Forme normali

DTL
Il Data Transaction Language (DTL) è un sottolinguaggio di SQL utilizzato per gestire le transazioni
all'interno di un database. Le transazioni sono sequenze di operazioni che vengono trattate come un'unica
unità logica di lavoro. L'obiettivo principale del DTL è garantire l'integrità dei dati, assicurando che le
transazioni siano eseguite in modo affidabile e coerente.

Comprende i seguenti comandi:

BEGIN TRANSACTION (o START TRANSACTION): Inizia una nuova transazione.


COMMIT: Salva in modo permanente tutte le modifiche apportate durante la transazione nel database.
ROLLBACK: Annulla tutte le modifiche apportate durante la transazione, riportando il database allo stato
precedente all'inizio della transazione.
SAVEPOINT: Crea un punto di salvataggio all'interno di una transazione, consentendo di annullare solo
una parte della transazione fino a quel punto.

Esempi
BEGIN TRANSACTION (o START TRANSACTION)

1. Inizio di una transazione:

BEGIN TRANSACTION;
-- oppure
START TRANSACTION;

Questo comando indica l'inizio di una nuova transazione. Tutte le operazioni successive verranno
considerate parte di questa transazione fino a quando non verrà eseguito un COMMIT o un ROLLBACK .

COMMIT

1. Conferma delle modifiche:

BEGIN TRANSACTION;

UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;


UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 2;

COMMIT;

Questo esempio trasferisce 100 unità dall'account con AccountID = 1 all'account con AccountID = 2 .
Il comando COMMIT salva in modo permanente queste modifiche nel database. Se non ci fossero stati
errori, le modifiche sarebbero state definitive.

ROLLBACK

1. Annullamento delle modifiche:

BEGIN TRANSACTION;

UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;


UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 2;

28 / 38
Forme normali

ROLLBACK;

In questo esempio, se si verificasse un errore durante l'esecuzione degli aggiornamenti (ad esempio, un
vincolo di integrità violato), il comando ROLLBACK annullerebbe tutte le modifiche, riportando gli account
al loro stato originale.

SAVEPOINT

1. Utilizzo di SAVEPOINT per annullare solo una parte di una transazione:

BEGIN TRANSACTION;

UPDATE Accounts SET Balance = Balance - 50 WHERE AccountID = 3;


SAVEPOINT sp1;

UPDATE Accounts SET Balance = Balance + 50 WHERE AccountID = 4;


SAVEPOINT sp2;

-- Si decide di annullare le modifiche a partire da sp2


ROLLBACK TO SAVEPOINT sp2;

COMMIT;

In questo esempio, vengono creati due punti di salvataggio ( sp1 e sp2 ). Se si decide di annullare le
modifiche a partire da sp2 , il comando ROLLBACK TO SAVEPOINT sp2 annullerà solo l'ultimo
aggiornamento, riportando l'account 4 al suo stato precedente, ma manterrà la modifica all'account 3. Il
comando COMMIT salverà quindi la modifica all'account 3.

29 / 38
Forme normali

SQL language
SQL, acronimo di Structured Query Language, è il linguaggio standard per interagire con i database
relazionali (usato anche da MySQL). SQL è il linguaggio usato per chiedere informazioni, aggiungere nuovi
dati, modificare quelli esistenti e gestire l'intera struttura dell'archivio.
SQL si divide in diversi "sottolinguaggi" a sua volta:

DDL (Database Definition Language): linguaggio che si occupa della struttura del database.
DML (Database Manipulation Language): linguaggio che si occupa della manipolazione dei dati del
database.
DQL (Database Query Language): linguaggio che si occupa delle richieste (query) al database.
DCL (Database Control Language): linguaggio che si occupa della gestione utenti che hanno accesso
al database.
DTL (Database Transaction Language): linguaggio che si occupa delle transazioni sul database.

Connessione in php
Per connettersi al database in php con sql bisogna fare i seguenti passaggi:

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "nome_db";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

Per gestire il database manipolando i suoi dati abbiamo due opzioni:

1. Maniera diretta:

$sql = "SELECT id, firstname, lastname FROM MyGuests";


$result = $conn->query($sql);

if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " .
$row["lastname"]. "<br>";
}
} else {
echo "0 results";
}
$conn->close();

2. Prepared statement:

30 / 38
Forme normali

$id = 1

// Stabilisci la query da inviare al database (esempio)


$query = "SELECT * FROM table WHERE id = ?";

$stmt = $conn->prepare($query);

// Se la query contiene degli input, inserisci un placeholder con il "?"


// Poi utilizza la funzione bind_param indicando il tipo di input per ogni ?
$stmt->bind_param("i", $id);
// Eseguo la query
$stmt->execute();
$result_array = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);

L'utilizzo dei prepared statement è consigliato per prevenire attacchi di SQL injection, in quanto i dati
vengono trattati separatamente dalla query, evitando che codice malevolo possa essere iniettato. Inoltre, i
prepared statement possono migliorare le performance, soprattutto in caso di query ripetute con parametri
diversi, in quanto la query viene compilata una sola volta.

31 / 38
Forme normali

Seconda prova - steps


Per affrontare con successo la prova di informatica, è fondamentale la concentrazione. Un errore nell'analisi
iniziale può compromettere l'intero compito. Dedica quindi tempo alla fase di analisi, valutando il problema
da diverse angolazioni. Una buona analisi è la base per un compito corretto.

Indice: Crea un indice nella prima pagina che rimandi alle singole richieste del testo.

Step Fondamentali (da seguire sempre):

1. Analisi del Problema

Scomposizione: Identifica come scomporre il problema principale in sottoproblemi più gestibili.


Elaborazione, non ripetizione: Non limitarti a riscrivere il testo. Rielabora il problema con le tue parole,
aggiungendo ipotesi e interpretazioni personali sui punti poco chiari.
Ipotesi: Formula ipotesi aggiuntive per dare valore e concretezza alle tue scelte progettuali.
Descrizione della realtà: Descrivi il contesto del problema usando termini diversi da quelli del testo
originale.
Diagramma dei casi d'uso: Rappresenta graficamente i casi d'uso principali del sistema e gli attori
coinvolti. Descrivi ogni caso d'uso con un breve testo esplicativo.
Architettura del sistema: Descrivi l'architettura del sistema proposto, identificando i componenti
hardware e software. Per un'applicazione web a livelli, specifica i nodi Client, Server e DB Server e i
relativi componenti (Browser, Web Server, DBMS). Un diagramma di deployment può arricchire questa
descrizione.
Interfaccia utente: Progetta l'interfaccia utente disegnando lo schema di navigazione tra le videate e
specificando i dettagli dei singoli campi.
Aspetti chiave: Considera accessibilità, usabilità, responsività e sicurezza del sistema.
Criticità e soluzioni: Individua le parti più critiche del problema e proponi soluzioni adeguate.
Ampliamento del problema: Se necessario, amplia il problema con ipotesi aggiuntive.

2. Analisi dei Dati

Identifica entità, attributi e relazioni, motivando accuratamente le tue scelte. Questo è particolarmente
importante in sede d'esame.

3. Modello E/R (Modello Concettuale)

Ambito: L'ambito generale del problema non deve essere considerato un'entità.
Diagramma: Disegna il modello E/R completo, indicando i versi delle associazioni.
Descrizione: Descrivi ogni entità e ogni attributo, specificando valori di default, range di valori, ecc.
Regole di lettura: Descrivi ogni relazione, aggiungendo le regole di lettura per validarne la correttezza.
Verifica: Dopo aver completato il modello E/R, rileggi il testo e le interrogazioni richieste per verificare
che ogni dato necessario sia presente come attributo di un'entità.

4. Creazione Tabelle (Modello Logico)

Derivazione: Definisci le tabelle utilizzando le regole di derivazione standard.


Normalizzazione: Assicurati che ogni tabella rispetti le tre forme normali.
Schema: Descrivi le caratteristiche di ciascuna tabella con uno schema dettagliato:
tabella | campo | chiave | formato | dimensione | null/not null | default | foreign key`

5. Interrogazioni SQL (se richieste)

32 / 38
Forme normali

Implementa le interrogazioni SQL richieste utilizzando i comandi standard. Cerca di identificare


opportunità per utilizzare interrogazioni nidificate.

6. Implementazione PHP (se richiesta)

Implementa solo alcune procedure, scegliendo il linguaggio che conosci meglio.


Il codice deve essere ben indentato e commentato nei punti meno ovvi.

7. Realizzazione Pagina Web (se richiesta)

Implementa una semplice pagina web richiesta dalla traccia utilizzando HTML, CSS e JavaScript.

Modellazione dei Dati: Regole Chiave

1. Lettura Attenta: Leggi attentamente il testo più volte prima di definire il modello dei dati.
2. Ambito: L'ambito del problema non è un'entità.
3. Regole Generali: Sostantivi = entità, aggettivi/proprietà = attributi, verbi = associazioni.
4. Output: Considera attentamente le richieste di output e le interrogazioni per determinare gli attributi
necessari.
5. Normalizzazione: Attributi descrittivi ripetuti devono diventare entità separate (es: Comuni, causali,
tipologie) con una relazione 1:N. Queste diventeranno tabelle di decodifica (codice, descrizione).
6. Motivazione: Motiva le tue scelte, evidenziando ipotesi aggiuntive e vincoli introdotti.
7. Entità Dinamiche: Le entità dinamiche (movimenti) hanno una data di registrazione e possono avere
una chiave autoincrementale (ID).
8. Verifica Finale: Dopo aver disegnato il modello E/R, rileggilo e usa le regole di lettura per controllare la
correttezza.

Derivazione delle Tabelle: Regole Fondamentali

1. Regole di Derivazione: Applica le regole di derivazione con rigore.


2. Associazioni 1:1: Un'associazione 1:1 diventa un'unica tabella o una tabella con chiave esterna
(unique) su un'altra.
3. Associazioni 1:N: Un'associazione 1:N comporta una chiave esterna nella tabella dalla parte di N.
4. Associazioni M:N: Un'associazione M:N comporta due chiavi esterne in una terza tabella derivata.

Descrizione dei Dati: Dettagli Importanti

1. Tipi di Dato: I campi non usati in calcoli sono di tipo testo (stringa) (es: telefono, partita IVA, CAP).
2. Esempi: Fornisci esempi di dati per ciascuna tabella per facilitare la comprensione.
3. Regole di Lettura: Esplicita le regole di lettura per ogni relazione.

Interrogazioni SQL: Ottimizzazione e Best Practices

1. Ottimizzazione: Ottimizza le query per usare il minor numero di tabelle possibile.


2. Funzioni di Aggregazione: Se usi funzioni di aggregazione (COUNT, SUM, AVG), quasi sempre è
necessario un GROUP BY .
3. SELECT e GROUP BY: Gli attributi in SELECT devono essere in GROUP BY (e viceversa), a meno che
non siano argomenti di funzioni di aggregazione.
4. HAVING e GROUP BY: Se c'è HAVING , ci deve essere GROUP BY .
5. HAVING: In HAVING ci sono condizioni con funzioni di aggregazione.
6. WHERE e HAVING: In HAVING non ci possono essere condizioni sulle singole righe; queste vanno in
WHERE . In WHERE non ci possono essere condizioni con funzioni di aggregazione.

33 / 38
Forme normali

Note Generali

Tempo: La prova dura 6 ore. Scrivi in modo chiaro e ordinato, con caratteri leggibili.
Schemi: Utilizza schemi per organizzare le informazioni.
Suddivisione: Suddividi il lavoro in fasi.

34 / 38
Forme normali

Viste
Le viste in SQL sono tabelle virtuali basate sul risultato di una query. A differenza delle tabelle normali, le
viste non memorizzano fisicamente i dati, ma agiscono come una "finestra" attraverso cui è possibile
accedere ai dati provenienti da una o più tabelle sottostanti.

A cosa servono le viste?

Tipi di viste

Esistono diversi tipi di viste, tra cui:

Viste semplici: Basate su una singola tabella e non contengono funzioni di aggregazione o
raggruppamenti.
Viste complesse: Basate su più tabelle, possono contenere join, funzioni di aggregazione,
raggruppamenti e altre operazioni complesse.
Viste materializzate: (Non supportate da tutti i DBMS) Memorizzano fisicamente i dati risultanti dalla
query, migliorando le prestazioni ma richiedendo un aggiornamento periodico.

Sintassi per creare una vista

La sintassi generale per creare una vista in SQL è la seguente:

CREATE VIEW nome_vista AS


SELECT colonna1, colonna2, ...
FROM tabella1
WHERE condizione;

nome_vista : Il nome univoco della vista.


SELECT ... FROM ... WHERE ... : La query che definisce la vista.

Esempio pratico

Supponiamo di avere un database con due tabelle: clienti e ordini . Vogliamo creare una vista che
mostri il nome del cliente e il numero di ordini effettuati da ciascun cliente.

CREATE TABLE clienti (


id_cliente INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(50),
citta VARCHAR(50)
);

CREATE TABLE ordini (


id_ordine INT PRIMARY KEY AUTO_INCREMENT,
id_cliente INT,
data_ordine DATE,
importo DECIMAL(10, 2),
FOREIGN KEY (id_cliente) REFERENCES clienti(id_cliente)
);

CREATE VIEW clienti_ordini AS


SELECT [Link], COUNT(o.id_ordine) AS numero_ordini
FROM clienti c

35 / 38
Forme normali
LEFT JOIN ordini o ON c.id_cliente = o.id_cliente
GROUP BY [Link];

In questo esempio:

La vista si chiama clienti_ordini .


La query seleziona il nome del cliente dalla tabella clienti e conta il numero di ordini dalla tabella
ordini , raggruppando i risultati per nome del cliente.
La vista può essere interrogata come una tabella normale:

SELECT * FROM clienti_ordini;

Vantaggi delle viste

Semplicità: Le viste semplificano le query complesse, rendendo più facile l'accesso ai dati.
Sicurezza: Le viste consentono di limitare l'accesso ai dati, proteggendo le informazioni sensibili.
Flessibilità: Le viste possono essere modificate senza influire sulle applicazioni che le utilizzano.
Consistenza: Le viste garantiscono che i dati siano presentati in modo coerente, indipendentemente
dalla complessità dello schema sottostante.

Svantaggi delle viste

Prestazioni: Le viste complesse possono influire sulle prestazioni delle query, in quanto il database deve
eseguire la query sottostante ogni volta che la vista viene interrogata.
Aggiornabilità: Non tutte le viste sono aggiornabili. Le viste che coinvolgono join, aggregazioni o altre
operazioni complesse potrebbero non essere modificabili direttamente.

36 / 38
Forme normali

Trigger
I trigger in MySQL sono blocchi di codice SQL che vengono eseguiti automaticamente in risposta a
determinati eventi che si verificano su una tabella. Sono simili a "listener" o "event handler" che monitorano
le operazioni sul database e scatenano un'azione specifica quando si verifica un evento predefinito.

Tipi di trigger

I trigger in MySQL possono essere classificati in base a diversi criteri:

Tempistica (Timing):
BEFORE : Il trigger viene eseguito prima che l'evento si verifichi (es: prima di un inserimento).
AFTER : Il trigger viene eseguito dopo che l'evento si è verificato (es: dopo un aggiornamento).
Evento (Event):
INSERT : Il trigger viene eseguito quando viene inserita una nuova riga nella tabella.
UPDATE : Il trigger viene eseguito quando una riga esistente viene modificata.
DELETE : Il trigger viene eseguito quando una riga viene eliminata.

Combinando tempistica ed evento, si ottengono 6 tipi di trigger:

BEFORE INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE

Sintassi per creare un trigger

La sintassi generale per creare un trigger in MySQL è la seguente:

CREATE TRIGGER nome_trigger


{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON nome_tabella
FOR EACH ROW
BEGIN
-- Codice SQL del trigger
END;

nome_trigger : Il nome univoco del trigger.


BEFORE | AFTER : Specifica quando il trigger deve essere eseguito.
INSERT | UPDATE | DELETE : Specifica l'evento che scatena il trigger.
nome_tabella : La tabella a cui è associato il trigger.
FOR EACH ROW : Indica che il trigger viene eseguito per ogni riga interessata dall'evento.
BEGIN ... END : Delimita il blocco di codice SQL che costituisce il corpo del trigger.

Parole chiave NEW e OLD

All'interno del codice del trigger, è possibile accedere ai valori delle righe interessate dall'evento tramite le
parole chiave NEW e OLD :

NEW : Contiene i valori della nuova riga (per INSERT e UPDATE ).

37 / 38
Forme normali

OLD : Contiene i valori della riga prima della modifica (per UPDATE e DELETE ).

Esempio pratico

Supponiamo di avere una tabella ordini con le colonne id_ordine , data_ordine e importo . Vogliamo
creare un trigger che aggiorni automaticamente una tabella di log ( log_ordini ) ogni volta che viene inserito
un nuovo ordine.

CREATE TABLE ordini (


id_ordine INT PRIMARY KEY AUTO_INCREMENT,
data_ordine DATE,
importo DECIMAL(10, 2)
);

CREATE TABLE log_ordini (


id_log INT PRIMARY KEY AUTO_INCREMENT,
id_ordine INT,
data_inserimento TIMESTAMP
);

CREATE TRIGGER after_ordine_insert


AFTER INSERT
ON ordini
FOR EACH ROW
BEGIN
INSERT INTO log_ordini (id_ordine, data_inserimento)
VALUES (NEW.id_ordine, NOW());
END;

In questo esempio:

Il trigger si chiama after_ordine_insert .


Viene eseguito AFTER un evento INSERT sulla tabella ordini .
Per ogni nuova riga inserita, il trigger inserisce una riga nella tabella log_ordini con l'ID dell'ordine e la
data di inserimento.

Limitazioni dei trigger

I trigger possono influire sulle prestazioni del database, soprattutto se contengono codice complesso.
È importante testare accuratamente i trigger per evitare effetti collaterali indesiderati.
I trigger possono rendere più difficile la manutenzione del database, in quanto la logica di business è
distribuita tra le tabelle e i trigger.

38 / 38

Potrebbero piacerti anche