mercoledì 13 gennaio 2010

Preparazione al compito

Buonasera freghi e compagnia bella!

Dopo un bel giretto in moto (ho anche dato dietro, per quasi 10km, a uno che alla fine sentendosi seguito metteva le frecce ma non girava...bellissimo) ... dicevo, dopo il giro in moto mi sono messo a rifare di sana pianta l'esercitazione di martedì (quella che doveva essere il compito) e l'ho finita tutta.

Quello che pubblico ora è nient'altro che la soluzione dei miei esercizi, che spero siano stati fatti bene altrimenti domani mi attacco e tiro forte.

Il database su cui ruotavano gli esercizi è il seguente:



Ecco a seguire le soluzioni degli esercizi, ciascuna preceduta dalla relativa consegna. L'ultimo esercizio, il numero 15, è pubblicato sottoforma di screen, e secondo me (fatto in quel modo) non è proprio perfetto: al prof. il giudizio!



martedì 5 gennaio 2010

Arpìamo l'via!

Buonasera a tutti!

Purtroppo le vacanze sono ormai giunte agli sgoccioli e tra due giorni ci ritroveremo nuovamente a scuola, dunque dopo un ozio totale di due settimane ho dato una riguardata agli ultimi argomenti fatti per non impappinare il cervello all'imminente ripresa delle lezioni.

Colgo l'occasione per ringraziare il prof. Natalizi per gli auguri che or ora ho visto pubblicati sul suo blog, e che ricambio anche se mooooolto in ritardo...

Comunque, veniamo al dunque. Premetto di non aver creato materiale nuovo ma semplicemente guardato e risistemato quello fatto a scuola, che ora pubblicherò anche per permettere a coloro che non hanno le idee chiare di confrontare un po' gli appunti...

Quelle che seguono sono le istruzioni utilizzate per realizzare, attraverso SQLite3, un database di 3 tabelle (studente, materia e voto) volto alla memorizzazione dei voti conseguiti dagli studenti in diverse materie. Dopo aver inserito i dati, sono state effettuate delle estrapolazioni utilizzando le varie istruzioni viste finora a scuola.
Trattandosi di appunti, sono presenti anche parti di teoria relative alle istruzioni e ai database in generale.

sqlite3 voti.db (accede al database voti.db, e se non esiste lo crea)
.tables
.headers on
.mode columns on

█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦

► creo le tabelle
create table studente (id int, nome varchar(30), primary key(id));
create table materia (id int, nome varchar(30), primary key(id));
create table voto(id int, voto int, dataVoto char(10), studente_id int, materia_id int, primary key(id));

► inserisco i dati
insert into materia values(1,"Italiano");
insert into materia values(2,"Storia");
insert into materia values(3,"Inglese");
insert into materia values(4,"Matematica");
insert into materia values(5,"Informatica");
insert into materia values(6,"Elettronica");

insert into studente values(1,"Anselmi");
insert into studente values(2,"Baldassarri");
insert into studente values(3,"Bazzucchi");
insert into studente values(4,"Biancalana");
insert into studente values(5,"Biscarini");
insert into studente values(6,"Cavalierini");
insert into studente values(7,"Ceccarini");
insert into studente values(8,"Lugani");

insert into voto values(1,5,"14-12-2009",1,4);
insert into voto values(2,9,"14-12-2009",6,3);
insert into voto values(3,9,"14-12-2009",1,3);
insert into voto values(4,6,"14-12-2009",7,5);
insert into voto values(5,7,"15-12-2009",4,2);
insert into voto values(6,8,"15-12-2009",3,6);
insert into voto values(7,5,"15-12-2009",2,2);
insert into voto values(8,4,"15-12-2009",5,1);
insert into voto values(9,5,"15-12-2009",5,1);

► estrapolo
SELECT studente.nome,
materia.nome,
voto.voto, voto.dataVoto
FROM materia, studente, voto
WHERE studente.id=voto.studente_id
AND voto.materia_id=materia.id;

Visualizza, senza criteri restrittivi (nel senso che visualizza tutti i dati) il nome dello studente, il nome della materia, il voto conseguito e la data in cui è stato conseguito. In pratica visualizza tutti i voti che sono stati inseriti

♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣

SELECT count(*) AS "numero voti" FROM voto;

Conta il numero di voti che sono stati assegnati in totale, e il risultato lo identifica come una variabile chiamata "numero voti". Il nome della variabile è visualizzato nell'estrapolazione come etichetta della colonna

♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣

SELECT count(studente.nome) AS "numero studenti" FROM studente;

Conta i nomi degli studenti, e il risultato lo identifica come una variabile chiamata "numero studenti"

♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣

SELECT materia.nome, count(*) AS "numero totale voti per materia"
FROM studente, voto, materia
WHERE studente.id=voto.studente_id AND
voto.materia_id=materia.id
GROUP BY materia.nome
HAVING materia.nome="Inglese";

Estrapola, chiamandolo "numero totale voti per materia" e raggruppandolo per nome della materia, quanti voti sono stati assegnati per la materia Inglese

NOTA: la WHERE seleziona delle specifiche RIGHE, mentre la HAVING seleziona un RAGGRUPPAMENTO di righe

♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣

SELECT studente.nome, materia.nome, count(*) AS "numero totale voti per studente per materia"
FROM studente, voto, materia
WHERE studente.id=voto.studente_id AND
voto.materia_id=materia.id
GROUP BY studente.nome, materia.nome;

Estrapola, chiamandolo "numero totale voti per studente per materia", quanti voti sono stati assegnati in totale ad ogni studente ad ogni materia

♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣

SELECT count(*) from
SELECT count(*), studente_id
FROM voto
GROUP BY studente_id
ORDER BY studente_id AS "numero studenti";

In questo caso si è adoperata una SUB-QUERY, ossia una query che usa il risultato di un'altra query come fonte a cui attingere dati per la nuova estrapolazione. Per non utilizzare due operazioni singole, si sarebbe potuto anche creare una VIEW, ossia una nuova tabella contenente i dati dell'estrapolazione. Questa tabella risulta presente poi come tabella insita al database, interrogabile come una qualsiasi altra tabella

CREATE VIEW studenti_voto AS
SELECT count(*), studente_id
FROM voto
GROUP BY studente_id
ORDER BY studente_id AS "numero studenti";

█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦

► cancello i dati da una o più righe ( ISTRUZIONE DELICATA !!! )
DELETE FROM voto WHERE id=8;

NOTA: mettendo "DELETE FROM voto" e basta, cancella TUTTI i dati contenuti nelle righe ma non la struttura della tabella, che si mantiene

► cancella TUTTA la tabella, compresa la struttura
DROP TABLE voto;

► modifica i dati di alcune righe
UPDATE voto SET dataVoto="16-12-2009" WHERE id=9;

█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦█♦

CRUD=create, read, update, delete (creazione, lettura, aggiornamento, eliminazione). È il meccanismo che permette di gestire le tabelle attraverso le quattro operazioni eseguibili su di esse, ed è la minima richiesta di elaborazione in un database operata da un gestore di database

Inoltre, parte dell'elaborazione di questo database l'ho immortalata con uno screen, che pubblico a seguire:



Ultima cosa: come avrete tutti sicuramente notato, le dimensioni della finestra DOS del prompt sono piuttosto piccole e per visualizzare tutto correttamente ci sarebbe la necessità di ingrandirla. Inoltre, nel caso si volessero fare degli screen della finestra stessa, poi in fase di stampa la cartuccia del nero si consumerebbe come il pandoro a Natale dato che lo sfondo è tutto nero...
La soluzione è impostare la finestra DOS modificando le dimensioni ed i vari colori, però poi bisognerebbe farlo ogni qualvolta la si utilizza o, nel migliore dei casi, almeno una volta su ognuno dei computer dove usiamo SQLite. Senza contare il fatto che bisognerebbe sempre stare a cambiare la directory di lavoro...insomma: una perdita di tempo e, a lungo termine, una rottura immane.

Per questo ho realizzato una cosa molto semplice ma che risolve molti problemi: una semplice BAT. Utilizzando semplici comandi, questa BAT:
  1. Apre una finestra DOS di dimensioni accettabili e con un buffer consistente (ovvero non è che, dopo un po' che scorre la finestra, le righe scritte per prime non stanno più in memoria per essere riguardate)
  2. Imposta lo sfondo bianco e il carattere del testo nero, così sarà felice la cartuccia della stampante quando mettiamo su carta gli screen
  3. La directory di lavoro diventa automaticamente quella dove è collocata la BAT. Basterà perciò porla nella stessa cartella di SQLite3 per avere la cartella di lavoro subito pronta
  4. Visualizza il contenuto di questa cartella, il che non serve quasi a nulla però a volte è utile a me...perciò ecco anche questa funzione
Per chi non lo sapesse, per creare una BAT è sufficiente realizzare un nuovo documento di testo con il blocco note, e poi salvarlo con estensione .BAT. Io, ad esempio, l'ho chiamato Finestra.bat ed al suo interno contiene le seguenti istruzioni, di cui potete tranquillamente fare copia e incolla:

MODE CON: COLS=150 LINES=800
COLOR F0
dir
@echo ----------------------------------
@echo Finestra impostata dal Doctor Vel
@echo ----------------------------------
cmd

Ecco, ora che ho pubblicato questa roba mi vado a vedere un film...
Buona serata e buonanotte a tutti! E buona epifania!