[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 609.   SQLite: esempi comuni

Nelle sezioni seguenti vengono mostrati alcuni esempi comuni di utilizzo del linguaggio SQL, limitato alle possibilità di SQLite. La sintassi non viene descritta. Negli esempi si fa riferimento frequentemente a una relazione di indirizzi, il cui contenuto è visibile nella figura successiva.

Figura 609.1. La relazione Indirizzi (Codice, Cognome, Nome, Indirizzo, Telefono) usata negli esempi del capitolo.

relazione

609.1   Creazione di una relazione

La relazione di esempio, denominata Indirizzi, potrebbe essere creata nel modo seguente:

sqlite> CREATE TABLE Indirizzi ([Invio]

   ...>         Codice          integer,[Invio]

   ...>         Cognome         char(40),[Invio]

   ...>         Nome            char(40),[Invio]

   ...>         Indirizzo       varchar(60),[Invio]

   ...>         Telefono        varchar(40)[Invio]

   ...>     );[Invio]

609.2   Modifica della relazione

SQLite consente soltanto l'aggiunta di attributi alle relazioni, mentre la loro eliminazione o il cambiamento del dominio (il tipo), non è ammissibile. Segue un esempio con cui si aggiunge un attributo:

sqlite> ALTER TABLE Indirizzi ADD COLUMN Comune char(30);[Invio]

609.3   Inserimento dati in una relazione

L'esempio seguente mostra l'inserimento dell'indirizzo dell'impiegato «Pinco Pallino»:

sqlite> INSERT INTO Indirizzi VALUES ([Invio]

   ...>         01,[Invio]

   ...>         'Pallino',[Invio]

   ...>         'Pinco',[Invio]

   ...>         'Via Biglie 1',[Invio]

   ...>         '0222,222222');[Invio]

In questo caso, si presuppone che i valori inseriti seguano la sequenza degli attributi, così come è stata creata la relazione in origine; tuttavia, si osservi che se la relazione ha degli attributi in più, si ottiene una segnalazione di errore e l'inserimento viene rifiutato.

Per indicare un comando più leggibile, evitando anche problemi quando dovessero esserci attributi ulteriori, che però non si vogliono prendere in considerazione, occorre aggiungere l'indicazione della sequenza degli attributi da compilare, come nell'esempio seguente:

sqlite> INSERT INTO Indirizzi (Codice, Cognome, Nome,[Invio]

   ...>                        Indirizzo, Telefono)[Invio]

   ...>        VALUES (01, 'Pallino', 'Pinco',[Invio]

   ...>                'Via Biglie 1', '0222,222222');[Invio]

In questo modo, gli attributi che non vengono indicati, ricevono il valore predefinito (se esiste), oppure NULL in mancanza d'altro.

609.4   Eliminazione di una relazione

Una relazione può essere eliminata completamente attraverso l'istruzione DROP. L'esempio seguente elimina la relazione degli indirizzi degli esempi già mostrati:

sqlite> DROP TABLE Indirizzi;[Invio]

609.5   Interrogazioni semplici

L'esempio seguente emette tutto il contenuto della relazione degli indirizzi già vista negli esempi precedenti:

sqlite> SELECT * FROM Indirizzi;[Invio]

Il risultato può apparire in formati differenti; di solito si ottiene così:

1|Pallino|Pinco|Via Biglie 1|0222,222222
2|Tizi|Tizio|Via Tazi 5|0555,555555
3|Cai|Caio|Via Caini 1|0888,888888
4|Semproni|Sempronio|Via Sempi 7|0999,999999

Per ottenere un elenco incolonnato, occorre usare il comando .mode column, ma in tal caso l'ampiezza delle colonne è fissa e le informazioni potrebbero apparire troncate:

sqlite> .mode column[Invio]

sqlite> SELECT * FROM Indirizzi;[Invio]

1          Pallino     Pinco       Via Biglie 1   0222,222222
2          Tizi        Tizio       Via Tazi 5     0555,555555
3          Cai         Caio        Via Caini 1    0888,888888
4          Semproni    Sempronio   Via Sempi 7    0999,999999

Per visualizzare anche l'intestazione delle colonne che appaiono, occorre utilizzare il comando .header on:

sqlite> .header on[Invio]

sqlite> SELECT * FROM Indirizzi;[Invio]

Codice     Cognome     Nome        Indirizzo      Telefono
---------  ----------  ----------  -------------  -----------
1          Pallino     Pinco       Via Biglie 1   0222,222222
2          Tizi        Tizio       Via Tazi 5     0555,555555
3          Cai         Caio        Via Caini 1    0888,888888
4          Semproni    Sempronio   Via Sempi 7    0999,999999

Per ottenere un elenco ordinato in base al cognome e al nome (in caso di ambiguità), lo stesso comando si completa nel modo seguente:

sqlite> SELECT * FROM Indirizzi ORDER BY Cognome, Nome;[Invio]

Codice     Cognome     Nome        Indirizzo      Telefono
---------  ----------  ----------  -------------  -----------
3          Cai         Caio        Via Caini 1    0888,888888
1          Pallino     Pinco       Via Biglie 1   0222,222222
4          Semproni    Sempronio   Via Sempi 7    0999,999999
2          Tizi        Tizio       Via Tazi 5     0555,555555

La selezione degli attributi permette di ottenere un risultato che contenga solo quelli desiderati, permettendo anche di cambiarne l'intestazione. L'esempio seguente permette di mostrare solo i nominativi e il telefono, cambiando un po' le intestazioni:

sqlite> SELECT Cognome as cognomi, Nome as nomi,[Invio]

   ...>        Telefono as numeri_telefonici[Invio]

   ...>        FROM Indirizzi;[Invio]

Quello che si ottiene è simile all'elenco seguente:

cognomi     nomi        numeri_telefonici
----------  ----------  -----------------
Pallino     Pinco       0222,222222
Tizi        Tizio       0555,555555
Cai         Caio        0888,888888
Semproni    Sempronio   0999,999999

La selezione delle tuple può essere fatta attraverso la condizione che segue la parola chiave WHERE. Nell'esempio seguente vengono selezionate le tuple in cui l'iniziale dei cognomi è compresa tra N e T:

sqlite> SELECT * FROM Indirizzi[Invio]

   ...>        WHERE Cognome >= 'N' AND Cognome <= 'T';[Invio]

Dall'elenco che si ottiene, si osserva che Caio è stato escluso:

Codice     Cognome     Nome        Indirizzo      Telefono
---------  ----------  ----------  -------------  -----------
1          Pallino     Pinco       Via Biglie 1   0222,222222
2          Tizi        Tizio       Via Tazi 5     0555,555555
4          Semproni    Sempronio   Via Sempi 7    0999,999999

Per evitare ambiguità possono essere indicati i nomi degli attributi prefissati dal nome della relazione a cui appartengono, separando le due parti con l'operatore punto (.). Nell'esempio seguente si selezionano solo il cognome, il nome e il numero telefonico, specificando il nome della relazione a cui appartengono gli attributi:

sqlite> SELECT Indirizzi.Cognome, Indirizzi.Nome, Indirizzi.Telefono[Invio]

   ...>        FROM Indirizzi;[Invio]

Ecco il risultato:

Cognome     Nomi        Telefono
----------  ----------  -----------
Pallino     Pinco       0222,222222
Tizi        Tizio       0555,555555
Cai         Caio        0888,888888
Semproni    Sempronio   0999,999999

609.6   Interrogazioni simultanee di più relazioni

Se dopo la parola chiave FROM si indicano più relazioni (ciò vale anche se si indica più volte la stessa relazione), si intende fare riferimento a una relazione generata dal «prodotto» di queste. Si immagini di abbinare alla relazione Indirizzi la relazione Presenze contenente i dati visibili nella figura 609.9.

Figura 609.9. La relazione Presenze (Codice, Giorno, Ingresso, Uscita).

relazione

Ecco le istruzioni per crearla e per inserire la prima tupla dell'esempio:

sqlite> CREATE TABLE Presenze (Codice INTEGER, Giorno DATE,[Invio]

   ...>                        Ingresso TIME, USCITA Time);[Invio]

sqlite> INSERT INTO Presenze[Invio]

   ...>     VALUES (1, '2007-01-01', '07:30', '13:30');[Invio]

Come si può intendere, il primo attributo, Codice, serve a identificare la persona per la quale è stata fatta l'annotazione dell'ingresso e dell'uscita. Tale codice viene interpretato in base al contenuto della relazione Indirizzi. Si immagini di volere ottenere un elenco contenente tutti gli ingressi e le uscite, indicando chiaramente il cognome e il nome della persona a cui si riferiscono.

sqlite> SELECT Presenze.Giorno, Presenze.Ingresso, Presenze.Uscita,[Invio]

   ...>        Indirizzi.Cognome, Indirizzi.Nome[Invio]

   ...>        FROM Presenze, Indirizzi[Invio]

   ...>        WHERE Presenze.Codice = Indirizzi.Codice;[Invio]

Ecco quello che si dovrebbe ottenere:

giorno      ingresso    uscita      cognome     nome
----------  ----------  ----------  ----------  ----------
01-01-2007    07:30:00    13:30:00    Pallino     Pinco
01-01-2007    07:35:00    13:37:00    Tizi        Tizio
01-01-2007    07:45:00    14:00:00    Cai         Caio     
01-01-2007    08:30:00    16:30:00    Semproni    Sempronio
01-02-2007    07:35:00    13:38:00    Pallino     Pinco
01-02-2007    08:35:00    14:37:00    Tizio       Tizi
01-02-2007    07:40:00    13:30:00    Semproni    Sempronio

609.7   Alias

Una stessa relazione può essere presa in considerazione come se si trattasse di due o più relazioni differenti. Per distinguere tra questi punti di vista diversi, si devono usare degli alias, che sono in pratica dei nomi alternativi. Gli alias si possono usare anche solo per questioni di leggibilità. L'esempio seguente è la semplice ripetizione di quello mostrato nella sezione precedente, con l'aggiunta però della definizione degli alias Pre e Nom.

sqlite> SELECT Pre.Giorno, Pre.Ingresso, Pre.Uscita,[Invio]

   ...>     Nom.Cognome, Nom.Nome[Invio]

   ...>     FROM Presenze AS Pre, Indirizzi AS Nom[Invio]

   ...>     WHERE Pre.Codice = Nom.Codice;[Invio]

609.8   Viste

Attraverso una vista, è possibile definire una relazione virtuale:

sqlite> CREATE VIEW Presenze_dettagliate AS[Invio]

   ...>     SELECT Presenze.Giorno, Presenze.Ingresso,[Invio]

   ...>            Presenze.Uscita,[Invio]

   ...>            Indirizzi.Cognome, Indirizzi.Nome[Invio]

   ...>         FROM Presenze, Indirizzi[Invio]

   ...>         WHERE Presenze.Codice = Indirizzi.Codice;[Invio]

L'esempio mostra la creazione della vista Presenze_dettagliate, ottenuta dalle relazioni Presenze e Indirizzi. In pratica, questa vista permette di interrogare direttamente la relazione virtuale Presenze_dettagliate, invece di utilizzare ogni volta un comando SELECT molto complesso, per ottenere lo stesso risultato.

609.9   Aggiornamento delle tuple

La modifica di tuple già esistenti avviene attraverso l'istruzione UPDATE, la cui efficacia viene controllata dalla condizione posta dopo la parola chiave WHERE. Se tale condizione manca, l'effetto delle modifiche si riflette su tutte le tuple della relazione.

L'esempio seguente, aggiunge un attributo alla relazione degli indirizzi, per contenere il nome del comune di residenza degli impiegati; successivamente viene inserito il nome del comune Sferopoli in base al prefisso telefonico.

sqlite> ALTER TABLE Indirizzi ADD COLUMN Comune char(30);[Invio]

sqlite> UPDATE Indirizzi[Invio]

   ...>     SET Comune='Sferopoli'[Invio]

   ...>     WHERE Telefono >= '022' AND Telefono < '023';[Invio]

In pratica, viene aggiornata solo la tupla dell'impiegato Pinco Pallino.

609.10   Cancellazione delle tuple

L'esempio seguente elimina dalla relazione delle presenze le tuple riferite alle registrazioni del giorno 01/01/2007 e le eventuali antecedenti.

sqlite> DELETE FROM Presenze WHERE Giorno <= '2007-01-01';[Invio]

609.11   Inserimento in una relazione esistente

L'esempio seguente aggiunge alla relazione dello storico delle presenze le registrazioni vecchie che poi vengono cancellate:

sqlite> INSERT INTO PresenzeStorico ([Invio]

   ...>         PresenzeStorico.Codice, PresenzeStorico.Giorno,[Invio]

   ...>         PresenzeStorico.Ingresso, PresenzeStorico.Uscita)[Invio]

   ...>     SELECT Presenze.Codice, Presenze.Giorno,[Invio]

   ...>            Presenze.Ingresso, Presenze.Uscita[Invio]

   ...>         FROM Presenze WHERE Presenze.Giorno <= '2007-01-01';[Invio]

sqlite> DELETE FROM Presenze WHERE Giorno <= '2007-01-01';[Invio]

609.12   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome sqlite_esempi_comuni.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!