Annuncio pubblicitario

Microsoft Access è senza dubbio lo strumento più potente dell'intera suite di Microsoft Office, ma confonde (e talvolta spaventa) gli utenti esperti di Office. Con una curva di apprendimento più ripida di Word o Excel, come si può supporre che qualcuno possa avvolgere la testa nell'uso di questo strumento? Questa settimana, Bruce Epper esamineremo alcuni dei problemi sollevati da questa domanda di uno dei nostri lettori.

Un lettore chiede:

Ho problemi a scrivere una query in Microsoft Access.

Ho un database con due tabelle di prodotti che contengono una colonna comune con un codice prodotto numerico e un nome prodotto associato.

Voglio scoprire quali prodotti della tabella A si trovano nella tabella B. Voglio aggiungere una colonna denominata Risultati che contenga il nome del prodotto dalla tabella A se esiste, e il nome del prodotto dalla tabella B quando non esiste nella tabella A.

Hai qualche consiglio?

Risposta di Bruce:

Microsoft Access è un Database Management System (DBMS) progettato per l'uso su macchine Windows e Mac. Utilizza il motore di database Jet di Microsoft per l'elaborazione e l'archiviazione dei dati. Fornisce inoltre un'interfaccia grafica per gli utenti che elimina quasi la necessità di comprendere Structured Query Language (SQL).

instagram viewer

SQL è il linguaggio di comando utilizzato per aggiungere, eliminare, aggiornare e restituire informazioni archiviate in database, nonché modificare i componenti principali del database come l'aggiunta, l'eliminazione o la modifica di tabelle o indici.

Punto di partenza

Se non hai già familiarità con Access o un altro RDBMS, ti suggerisco di iniziare con queste risorse prima di procedere:

  • Quindi cos'è un database? Quindi cos'è un database? [MakeUseOf Explains]Per un programmatore o un appassionato di tecnologia, il concetto di un database è qualcosa che può davvero essere dato per scontato. Tuttavia, per molte persone il concetto di database stesso è un po 'estraneo ... Leggi di più dove Ryan Dube utilizza Excel per mostrare le basi dei database relazionali.
  • Una guida rapida per iniziare con Microsoft Access 2007 Una guida rapida per iniziare con Microsoft Access 2007 Leggi di più che è una panoramica di alto livello di Access e dei componenti che compongono un database di Access.
  • Un breve tutorial per le tabelle in Microsoft Access 2007 Un breve tutorial per le tabelle in Microsoft Access 2007 Leggi di più dà un'occhiata alla creazione del tuo primo database e delle tabelle per archiviare i tuoi dati strutturati.
  • Un breve tutorial sulle query in Microsoft Access 2007 Un breve tutorial sulle query in Microsoft Access 2007 Leggi di più esamina i mezzi per restituire parti specifiche dei dati archiviati nelle tabelle del database.

Avere una conoscenza di base dei concetti forniti in questi articoli renderà più facile da digerire quanto segue.

Relazioni con il database e normalizzazione

Immagina di gestire un'azienda che vende 50 diversi tipi di widget in tutto il mondo. Hai una base clienti di 1.250 e in un mese medio vendi 10.000 widget a questi clienti. Attualmente stai utilizzando un singolo foglio di calcolo per tenere traccia di tutte queste vendite, in pratica un'unica tabella di database. E ogni anno aggiunge migliaia di righe al tuo foglio di calcolo.

TV-table-1TV-table-2

Le immagini sopra riportate fanno parte del foglio di calcolo per il tracciamento dell'ordine che stai utilizzando. Ora supponiamo che entrambi questi clienti acquistino widget da voi più volte all'anno, in modo da avere molte più righe per entrambi.

Se Joan Smith sposa Ted Baines e prende il suo cognome, ogni singola riga che contiene il suo nome ora deve essere cambiata. Il problema si aggrava se ti capita di avere due client diversi con il nome "Joan Smith". È diventato molto più difficile mantenere coerenti i tuoi dati di vendita a causa di un evento abbastanza comune.

Utilizzando un database e normalizzando i dati, possiamo separare gli articoli in più tabelle come inventario, clienti e ordini.

normalizzazione

Solo guardando la parte client del nostro esempio, rimuoveremmo le colonne per Nome cliente e Indirizzo cliente e le inseriremmo in una nuova tabella. Nell'immagine sopra, ho anche suddiviso meglio le cose per un accesso più granulare ai dati. La nuova tabella contiene anche una colonna per una chiave primaria (ClientID), un numero che verrà utilizzato per accedere a ciascuna riga di questa tabella.

Nella tabella originale in cui abbiamo rimosso questi dati, aggiungeremmo una colonna per una chiave esterna (ClientID) che è ciò che collega alla riga corretta contenente le informazioni per questo particolare client.

Ora, quando Joan Smith cambia nome in Joan Baines, la modifica deve essere effettuata una sola volta nella tabella Client. Ogni altro riferimento dalle tabelle unite trarrà il nome del cliente corretto e un rapporto che sta esaminando ciò per cui Joan ha acquistato gli ultimi 5 anni riceveranno tutti gli ordini sia con il nome da nubile che da quello sposato, senza dover cambiare il rapporto generato.

Come ulteriore vantaggio, ciò riduce anche la quantità complessiva di spazio di archiviazione consumato.

Unisci i tipi

SQL definisce cinque diversi tipi di join: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER e CROSS. La parola chiave OUTER è facoltativa nell'istruzione SQL.

Microsoft Access consente l'uso di INNER (impostazione predefinita), LEFT OUTER, RIGHT OUTER e CROSS. FULL OUTER non è supportato in quanto tale, ma utilizzando LEFT OUTER, UNION ALL e RIGHT OUTER, può essere simulato a costo di più cicli della CPU e operazioni di I / O.

L'output di un join CROSS contiene ogni riga della tabella di sinistra accoppiata con ogni riga della tabella di destra. L'unica volta che ho mai visto un join CROSS utilizzato è durante il test di carico dei server di database.

Diamo un'occhiata a come funzionano i join di base, quindi li modificheremo in base alle nostre esigenze.

Iniziamo creando due tabelle, ProdA e ProdB, con le seguenti proprietà di progettazione.

accesso-table-defs

AutoNumber è un numero intero lungo con incremento automatico assegnato alle voci man mano che vengono aggiunte alla tabella. L'opzione Testo non è stata modificata, quindi accetta una stringa di testo lunga fino a 255 caratteri.

Ora popolarli con alcuni dati.

Access-tavoli

Per mostrare le differenze nel funzionamento dei 3 tipi di join, ho eliminato le voci 1, 5 e 8 da ProdA.

Quindi, crea una nuova query andando a Crea> Progettazione query. Selezionare entrambe le tabelle dalla finestra di dialogo Mostra tabella e fai clic su Aggiungi, poi Vicino.

new-query

Fare clic su ProductID nella tabella ProdA, trascinarlo su ProductID nella tabella ProdB e rilasciare il pulsante del mouse per creare la relazione tra le tabelle.

design_view

Fare clic con il tasto destro sulla riga tra le tabelle che rappresentano la relazione tra gli elementi e seleziona Unisci proprietà.

join_properties

Per impostazione predefinita, è selezionato il tipo di join 1 (INTERNO). L'opzione 2 è un join ESTERNO SINISTRA e 3 è un join ESTERNO DESTRA.

Vedremo prima il join INNER, quindi fai clic su OK per chiudere la finestra di dialogo.

In Query Designer, selezionare i campi che vogliamo vedere dagli elenchi a discesa.

Design-view-2

Quando eseguiamo la query (il punto esclamativo rosso nella barra multifunzione), mostrerà il campo ProductName da entrambe le tabelle con il valore dalla tabella ProdA nella prima colonna e ProdB nella seconda.

inner_join

Si noti che i risultati mostrano solo valori in cui ProductID è uguale in entrambe le tabelle. Anche se è presente una voce per ProductID = 1 nella tabella ProdB, non viene visualizzata nei risultati poiché ProductID = 1 non esiste nella tabella ProdA. Lo stesso vale per ProductID = 11. Esiste nella tabella ProdA ma non nella tabella ProdB.

Design-nastro

Utilizzando il pulsante Visualizza sulla barra multifunzione e passando a Vista SQL, è possibile visualizzare la query SQL generata dal designer utilizzata per ottenere questi risultati.

SELEZIONA ProdA.ProductName, ProdB.ProductName DA ProdA INNER JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Tornando alla visualizzazione struttura, modificare il tipo di join su 2 (ESTERNO SINISTRA). Esegui la query per vedere i risultati.

left_outer_join

Come puoi vedere, ogni voce nella tabella ProdA è rappresentata nei risultati mentre solo quelli in ProdB che hanno una voce ProductID corrispondente nella tabella ProdB appaiono nei risultati.

Lo spazio vuoto nella colonna ProdB.ProductName è un valore speciale (NULL) poiché non esiste un valore corrispondente nella tabella ProdB. Ciò si rivelerà importante in seguito.

SELEZIONA ProdA.ProductName, ProdB.ProductName DA ProdA LEFT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Prova la stessa cosa con il terzo tipo di join (ESTERNO DESTRA).

right_outer_join

I risultati mostrano tutto dalla tabella ProdB mentre mostra valori vuoti (noti come NULL) in cui la tabella ProdA non ha un valore corrispondente. Finora, questo ci avvicina ai risultati desiderati nella domanda del nostro lettore.

SELEZIONA ProdA.ProductName, ProdB.ProductName DA ProdA DESTRA UNISCITI ProdB SU ProdA.ProductID = ProdB.ProductID;

Utilizzo delle funzioni in una query

I risultati di una funzione possono anche essere restituiti come parte di una query. Vogliamo che una nuova colonna denominata "Risultati" venga visualizzata nel nostro set di risultati. Il suo valore sarà il contenuto della colonna ProductName della tabella ProdA se ProdA ha un valore (non è NULL), altrimenti dovrebbe essere preso dalla tabella ProdB.

La funzione Immediate IF (IIF) può essere utilizzata per generare questo risultato. La funzione accetta tre parametri. La prima è una condizione che deve valutare un valore Vero o Falso. Il secondo parametro è il valore da restituire se la condizione è True e il terzo parametro è il valore da restituire se la condizione è False.

Il costrutto completo della funzione per la nostra situazione è simile al seguente:

IIF (ProdA.ProductID Is Null, ProdB.ProductName, ProdA.ProductName)

Si noti che il parametro condition non verifica l'uguaglianza. Un valore Null in un database non ha un valore che può essere confrontato con qualsiasi altro valore, incluso un altro Null. In altre parole, Null non è uguale a Null. Mai. Per superare questo, controlliamo invece il valore usando la parola chiave "Is".

Avremmo anche potuto usare "Is Not Null" e modificare l'ordine dei parametri True e False per ottenere lo stesso risultato.

Quando si inserisce questo in Progettazione query, è necessario digitare l'intera funzione nel campo: voce. Per farlo creare la colonna "Risultati", devi utilizzare un alias. Per fare ciò, prefiggi la funzione con "Risultati:" come mostrato nella seguente schermata.

-risultati destra-esterno-alias-design

Il codice SQL equivalente per fare ciò sarebbe:

SELEZIONA ProdA.ProductName, ProdB.ProductName, IIF (ProdA.ProductID Is Is Null, ProdB.ProductName, ProdA.ProductName) AS Risultati DA PRODA DESTRA UNISCI ProdB ON ProdA.ProductID = ProdB.ProductID;

Ora, quando eseguiamo questa query, produrrà questi risultati.

right_outer_with_aliased_results

Qui vediamo per ogni voce in cui la tabella ProdA ha un valore, quel valore si riflette nella colonna Risultati. Se non c'è una voce nella tabella ProdA, la voce di ProdB appare nei risultati, esattamente ciò che il nostro lettore ha chiesto.

Per ulteriori risorse per l'apprendimento di Microsoft Access, dai un'occhiata a Joel Lee Come imparare Microsoft Access: 5 risorse online gratuite Come imparare Microsoft Access: 5 risorse online gratuiteDevi gestire una grande quantità di dati? Dovresti esaminare Microsoft Access. Le nostre risorse di studio gratuite possono aiutarti a iniziare e ad apprendere le competenze per progetti più complessi. Leggi di più .

Bruce gioca con l'elettronica dagli anni '70, i computer dai primi anni '80 e risponde accuratamente a domande sulla tecnologia che non ha mai usato né visto per tutto il tempo. Si infastidisce anche tentando di suonare la chitarra.