Teoria ricerca dati in database

Classificato in Informatica

Scritto il in italiano con una dimensione di 33,52 KB

Svolgimento traccia
La traccia chiede di realizzare un sito per la gestione dei libri di una biblioteca di una piccola scuola.
Database
Si procede alla realizzazione partendo dalla progettazione del database. Per la progettazione si prevede di partire dal progetto concettuale, che modella la realtà di riferimento attraverso lo schema E/R (Entity/Relationship).
Successivamente, a partire dal modello concettuale si deriva il modello logico dei dati, seguendo lo schema dei database relazionali, che si è affermato nel tempo come il miglior modello in termini di flessibilità ed efficienza per la memorizzazione di dati strutturati, come nel caso in esame.
La traccia richiede di memorizzare per ogni libro il codice, l'autore, la casa editrice, l'ISBN, il genere e l'immagine di copertina. Poiché il focus della traccia viene posto sulla realizzazione del sito web e le operazioni richieste sui dati sono di immediata realizzazione, si modella la realtà di riferimento - secondo il modello E/R (Entity/Relationship) - con una sola entità, libri. Tale entità è caratterizzata dai seguenti attributi autoesplicativi: codice_libro, titolo, autore, casa_editrice, codice_ISBN, genere, copertina. Il codice_libro (chiave primaria ) , poiché richiesto dalla traccia, sarà l'attributo chiave che identifica univocamente ogni libro. Secondo il modello logico, l'entità "libri" diventerà una tabella SQL che possiamo creare come di seguito con il linguaggio DDL (Data Definition Language).
1. SCHEMA CONCETTUALE 1 a N o N a N o 1 a 1 
2. LINGUAGGIO DELLE TABELLE - esempio: ogni insegnante può insegnare in uno o più corsi. Ogni corso deve essere insegnato da un solo insegnante 1-N 
ogni studente partecipa a uno o più corsi. Ogni corso può partecipare uno o più studenti.  N - N 
3. SCHEMA LOGICO ESEMPIO : 
Studenti( IDstudente, codicefiscale, nome, cognome, datadinascita, telefono, e-mail, password
Corsi (idcorso, argomento, numore, costo, idstudente) 
-Creazione tabella in SQL : 4. SCHEMA SQL 

CREATE TABLE libri (
codice_libro integer primary key AUTO_INCREMENT,
titolo VARCHAR(255) NOT NULL,
autore VARCHAR(255) NOT NULL,
casa_editrice VARCHAR(255) NOT NULL,
codice_ ISBN CHAR (13) UNIQUE,
genere VARCHAR (255) NOT NULL, immagine_copertina VARCHAR (255) ) ;

Nella tabella "libri", ogni riga rappresenterà un libro e le colonne conterranno le informazioni specifiche per ogni libro.
Ciascun attributo è obbligatorio e dunque caratterizzato dalla parola chiave NOT NULL. Fa eccezione l'attributo "copertina", poiché in fase di inserimento dei record potrebbe non essere disponibile l'immagine corrispondente.
Di seguito una spiegazione degli attributi: 
- codice_ libro: Un numero univoco che identifica il libro. È impostato come chiave primaria per garantire l'univocità. Si utilizza anche la parola chiave AUTO_INCREMENT per permettere al sistema di incrementare automaticamente il valore chiave di tipo intero.
- titolo: Il titolo del libro, di tipo stringa con un numero massimo di caratteri pari a 255
- autore: Il nome dell'autore del libro, di tipo stringa con un numero massimo di caratteri pari a 255
- casa_editrice: Il nome della casa editrice che ha pubblicato il libro, di tipo stringa con un numero massimo di caratteri pari a 255
- codice_ ISBN: Il codice ISBN (International Standard Book Number) del libro, che identifica univocamente l'edizione di un libro (attributo UNIQUE), di tipo stringa esattamente pari a 13 caratteri.
- genere: Il genere a cui appartiene il libro (es. Romanzi, fantascienza, biografie, ecc.), di tipo stringa con un numero massimo di caratteri pari a 255
- immagine_copertina: Il percorso relativo dell'immagine di copertina del libro, di tipo stringa con un numero massimo di caratteri pari a 255.
5. QUERY 
6. Interfaccia Web
Successivamente si procede alla progettazione dell'interfaccia Web, seguendo le specifiche fornite dalla traccia. Di seguito viene riportato il codice HTML che rappresenta la struttura base della home page per un'applicazione di "Gestione Libri".
<! DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Gestione Libri - Home</title>
<link rel="stylesheet" href="style.Css">
</head>
<body>
<header>
<h1>Gestione Libri</h1>
<nav>
<a href="index. php">Home</a> |
<a href="amministrazione.Php">Amministrazione</a> |
<a href="login.Php"> Login</a> |
</nav>
</header>
<main>
</main>
< footer>
<p>© 2024 Gestione Libri. Tutti i diritti riservati. ‹/p>
</footer>
</body>


Il documento HTML inizia con la dichiarazione < DOCTYPE html>, che indica che il documento è scritto in HTML5.
La sezione <head> contiene le informazioni di intestazione del documento. Qui troviamo il titolo della pagina specificato nel tag <title>, che appare come "Gestione Libri - Home" nella barra del titolo del browser. Inoltre, vi è il tag <link rel="stylesheet" href="style.Css"> che collega il file CSS esterno "style.Css" al documento HTML per applicare uno stile grafico alla pagina. C'è anche un tag <meta> per impostare l'encoding dei caratteri su UTF-8, che supporta la maggior parte dei caratteri internazionali.
All'interno del tag <body>, troviamo il contenuto visibile della pagina. La sezione di intestazione (<header>) contiene il titolo principale della pagina, "Gestione Libri", rappresentato dal tag <h1>. All'interno dell'intestazione, c'è anche una sezione di navigazione (<nav>) che contiene una serie di link (<a>) per le diverse sezioni del sito, come "Home", "Amministrazione" e "Login". Questi elementi <a> rappresentano i link di navigazione. L'attributo href specifica l'URL di destinazione dei link. Il tag <main> rappresenta la sezione principale del contenuto della pagina. Attualmente è vuoto nel codice fornito, ma è qui che verranno inseriti altri elementi e contenuti specifici dell'applicazione di "Gestione Libri". Il piè di pagina (<footer>) contiene un paragrafo (<p>) che indica l'anno corrente e i diritti d'autore per l'applicazione di "Gestione Libri".
Questo codice HTML fornisce una struttura di base per il sito di "Gestione Libri"', inclusi il titolo, la navigazione, il contenuto principale e il piè di pagina. 

Interazione con il database
All'interno del tag < main>, come richiesto dalla traccia, si dovrà visualizzare l'elenco dei libri ordinati per genere. A tal fine l'utilizzo di HTML non è sufficiente, poiché essendo un linguaggio di markup non consente alla pagina di interagire programmaticamente. Dunque, è necessario utilizzare un linguaggio di programmazione lato server, come ad esempio PHP. Ci sono diverse ragioni per considerare l'utilizzo di PHP rispetto ad altri linguaggi di programmazione per lo sviluppo web. Innanzitutto consideriamo la facilità di apprendimento: PHP è noto per essere relativamente facile da imparare e la sintassi è simile a quella di altri linguaggi di programmazione. PHP è stato progettato specificamente per lo sviluppo web e l'interazione con i database: offre funzioni integrate per la gestione dei form, l'elaborazione delle richieste HTTP, la gestione delle sessioni e altre operazioni comuni nel contesto web. Inoltre, è molto diffuso: è supportato da una vasta comunità di sviluppatori e ha una vasta base di utenti, il che significa che si possono trovare molte risorse, tutorial e supporto online per lo sviluppo. Infine, è un linguaggio allo stato dell'arte, il che vuol dire che è compatibile con la maggior parte dei server web che si utilizzano in produzione (come ad esempio Apache) e con la maggior parte di piattaforme, tra cui Windows, Linux e macOS.
Nel nostro progetto utilizzeremo una piattaforma XAMPP, ovvero una piattaforma basata su Windows come sistema operativo, Apache come web server, MySQL come server database e PHP come linguaggio lato server. Tale piattaforma viene scelta perché coniuga la semplicità a livello didattico e l'ampia diffusione in contesti di produzione.
Principalmente esistono due API (Application Program Interface) per poter interagire con MySQL da PHP:
-mysqli, che segue il paradigma di programmazione procedurale
-PDO (PHP Data Objects), che segue il paradigma di programmazione orientato agli oggetti
L'utilizzo di un paradigma piuttosto che un altro, a livello didattico, può essere fortemente influenzato dalle competenze di base degli alunni per cui si rivolge questo tipo di attività. Da un punto di vista funzionale, invece, le due API sono equivalenti. Nel proseguo della trattazione utilizzeremo il paradigma procedurale senza perdita di generalità.
Di seguito, viene fornita una panoramica generale su come utilizzare PHP per connettersi a un database e recuperare i dati.

1. Connessione al database: Per iniziare, stabilire una connessione al database utilizzando le funzioni PHP appropriate. Si può utilizzare la funzione mysqli_connect () per creare una connessione al database. Si dovrà fornire i dettagli di accesso al database come l'host, il nome utente, la password e il nome del database.
2. Esecuzione di una query: Una volta stabilita la connessione al database, si deve eseguire la query per recuperare i dati, utilizzando la funzione mysqli_ query() per eseguire le query.
3. Elaborazione dei risultati: Dopo aver eseguito una query, è possibile elaborare i risultati ottenuti dal database, utilizzando ad esempio la funzione mysqli_fetch_assoc() per recuperare i dati ottenuti dalla query.
4. Chiusura della connessione: Dopo aver terminato di utilizzare il database, è buona pratica chiudere la connessione per liberare le risorse del server. Si può utilizzare la funzione mysqli_close() per chiudere la connessione.
Ci sono molte altre funzioni e metodi disponibili in PHP per interrogare e manipolare i dati del database. È anche importante considerare la sicurezza e dunque sarebbe inoltre opportuno utilizzare tecniche come le query parametriche per evitare attacchi di tipo SQL injection.
Di seguito viene riportato il frammento di codice che permette di estrarre tutti i record dalla tabella libri e ordinarli per genere, come richiesto dalla traccia. Per interagire con il db si utilizza il paradigma procedurale con le API fornite da PHP. 

1. PAGINA DI RICERCA  - QUERY  DI RICERCA 

Di seguito viene riportato il frammento di codice che permette di estrarre tutti i record dalla tabella libri e ordinarli per genere, come richiesto dalla traccia. Per interagire con il db si utilizza il paradigma procedurale con le API fornite da PHP.
<?Php 
$db="libreria":
$user="root"; 
$password="";
$host="localhost";
$connection = mysqli_connect ($host, $user, $password,  $db); // Effettua la connessione al database utilizzando le variabili di configurazione
if (mysqli_connect_errno( )) { 
die ("Failed to connect to MySQL" ); // Verifica sé la connessione al database ha avuto successo. Sé fallisce, interrompi l'esecuzione dello script e visualizza un messaggio di errore 
}
$query = "SELECT * FROM libri order by genere"; // Query per selezionare tutti i record dalla tabella "libri" e ordinarli per "genere"
$result = mysqli_query($connection, $query); // Esegui la query sul database utilizzando la connessione
while ($row = mysqli_fetch_assoc($result)){
//Itera attraverso ogni riga di risultati restituita dalla query
// Stampa il valore del campo "genere" seguito dal valore del campo "titolo"
echo $row[ 'genere'];
echo ‘’ ‘’;
echo $row[ 'titolo'];
echo "<br>";
my sqli _close ($connection) ; // Chiudi la connessione al database
?>

Il codice contiene le variabili di connessione al database con la configurazione standard di XAMPP su ambiente Windows in modalità di sviluppo. Effettua quindi la connessione al database utilizzando le variabili di configurazione. Sé la connessione fallisce, viene interrotta l'esecuzione dello script e viene visualizzato un messaggio di errore. Nel proseguo, per semplicità di trattazione, ometteremo i controlli di errore.
Successivamente, viene eseguita una query per selezionare tutti i record dalla tabella "libri" e ordinarli per "genere". La query viene eseguita sul database utilizzando la connessione stabilita in precedenza. Il risultato della query viene iterato utilizzando un ciclo while e vengono stampati i valori dei campi "genere" e "titolo" di ogni riga, separati da uno spazio e seguiti da un tag di nuova riga <br> per creare una lista. Infine, la connessione al database viene chiusa utilizzando la funzione mysqli_ close().

2.PAGINA DI INSERIMENTO - QUERY DI INSERIMENTO  
La pagina di Amministrazione seguirà lo stesso schema grafico della schermata Home, tuttavia all'interno del tag main verrà inserito il codice PHP per eseguire le operazioni di amministrazione richieste dalla traccia, in particolare:
inserimento, modifica eliminazione dei record
Nella pagina di inserimento avremo un form di questo tipo
<h2>Inserimento libri</h2>
<form method="POST"action="inserisci.Php">
ISBN: <input type="text" name="isbn" required><br>
Titolo: <input type="text"
name="titolo" required><br><br>
Autore<input type="date" name="autore" required><br><br>
<input type="submit" value="Inserisci">
</form>
Che punta alla pagina di inserimento in PHP


3. PAGINA DI ELIMINAZIONE - QUERY DI ELIMINAZIONE 
Nella pagina di eliminazione di un libro si visualizzano inizialmente tutti i libri, inserendo un form con un campo nascosto il cui valore è dato dall'attributo chiave. Quando l'utente preme il pulsante di eliminazione, l'attributo chiave viene propagato tramite POST e viene utilizzato per effettuare l'eliminazione con il comando DELETE.
<?Php 
$db="libreria";
$user="root";
$password= " ";
$host=" localhost";
$connection = mysqli_connect ($host,
$user, $password, $db);
$query = "SELECT * FROM libri";
$result = mysqli_query($connection, $query);
while ($row = mysqli_fetch_assoc($result)){
echo $row[' isbn'];
echo " ";
echo $row['titolo'];
echo " ";
echo "row[ 'autore'];
echo " ";
?>
<form method="POST" action="eliminaLibro.Php">
<input type="hidden"
name="id" value="<?Php echo $row[ 'codice_libro']; ?>">
<input type="submit" value="Elimina">
</form>
<?Php
}
mysqli_ close($connection);

?>

Nella pagina eliminaLibro.Php effettuo la query di eliminazione con il comando DELETE
<?Php 
$db="libreria";
$user="root"
$password="";
$host="localhost" :
$connection = mysqli_connect ($host, $user, $password, $db);
$codice_libro = $_POST[ 'codice_libro'];
query = DELETE FROM Libri WHERE codice_ libro='$codice_libro'";
$result = mysqli_query($connection, $query);
//controllo operazione
if ($result){
echo "Avvenuta con successo";
}
else {
echo "Errore";
mysqli_close ($connection);
header ("Location: amministrazione.Php");
?>

4. PAGINA MODIFICA - QUERY  MODIFICA 
Nella pagina di modifica, visualizzerò un form con i campi da modificare. Tali campi verranno successivamente aggiornati tramite il comando UPDATE
<h2> Modifica record </h2>
<form method="POST" action="modificaLibro. Php">
Codice_libro: <input type="integer" name="codice_libro"><br>
Titolo:<input type="text" name="titolo" required><br>
Autore: <input type="text" name="autore"
required><br><br>
<input type="submit" name="scegli_id" value="Modifica">
</form>

La pagina modificaLibro. Php sarà del tipo
<?Php
$db="libreria";
$user="root";
$password=" ";
$host ="localhost ";
$connection = mysqli_connect ($host, $user, $password, $db);
$bookId = $_POST[ 'codice_libro'];
$title = $_POST['titolo'];
$author = $_POST[ 'autore'];
// Esegui la query di aggiornamento
$query = "UPDATE Libri SET titolo = '$title', autore = '$author' WHERE codice_libro = $bookId" ;
mysqli_query ($connection, $query);
mysqli_close($connection);
header(“ Location: amministrazione.Php”);
?>

PAGINA LOGIN
Per effettuare il login supponiamo di avere a disposizione una tabella standard Utenti in cui sono memorizzati i vari utenti del sito. Facciamo presente che per ragioni di sicurezza le password dovrebbero essere memorizzate in maniera cifrata sul database. A questo punto fornisco un form di inserimento nome utente e password, analogo ai precedenti.
< form method="POST" action="login.Php">
Nome utente: <input type="text" name="username" required><br>
Password: <input type="password" name="password" required><br><br>
<input type="submit" value="Accedi">
</form>
Lo script che effettua il login sarà il seguente
<?Php
$db="libreria" ;
$user="root" ; 
$password="";
$host="localhost" ;
$connection = mysqli_connect ($host, $user, $password, $db) ;
$username = $_POST [ 'username'];
$password = $_POST[ 'password'];

$query = "SELECT username, password FROM utenti  
WHERE username = ‘$username'" ;
$result = mysqli_query ($connection, $query);
$row = mysqli_fetch_assoc ($result);
if ($row && $password == $row[ 'password']) {
$_SESSION[" login"]=true; //variabili di sessione
$_SESSION ["username" ]=$username; // variabile di sessione echo "Benvenuto, login effettuato con successo";
}
else {
$_SESSION[ "login"]=false;
echo "Benvenuto, login non effettuato";
}
?>
Tale script verifica la correttezza della password e setta le variabili di sessione che permettono di verificare l'avvenuto login su tutte le pagine del sito. Ovviamente, il controllo sulle variabili di sessione deve essere fatto su tutte le pagine di amministrazione del sito. Sé l'utente non è loggato, si rimanderà alla pagina di login.


1. PAGINA DI RICERCA  - QUERY  DI RICERCA 

Di seguito viene riportato il frammento di codice che permette di estrarre tutti i record dalla tabella libri e ordinarli per genere, come richiesto dalla traccia. Per interagire con il db si utilizza il paradigma procedurale con le API fornite da PHP.
<?Php 
$db="libreria":
$user="root"; 
$password="";
$host="localhost";
$connection = mysqli_connect ($host, $user, $password,  $db); // Effettua la connessione al database utilizzando le variabili di configurazione
if (mysqli_connect_errno( )) { 
die ("Failed to connect to MySQL" ); // Verifica sé la connessione al database ha avuto successo. Sé fallisce, interrompi l'esecuzione dello script e visualizza un messaggio di errore 
}
$query = "SELECT * FROM libri order by genere"; // Query per selezionare tutti i record dalla tabella "libri" e ordinarli per "genere"
$result = mysqli_query($connection, $query); // Esegui la query sul database utilizzando la connessione
while ($row = mysqli_fetch_assoc($result)){
//Itera attraverso ogni riga di risultati restituita dalla query
// Stampa il valore del campo "genere" seguito dal valore del campo "titolo"
echo $row[ 'genere'];
echo ‘’ ‘’;
echo $row[ 'titolo'];
echo "<br>";
my sqli _close ($connection) ; // Chiudi la connessione al database
?>

Il codice contiene le variabili di connessione al database con la configurazione standard di XAMPP su ambiente Windows in modalità di sviluppo. Effettua quindi la connessione al database utilizzando le variabili di configurazione. Sé la connessione fallisce, viene interrotta l'esecuzione dello script e viene visualizzato un messaggio di errore. Nel proseguo, per semplicità di trattazione, ometteremo i controlli di errore.
Successivamente, viene eseguita una query per selezionare tutti i record dalla tabella "libri" e ordinarli per "genere". La query viene eseguita sul database utilizzando la connessione stabilita in precedenza. Il risultato della query viene iterato utilizzando un ciclo while e vengono stampati i valori dei campi "genere" e "titolo" di ogni riga, separati da uno spazio e seguiti da un tag di nuova riga <br> per creare una lista. Infine, la connessione al database viene chiusa utilizzando la funzione mysqli_ close().

2.PAGINA DI INSERIMENTO - QUERY DI INSERIMENTO  
La pagina di Amministrazione seguirà lo stesso schema grafico della schermata Home, tuttavia all'interno del tag main verrà inserito il codice PHP per eseguire le operazioni di amministrazione richieste dalla traccia, in particolare:
inserimento, modifica eliminazione dei record
Nella pagina di inserimento avremo un form di questo tipo
<h2>Inserimento libri</h2>
<form method="POST"action="inserisci.Php">
ISBN: <input type="text" name="isbn" required><br>
Titolo: <input type="text"
name="titolo" required><br><br>
Autore<input type="date" name="autore" required><br><br>
<input type="submit" value="Inserisci">
</form>
Che punta alla pagina di inserimento in PHP


3. PAGINA DI ELIMINAZIONE - QUERY DI ELIMINAZIONE 
Nella pagina di eliminazione di un libro si visualizzano inizialmente tutti i libri, inserendo un form con un campo nascosto il cui valore è dato dall'attributo chiave. Quando l'utente preme il pulsante di eliminazione, l'attributo chiave viene propagato tramite POST e viene utilizzato per effettuare l'eliminazione con il comando DELETE.
<?Php 
$db="libreria";
$user="root";
$password= " ";
$host=" localhost";
$connection = mysqli_connect ($host,
$user, $password, $db);
$query = "SELECT * FROM libri";
$result = mysqli_query($connection, $query);
while ($row = mysqli_fetch_assoc($result)){
echo $row[' isbn'];
echo " ";
echo $row['titolo'];
echo " ";
echo "row[ 'autore'];
echo " ";
?>
<form method="POST" action="eliminaLibro.Php">
<input type="hidden"
name="id" value="<?Php echo $row[ 'codice_libro']; ?>">
<input type="submit" value="Elimina">
</form>
<?Php
}
mysqli_ close($connection);

?>

Nella pagina eliminaLibro.Php effettuo la query di eliminazione con il comando DELETE
<?Php 
$db="libreria";
$user="root"
$password="";
$host="localhost" :
$connection = mysqli_connect ($host, $user, $password, $db);
$codice_libro = $_POST[ 'codice_libro'];
query = DELETE FROM Libri WHERE codice_ libro='$codice_libro'";
$result = mysqli_query($connection, $query);
//controllo operazione
if ($result){
echo "Avvenuta con successo";
}
else {
echo "Errore";
mysqli_close ($connection);
header ("Location: amministrazione.Php");
?>

4. PAGINA MODIFICA - QUERY  MODIFICA 
Nella pagina di modifica, visualizzerò un form con i campi da modificare. Tali campi verranno successivamente aggiornati tramite il comando UPDATE
<h2> Modifica record </h2>
<form method="POST" action="modificaLibro. Php">
Codice_libro: <input type="integer" name="codice_libro"><br>
Titolo:<input type="text" name="titolo" required><br>
Autore: <input type="text" name="autore"
required><br><br>
<input type="submit" name="scegli_id" value="Modifica">
</form>

La pagina modificaLibro. Php sarà del tipo
<?Php
$db="libreria";
$user="root";
$password=" ";
$host ="localhost ";
$connection = mysqli_connect ($host, $user, $password, $db);
$bookId = $_POST[ 'codice_libro'];
$title = $_POST['titolo'];
$author = $_POST[ 'autore'];
// Esegui la query di aggiornamento
$query = "UPDATE Libri SET titolo = '$title', autore = '$author' WHERE codice_libro = $bookId" ;
mysqli_query ($connection, $query);
mysqli_close($connection);
header(“ Location: amministrazione.Php”);
?>

PAGINA LOGIN
Per effettuare il login supponiamo di avere a disposizione una tabella standard Utenti in cui sono memorizzati i vari utenti del sito. Facciamo presente che per ragioni di sicurezza le password dovrebbero essere memorizzate in maniera cifrata sul database. A questo punto fornisco un form di inserimento nome utente e password, analogo ai precedenti.
< form method="POST" action="login.Php">
Nome utente: <input type="text" name="username" required><br>
Password: <input type="password" name="password" required><br><br>
<input type="submit" value="Accedi">
</form>
Lo script che effettua il login sarà il seguente
<?Php
$db="libreria" ;
$user="root" ; 
$password="";
$host="localhost" ;
$connection = mysqli_connect ($host, $user, $password, $db) ;
$username = $_POST [ 'username'];
$password = $_POST[ 'password'];

$query = "SELECT username, password FROM utenti  
WHERE username = ‘$username'" ;
$result = mysqli_query ($connection, $query);
$row = mysqli_fetch_assoc ($result);
if ($row && $password == $row[ 'password']) {
$_SESSION[" login"]=true; //variabili di sessione
$_SESSION ["username" ]=$username; // variabile di sessione echo "Benvenuto, login effettuato con successo";
}
else {
$_SESSION[ "login"]=false;
echo "Benvenuto, login non effettuato";
}
?>
Tale script verifica la correttezza della password e setta le variabili di sessione che permettono di verificare l'avvenuto login su tutte le pagine del sito. Ovviamente, il controllo sulle variabili di sessione deve essere fatto su tutte le pagine di amministrazione del sito. Sé l'utente non è loggato, si rimanderà alla pagina di login.


QUERY ESEMPI 

n. 1 elenco  in ordine  alfabetico per argomento dei corsi presenti nel sistema con più di 20 ore

SELECT argomento, num_ore, IDCorso
FROM Corsi
WHERE num_ore >20
ORDER BY argomento 

n 2. Visualizzazione di nome, cognome e data di nascita degli studenti che hanno prenotato un corso nel mese di maggio 2023

SELECT Studenti.Nome, Studenti.Cognome, Studenti.Datadinascita
FROM Corsi, Studenti
WHERE Corsi.IDStudente=Studenti.IDStudente, Corsi.Dataprenotazione=’2023-05’
n 3. Visualizzazione degli insegnanti con prima lingua italiana che tengono un corso di matematica

SELECT Insegnanti.Nome, Insegnanti.Cognome
FROM Corsi, Insegnanti 
WHERE Corsi.IDInsegnante =Insegnanti.IDInsegnante, Corsi.Argomento=’matematica’ AND Insegnanti.Linguamadre=’italiano’
n 4. Visualizzazione dei nome, cognome e numero di telefono degli studenti del corso di matematica tenuto dall'insegnante Mario Rossi

SELECT Studenti.Nome, Studenti.Cognome, Studenti.Telefono
FROM Corsi, Insegnati, studenti 
WHERE Corsi.IDInsegnante =Insegnanti.IDInsegnante, Corsi.IDStudente=Studenti.IDStudente AND corsi.Argomento=’matematica’ AND Insegnanti.Nome=’Mario’ AND Insegnanti.Cognome=’Rossi’

n 5. Per ogni corso, di cui interessa visualizzare id e nome, visualizzare il numero dei corsi con più di 20 ore di argomento Informatica

SELECT IDCorso, Corsi.Nome
FROM Corsi
WHERE num_ore>20 AND argomento=’informatica’
n 6. Per ogni studente, di cui interessa visualizzare nome, cognome e codice fiscale, visualizzare il numero di corsi prenotati nell'anno 2023

SELECT Studenti.Nome, Studenti.Cognome, Studenti.Codicefiscale
FROM Corsi, Studenti
WHERE Corsi.IDStudente=Studenti.IDStudente AND corsi.Dataprenotazione>=’2023-01-01’
n 7. Per ogni corso che costa più di 30 euro, di cui interessa visualizzare il nome, id e costo, elencare il numero di studenti che lo hanno prenotato, ordinato in maniera decrescente per numero di studenti.

SELECT COUNT(Corsi.Dataprenotazione) AS Num_studenti Corsi.Nome, Corsi.IDCorso, Corsi.Costo, Studenti.IDStudente 
FROM Corsi, Studenti
WHERE Corsi.IDStudente=Studenti.IDStudente AND Corsi.Costo>30
GROUP BY Corsi.Nome, Corsi.Costo,
ORDER BY IDStudente DESC 

SCHEMA CONCETTUALE : creazione tabelle 
Studenti – partecipazioni – Corsi -->  N a N  (quando c’è N a N bisogna creare una tabella al centro con un verbo, tipo : partecipa, effettua, 
Corsi – insegnanti -->N a 1 
Ogni studente partecipa a uno o più corsi. Ogni corso può partecipare uno a più studenti. 
Ogni insegnante può insegnare in uno o più corsi. Ogni corso deve essere insegnato da un solo insegnate. 
SCHEMA LOGICO 
Studenti(IDstudente, codicefiscale, nome, cognome, datadinascita, telefono, email, password)
Corsi (IDcorso, argomento, num_ore, costo, IDStudente, IDInsegnate)
Insegnanti(IDinsegnate, nome, cognome, curriculum, linguamadre, secondalingua)
Partecipazioni(IDPartecipa, IDStudente, IDCorso)

SCHEMA SQL 
1. CREATE TABLE Studenti(
Idstudente integer primary key auto_increment, 
Codicefiscale varchar (255) NOT NULL,
Nome varchar (255) NOT NULL, 
Cognome varchar (255) NOT NULL,
Datadinascita date, 
Telefono integer, 
Email varchar (255) NOT NULL,
password varchar (255) NOT NULL );
2. CREATE TABLE Corsi(
Idcorso integer primary key auto_increment, 
Nome varchar (255) NOT NULL, 
Argomento varchar (255) NOT NULL,
Num_ore integer, costo float, 
dataprenotazione date, 
Idstudente integer, 
id insegnante integer, 
foreign key Idstudente references Studenti (Idstudente),
foreign key Idinsegnante references Insegnanti (Idinsegnante) );

3. CREATE TABLE Insegnanti(
Idinsegnante integer primary key auto_increment, 
Nome varchar (255) NOT NULL, 
Cognome varchar (255) NOT NULL,
Curriculum varchar (255) NOT NULL,
linguamadre char (30) NOT NULL,
secondalingua char (30) NOT NULL );

Voci correlate: