mercoledì 26 novembre 2008

Particolarità riscontrate lavorando con l'SQL in Access: differenze rispetto agli altri DBMS

Come ho avuto già modo di illustrare nel post precedente, malgrado gli sforzi effettuati per la creazione di un liguaggio altamente standardizzato, nella realtà dei fatti l'SQL "standard" può presentare delle variazioni più o meno marcate a seconda del DBMS preso in considerazione.
Access, a tal proposito, è fondamentalmente un DBMS sui generis.

A differenza di altri ambienti di sviluppo, in Access un unico file comprende tutti gli strumenti per lo sviluppo delle applicazioni: tabelle, query, maschere, report. Le tabelle sono i contenitori dove vengono memorizzati i dati; le query sono gli strumenti idonei all'interrogazione ed alla manipolazione dei dati che avvengono attraverso un mini-SQL; le maschere consentono di interagire con i dati delle tabelle o delle query attraverso un'interfaccia grafica; i report, infine, consentono principalmente di visualizzare dei risultati basati sui dati.

Negli anni '90 Microsoft inserisce Access nel pacchetto dei prodotti Office e Access, oltre ad essere un programma in grado di gestire le informazioni "depositate" in un database relazionale, si rivela potente e flessibile ma soprattutto
user friendly, tanto che può essere utilizzato sia per progetti "semplici" (si pensi ad una rubrica telefonica) che "complessi" (una ricerca scientifica). Access rientra in quella categoria di RDBMS che possono relazionarsi con il linguaggio SQL.
Per poter usare SQL in Access è necessario definire una query e scegliere l’opzione "Visualizza SQL", cosi facendo è possibile aprire una finestra di testo (la c.d. "Finestra SQL") in cui riportare le istruzioni SQL.

In Access è possibile creare tabelle e stabilire relazioni (join).

Ad esempio...

Facciamo partire Access e creiamo un database vuoto dandogli un nome, per esempio magazzino. Le relazioni del modello relazionale possono essere espresse graficamente mediante delle tabelle, infatti, in Access per creare una relazione dobbiamo selezionare la voce Tabelle e poi Crea Tabella in Visualizzazione Struttura.


In Nome Campo va il nome dell'attributo e in Tipo dati il dominio a cui l'attributo appartiene; poiché la nostra prima relazione, in questo caso, potrebbe essere PRODOTTO inseriremo nella prima colonna, per esempio, C
odProdotto, CodAutore, Titolo, Descrizione e IdSupporto e nella seconda il dominio che sarà di tipo testo per CodProdotto, CodAutore, Titolo e Descrizione e di tipo numerico per IdSupporto. Infine, per completare la relazione dobbiamo specificare qual è la chiave, cioè quel valore che identifica univocamente un'istanza, che nel nostro caso è ovviamente CodProdotto. Per fare questo selezioniamo la riga relativa a CodProdotto e clicchiamo sul simbolo della chiave.


Salviamo la tabella con il nome PRODOTTO e chiudiamo la finestra. Utilizziamo la stessa procedura per creare altre due tabelle (ad esempio SUPPORTO e AUTORE). Alla fine il risultato dovrebbe essere:


Non ci resta che aggiungere i vincoli di integrità referenziale, cioè quei valori di un campo di una tabella che devono appartenere ad un'altra tabella e essere chiave di quest'ultima. Nel nostro caso un valore di IdSupporto della tabella PRODOTTO deve prima appartenere alla tabella SUPPORTO come valore chiave, perché solo da questa tabella possiamo capire quell'ID a che supporto corrisponde. Se, per esempio, inseriamo in PRODOTTO un valore 4 per IdSupporto e nella tabella SUPPORTO il valore 4 non esiste, introdurremo dei dati non validi a scapito della validità della base dati. Per aggiungere questi vincoli clickiamo sull'icona Relazioni in alto a destra, come si può vedere dalla figura sopra. Aggiungiamo le tre tabelle allo schema delle relazioni con il tasto aggiungi e facciamo i vari collegamenti che si effettuano cliccando su un attributo e trascinandolo col mouse fino a quello corrispondente. Colleghiamo CodAutore della tabella AUTORE con CodAutore della tabella PRODOTTO e IdSupporto della tabella SUPPORTO con IdSupporto della tabella PRODOTTO. Quando compare la finestra modifica relazioni clikkiamo su applica integrità referenziale e poi su crea. L'indicazione 1 a infinito vuol dire nel nostro caso che più prodotti possono tenere lo stesso autore o supporto. Il risultato sarà:





Peculiarità del linguaggio SQL di Access:

- Non accetta il costrutto CHECK (è un vincolo).

-Cambia la valutazione dell’operatore COUNT: se l’argomento è un attributo, non vengono restituiti i singoli valori dell’attributo, ma il numero dei valori non nulli.

-La clausola DISTINCT non può essere utilizzata.

- L'operatore JOIN deve essere sempre identificato con il termine INNER od OUTER, mentre con Oracle utilizzeremmo, per esempio, l'operatore WHERE.

- Il carattere JOLLY (corrisponde a qualsiasi stringa composta da zero o più caratteri) viene indicato con il segno asterisco (*) e non con il simbolo della percentuale (%).

-Riconosce sia il singolo apice (') che i doppi apici (") nell’identificazione delle stringhe alfanumeriche.

- Per le stringhe che contengono date Access permette di adottare la formula latina GG/MM/AAAA mentre per alcuni DBMS di origine anglosassone ciò non è possibile. Nei comandi le date vanno racchiuse attraverso l'apice singolo ('), per la maggior parte dei dialetti SQL, mentre in Access si usa il cancelletto (#).

- La clausola TOP può essere utilizzata per selezionare un certo numero di tuple dal risultato.

- Le parentesi quadre racchiudono gli identificativi di tabelle e attributi.


Per concludere, possiamo fare un confronto tra il linguaggio SQL di Access e ANSI SQL dal momento che nell'SQL di Access vengono utilizzate parole riservate e funzionalità non supportate in SQL ANSI.


Più nello specifico:

- Al costrutto BETWEEN...AND vengono applicate regole diverse con la sintassi seguente: espr1 [NOT] BETWEEN valore1 AND valore2

- In SQL di Microsoft Access valore1 può essere maggiore di valore2, mentre in SQL ANSI valore1 deve essere uguale o inferiore a valore2.

- Se si utilizza l'operatore LIKE, l'SQL di Access supporta sia i caratteri jolly SQL ANSI sia quelli specifici di Access. L'utilizzo di tali caratteri è tuttavia reciprocamente esclusivo, in quanto l'utilizzo di un set di caratteri esclude la possibilità di utilizzare l'altro. I caratteri jolly SQL ANSI possono essere utilizzati solo con il modulo di gestione di database di Microsoft Access e con il provider Microsoft OLE DB per Microsoft Office Access 2007. Se si cerca di utilizzare i caratteri jolly SQL ANSI tramite Office Access 2007 o DAO, tali caratteri vengono interpretati come valori letterali.

- SQL di Access non supporta la clausola LIMIT TO nn ROWS di SQL ANSI, utilizzata per limitare il numero di righe restituite da una query. È possibile utilizzare solo la clausola WHERE per restringere l'ambito di una query.

- Inoltre, l'SQL di Access non supporta riferimenti alla funzione di aggregazione DISTINCT (Ad esempio, non supporta SUM(DISTINCT nomecolonna).


In generale, possiamo sintetizzare tutto quanto sopra detto affermando che l'SQL di Microsoft Access presenta minori limitazioni e supporta espressioni più efficaci.

Nessun commento: