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


Capitolo 719.   Selezione di attributi virtuali, ottenuti da un'espressione

Il linguaggio SQL consente di costruire delle espressioni elementari, attraverso operatori matematici e funzioni comuni. L'interrogazione di una relazione può essere realizzata anche attraverso l'uso di espressioni e questo è lo scopo del capitolo.

Tabella 719.1. Operatori aritmetici comuni.

Operatore e
operandi
Descrizione
-op
Inverte il segno dell'operando.
op1 + op2
Somma i due operandi.
op1 - op2
Sottrae dal primo il secondo operando.
op1 * op2
Moltiplica i due operandi.
op1 / op2
Divide il primo operando per il secondo.
op1 % op2
Modulo: il resto della divisione tra il primo e il secondo operando.

Tabella 719.2. Alcune funzioni riconosciute da SQLite.

Funzione Descrizione
ABS(n)
Restituisce il valore assoluto di n
LENGTH(stringa)
Restituisce la lunghezza in caratteri della stringa indicata come argomento.
LOWER(stringa)
UPPER(stringa)
La prima funzione restituisce la stringa indicata come argomento, con lettere minuscole; la seconda con lettere maiuscole.
MIN(x,y[,...])
MAX(x,y[,...])
La prima funzione restituisce il valore minimo tra quelli indicati come argomento; la seconda, invece, restituisce il valore massimo.
ROUND(n[,n])
Restituisce il valore di n arrotondato a m decimali. Se m viene omesso, si intende pari a zero.
SUBSTR(stringa,n,m)
Estrae la stringa che inizia dalla posizione n, lunga m caratteri.

719.1   Interrogazione della relazione «Movimenti» in modo da ottenere il valore unitario

Nella relazione Movimenti appare un attributo denominato Valore. Si tratta del valore dell'articolo, determinato in base al costo di acquisto (da non confondere con il prezzo di listino), con il quale si determina il valore delle merci in magazzino. Pre ogni tupla della relazione, si vuole ottenere il valore unitario, che si calcola dividendo il valore per la quantità movimentata corrispondente.

Si crei il file prova-interrogazione-movimenti-vu.sql, contenente il testo seguente, sostituendo le metavariabili con informazioni appropriate e rispettando la punteggiatura:

-- Interrogazione della relazione "Movimenti"
-- Esercizio di: cognome nome classe
-- Data: data
-- File: prova-interrogazione-movimenti-vu.sql

.mode columns
.headers on

SELECT Articolo,
       Causale,
       Data,
       Quantita,
       (Valore/Quantita) AS ValoreUnitario
       FROM Movimenti;

Si osservi che, nell'ultima colonna del listato che si vuole ottenere, viene indicata l'espressione (Valore/Quantita), associata a un alias, in modo da mostrare una descrizione appropriata.

Una volta completato e salvato il file prova-interrogazione-movimenti-vu.sql, se ne deve controllare il funzionamento con la base di dati:

sqlite3 mag.db < prova-interrogazione-movimenti-vu.sql[Invio]

Si dovrebbe ottenere un listato simile a quello seguente:

Articolo    Causale     Data        Quantita    ValoreUnitario
----------  ----------  ----------  ----------  --------------
2           1           2007-01-15  10000       0.01          
2           2           2007-01-16  1000        0.01          
102         1           2007-01-17  1000        0.2           
102         2           2007-01-18  100         0.2           
401         1           2007-01-19  1000        0.2           
401         2           2007-01-20  200         0.2           
401         4           2007-01-20  100         0.2           
102         4           2007-01-20  100         0.2           
601         1           2007-01-21  2000        0.5           
601         2           2007-01-25  1000        0.5           

Se invece si ottengono degli errori, dovrebbe essere sufficiente correggere il file prova-interrogazione-movimenti-vu.sql e poi riprovare.

719.2   Vista della relazione «Movimenti» in modo da ottenere il valore unitario

Così come è possibile scrivere un'interrogazione a una relazione indicando delle espressioni, se ne può realizzare una vista, così da semplificare gli accessi a queste informazioni generate attraverso dei calcoli.

Si crei il file vista-movimenti-extra.sql, contenente il testo seguente, sostituendo le metavariabili con informazioni appropriate e rispettando la punteggiatura:

-- Vista "MovimentiExtra"
-- Esercizio di: cognome nome classe
-- Data: data
-- File: vista-movimenti-extra.sql

CREATE VIEW MovimentiExtra AS
    SELECT Movimento,
           Articolo,
           Causale,
           Data,
           Cliente,
           Fornitore,
           Quantita,
           Valore,
           (Valore/Quantita) AS ValoreUnitario
           FROM Movimenti;

La vista MovimentiExtra che si ottiene in questo modo, include tutti gli attributi della relazione Movimenti, aggiungendo l'attributo virtuale ValoreUnitario, ottenuto dividendo il valore complessivo per la quantità movimentata.

Una volta completato e salvato il file vista-movimenti-extra.sql, se ne deve controllare il funzionamento con la base di dati:

sqlite3 mag.db < vista-movimenti-extra.sql[Invio]

Se non vengono generati dei messaggi, l'operazione dovrebbe essere stata completata con successo, altrimenti, se la vista è stata creata, ma in modo errato, è necessario eliminarla, quindi si può correggere il file vista-movimenti-extra.sql e riprovare. Per eliminare la vista creata in modo errato, si può utilizzare il programma sqlite3 in modo interattivo, come già mostrato in altri capitoli (istruzione DROP VIEW).

Quando si ritiene di avere creato la vista in modo corretto, è bene verificare di avere ottenuto il risultato desiderato:

sqlite3 mag.db[Invio]

SQLite version ...
Enter ".help" for instructions

sqlite> .headers on[Invio]

sqlite> .mode columns[Invio]

sqlite> SELECT * FROM MovimentiExtra[Invio]

Movimento Articolo Causale Data       Cliente Fornitore Quantita Valore ValoreUnitario
--------- -------- ------- ---------- ------- --------- -------- ------ --------------
1         2        1       2007-01-15         3         10000    100    0.01          
2         2        2       2007-01-16 2                 1000     10     0.01          
3         102      1       2007-01-17         2         1000     200    0.2           
4         102      2       2007-01-18 1                 100      20     0.2           
5         401      1       2007-01-19         1         1000     200    0.2           
6         401      2       2007-01-20 3                 200      20     0.2           
7         401      4       2007-01-20         1         100      20     0.2           
8         102      4       2007-01-20         2         100      20     0.2           
9         601      1       2007-01-21         3         2000     1000   0.5           
10        601      2       2007-01-25 1                 1000     500    0.5           

sqlite> .quit[Invio]

719.3   Verifica sulla creazione della vista «MovimentiExtra»

In questa verifica si deve riprendere il file vista-movimenti-extra.sql, per modificarlo, in modo da aggiungere un attributo virtuale ulteriore, contenente la quantità in forma algebrica: valori positivi per i carichi e valori negativi per gli scarichi. Dal momento che l'informazione se trattasi di carico o scarico è contenuta nella relazione Causali, anche questa va utilizzata nella costruzione della vista.

Si modifichi il file vista-movimenti-extra.sql, seguendo lo scheletro che viene proposto, per far sì che la vista MovimentiExtra contenga gli attributi seguenti:

  1. Movimento, corrispondente al numero di sequenza assegnato a ogni movimento nella relazione Movimenti;

  2. Articolo, corrispondente al codice articolo della relazione Movimenti;

  3. Causale, corrispondente al codice causale della relazione Movimenti;

  4. Data, corrispondente alla data del movimento nella relazione Movimenti;

  5. Cliente, corrispondente al codice cliente della relazione Movimenti;

  6. Fornitore, corrispondente al codice fornitore della relazione Movimenti;

  7. Quantità, corrispondente alla quantità movimentata nella relazione Movimenti;

  8. Valore, corrispondente al valore del movimento, nella relazione Movimenti;

  9. ValoreUnitario, corrispondente al valore unitario del movimento, ottenuto dividendo il valore complessivo per la quantità (dalla relazione Movimenti);

  10. QuantitaAlgebrica, corrispondente alla quantità movimentata, con segno, ottenuta moltiplicando l'attributo Variazione della relazione Causali all'attributo Quantita della relazione Movimenti.

Figura 719.8. Scheletro del file vista-movimenti-extra.sql, da completare.

-- Vista "MovimentiExtra"
-- Esercizio di: cognome nome classe
-- Data: data
-- File: vista-movimenti-extra.sql

CREATE VIEW MovimentiExtra AS
    SELECT Movimenti.Movimento                     AS Movimento,
           Movimenti.Articolo                      AS Articolo,
           Movimenti.Causale                       AS Causale,
           Movimenti.Data                          AS Data,
           Movimenti.Cliente                       AS Cliente,
           Movimenti.Fornitore                     AS Fornitore,
           Movimenti.Quantita                      AS Quantita,
           Movimenti.Valore                        AS Valore,
           (Movimenti.Valore/Movimenti.Quantita)   AS ValoreUnitario,
           ...
           FROM ...
           WHERE Movimenti.Causale = Causali.causale;

Prima di poter eseguire questo file con la base di dati, occorre eliminare la vista MovimentiExtra, che già dovrebbe esistere. Si ricorda che per eliminare una vista si utilizza l'istruzione DROP VIEW e che conviene intervenire con il programma sqlite3 in modo interattivo.

Per eseguire il file vista-movimenti-extra.sql, si agisce come sempre:

sqlite3 mag.db < vista-movimenti-extra.sql[Invio]

Se la creazione della vista produce degli errori, occorre eliminare nuovamente la vista e, dopo la correzione del file vista-movimenti-extra.sql, si può ritentare.

Quando si è consapevoli di avere creato correttamente la vista MovimentiExtra, la si può interrogare come se fosse una relazione normale:

sqlite3 mag.db[Invio]

SQLite version ...
Enter ".help" for instructions

sqlite> .headers on[Invio]

sqlite> .mode column[Invio]

sqlite> SELECT * FROM MovimentiExtra;[Invio]

Si dovrebbe ottenere il listato seguente:

Movimento Articolo Causale Data        Cliente Fornitore Quantita Valore ValoreUnitario QuantitaAlgebrica
--------- -------- ------- ----------  ------- --------- -------- ------ -------------- -----------------
1         2        1       2007-01-15          3         10000    100    0.01           10000            
2         2        2       2007-01-16  2                 1000     10     0.01           -1000            
3         102      1       2007-01-17          2         1000     200    0.2            1000             
4         102      2       2007-01-18  1                 100      20     0.2            -100             
5         401      1       2007-01-19          1         1000     200    0.2            1000             
6         401      2       2007-01-20  3                 200      20     0.2            -200             
7         401      4       2007-01-20          1         100      20     0.2            -100             
8         102      4       2007-01-20          2         100      20     0.2            -100             
9         601      1       2007-01-21          3         2000     1000   0.5            2000             
10        601      2       2007-01-25  1                 1000     500    0.5            -1000            

Se tutto funziona regolarmente, si consegni per la valutazione la stampa del file vista-movimenti-extra.sql.

719.4   Conclusione

Prima di passare al capitolo successivo, si deve riprendere il file magazzino.sql e vi si deve aggiungere l'istruzione per la creazione della vista MovimentiExtra, come realizzato nella verifica appena conclusa.

Una volta aggiornato il file magazzino.sql come descritto, si deve cancellare il file mag.db e ricreare a partire dalle istruzioni contenute nel file magazzino.sql:

sqlite3 mag.db < magazzino.sql[Invio]

Se vengono segnalati degli errori, occorre correggere il file magazzino.sql, cancellare nuovamente il file mag.db, quindi si deve ripetere l'operazione. La base di dati contenuta nel file mag.db, viene usata nel capitolo successivo e non si può proseguire se non si riesce a ricrearla correttamente.


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


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

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

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory