Publicitate

Microsoft Access este, probabil, cel mai puternic instrument din întreaga suită Microsoft Office, totuși mistifică (și uneori sperie) utilizatorii de putere Office. Cu o curbă de învățare mai abruptă decât Word sau Excel, cum se presupune că cineva își înfășoară capul în jurul folosirii acestui instrument? Săptămâna aceasta, Bruce Epper va analiza unele dintre problemele stimulate de această întrebare de la unul dintre cititorii noștri.

Un cititor întreabă:

Am probleme la scrierea unei interogări în Microsoft Access.

Am o bază de date cu două tabele de produse care conțin o coloană comună cu un cod de produs numeric și un nume de produs asociat.

Vreau să aflu ce produse din Tabelul A pot fi găsite în Tabelul B. Doresc să adaug o coloană denumită Rezultate care să conțină numele produsului din tabelul A, dacă există, și numele produsului din tabelul B atunci când nu există în tabelul A.

Aveți vreun sfat?

Răspunsul lui Bruce:

Microsoft Access este un sistem de gestionare a bazelor de date (DBMS) conceput pentru utilizare atât pe mașini Windows cât și pe Mac. Utilizează motorul bazei de date Jet de Microsoft pentru procesarea și stocarea datelor. De asemenea, oferă o interfață grafică pentru utilizatori care elimină aproape nevoia de a înțelege Structurat Query Language (SQL).

instagram viewer

SQL este limbajul de comandă utilizat pentru a adăuga, șterge, actualiza și returna informațiile stocate în fișierul baza de date precum și modificarea componentelor de bază ale bazei de date, cum ar fi adăugarea, ștergerea sau modificarea tabelelor sau indici.

Punct de start

Dacă nu aveți deja o familiaritate cu Access sau cu un alt RDBMS, v-aș sugera să începeți cu aceste resurse înainte de a continua:

  • Deci, ce este o bază de date? Deci, ce este o bază de date, oricum? [FaceUseOf Explică]Pentru un programator sau un pasionat de tehnologie, conceptul unei baze de date este ceva ce poate fi cu adevărat luat. Cu toate acestea, pentru mulți oameni conceptul unei baze de date în sine este un pic străin ... Citeste mai mult unde Ryan Dube utilizează Excel pentru a arăta elementele de bază ale bazelor de date relaționale.
  • Un ghid rapid pentru a începe cu Microsoft Access 2007 Un ghid rapid pentru a începe cu Microsoft Access 2007 Citeste mai mult care este o imagine de ansamblu la nivel înalt a Access și a componentelor care cuprind o bază de date Access.
  • Un tutorial rapid pentru tabele în Microsoft Access 2007 Un tutorial rapid pentru tabele în Microsoft Access 2007 Citeste mai mult aruncă o privire la crearea primei tale baze de date și a tabelelor pentru a stoca datele structurate.
  • Un tutorial rapid despre întrebări în Microsoft Access 2007 Un tutorial rapid despre întrebări în Microsoft Access 2007 Citeste mai mult analizează mijloacele pentru a returna anumite porțiuni de date stocate în tabelele bazei de date.

Dacă aveți o înțelegere de bază a conceptelor furnizate în aceste articole, acestea vor fi ușor de digerat.

Relații de baze de date și normalizare

Imaginați-vă că conduceți o companie care vinde 50 de tipuri diferite de widget-uri în întreaga lume. Aveți o bază de clienți de 1.250 și, în medie, vinde 10.000 de widget-uri acestor clienți. În prezent utilizați o singură foaie de calcul pentru a urmări toate aceste vânzări - în mod eficient un tabel de bază de date unic. Și în fiecare an adaugă mii de rânduri în foaia de calcul.

plat table-1plat table-2

Imaginile de mai sus fac parte din foaia de calcul pentru urmărirea comenzii pe care o utilizați. Acum spuneți că ambii clienți cumpără widget-uri de la dvs. de mai multe ori pe an, astfel încât să aveți mult mai multe rânduri pentru amândoi.

Dacă Joan Smith se căsătorește cu Ted Baines și își ia numele de familie, fiecare rând care conține numele ei trebuie acum schimbat. Problema se agravează dacă aveți doi clienți diferiți cu numele „Joan Smith”. Tocmai a devenit mult mai greu să vă păstrați datele de vânzări consecvente din cauza unui eveniment destul de comun.

Folosind o bază de date și normalizând datele, putem separa elementele în mai multe tabele precum inventar, clienți și comenzi.

normalizare

Doar uitându-ne la porțiunea de client din exemplul nostru, am elimina coloanele pentru numele clientului și adresa clientului și le-am pune într-un nou tabel. În imaginea de mai sus, am rupt lucrurile și mai bine pentru acces mai granular la date. Noua tabelă conține și o coloană pentru o cheie primară (ClientID) - un număr care va fi utilizat pentru a accesa fiecare rând din acest tabel.

În tabelul original de unde am eliminat aceste date, am adăuga o coloană pentru o cheie externă (ClientID) care este legătura cu rândul corespunzător care conține informațiile pentru acest client particular.

Acum, când Joan Smith își schimbă numele în Joan Baines, schimbarea trebuie făcută doar o dată în tabelul Client. Fiecare altă referință din tabelele unite va trage numele clientului corespunzător și un raport care examinează pentru ce a cumpărat Joan ultimii 5 ani vor primi toate ordinele atât sub numele ei de fată cât și ale căsătoriei, fără a fi nevoie să schimbe modul în care este raportul generate.

Ca beneficiu suplimentar, aceasta reduce și cantitatea totală de stocare consumată.

Alătură-te tipurilor

SQL definește cinci tipuri diferite de uniri: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER și CROSS. Cuvântul cheie OUTER este opțional în instrucțiunea SQL.

Microsoft Access permite utilizarea INNER (implicit), LEFT OUTER, RIGHT OUTER și CROSS. FULL OUTER nu este acceptat ca atare, dar folosind LEFT OUTER, UNION ALL și RIGHT OUTER, acesta poate fi falsificat cu costul mai multor cicluri CPU și operații de I / O.

Ieșirea unei uniri CROSS conține fiecare rând al tabelului din stânga asociat cu fiecare rând al tabelului din dreapta. Singura dată când am văzut vreodată o alăturare CROSS folosită în timpul testării de încărcare a serverelor de baze de date.

Să aruncăm o privire la modul în care funcționează aderarea de bază, apoi le vom modifica pentru a se potrivi nevoilor noastre.

Să începem prin crearea a două tabele, ProdA și ProdB, cu următoarele proprietăți de proiectare.

acces-masă-defs

Numărul automat este un număr întreg care crește automat, alocat intrărilor, pe măsură ce sunt adăugate în tabel. Opțiunea Text nu a fost modificată, astfel încât va accepta un șir de text de până la 255 de caractere.

Acum, populează-le cu câteva date.

Access-mese

Pentru a arăta diferențele în modul în care funcționează cele 3 tipuri de unire, am șters intrările 1, 5 și 8 din ProdA.

Apoi, creați o nouă interogare accesând Creați> Design query. Selectați ambele tabele din dialogul Show Table și faceți clic pe Adăugare, apoi Închide.

nou-interogare

Faceți clic pe Produs în tabelul ProdA, trageți-l în ProductID în tabelul ProdB și eliberați butonul mouse-ului pentru a crea relația dintre tabele.

design_view

Faceți clic dreapta pe linia dintre tabelele care reprezintă relația dintre elemente și selectați Join Properties.

join_properties

În mod implicit, selectați tipul 1 (INNER). Opțiunea 2 este o alăturare LEFT OUTER și 3 este o îmbinare RIGHT OUTER.

Vom analiza mai întâi înscrierea INNER, apoi faceți clic pe OK pentru a respinge dialogul.

În designerul de interogări, selectați câmpurile pe care dorim să le vedem din listele derulante.

Design-view-2

Când rulăm interogarea (punctul de exclamare roșu din panglică), acesta va afișa câmpul ProductName din ambele tabele, cu valoarea din tabelul ProdA în prima coloană și ProdB în a doua.

inner_join

Observați că rezultatele arată doar valori unde ProductID este egal în ambele tabele. Chiar dacă există o intrare pentru ProductID = 1 în tabelul ProdB, aceasta nu apare în rezultate, deoarece ProductID = 1 nu există în tabelul ProdA. Același lucru este valabil pentru ProductID = 11. Există în tabelul ProdA, dar nu în tabelul ProdB.

Design-panglică

Utilizând butonul View de pe panglică și trecerea la SQL View, puteți vedea interogarea SQL generată de proiectantul folosit pentru a obține aceste rezultate.

SELECTA ProdA.ProductName, ProdB.ProductName DE LA ProdA INNER JOIN ProdB PE ProdA.ProductID = ProdB.ProductID;

Revenind la Design View, schimbați tipul de unire în 2 (LEFT OUTER). Rulați interogarea pentru a vedea rezultatele.

left_outer_join

După cum puteți vedea, fiecare intrare din tabelul ProdA este reprezentată în rezultate, în timp ce numai cele din ProdB care au o intrare ProductID potrivită în tabelul ProdB apar în rezultate.

Spațiul gol din coloana ProdB.ProductName este o valoare specială (NULL), deoarece nu există o valoare potrivită în tabelul ProdB. Acest lucru se va dovedi important mai târziu.

SELECTA ProdA.ProductName, ProdB.ProductName DE LA ProdA STÂCHIE ÎNSCRIE ProdB PE ProdA.ProductID = ProdB.ProductID;

Încercați același lucru cu al treilea tip de unire (RIGHT OUTER).

right_outer_join

Rezultatele arată totul de la tabelul ProdB în timp ce se afișează valori necompletate (cunoscute sub numele de NULL) unde tabela ProdA nu are o valoare potrivită. Până acum, acest lucru ne aduce cel mai aproape de rezultatele dorite în întrebarea cititorului nostru.

SELECTA ProdA.ProductName, ProdB.ProductName DE LA ProdA RIGHT JOIN ProdB PE ProdA.ProductID = ProdB.ProductID;

Utilizarea funcțiilor într-o interogare

Rezultatele unei funcții pot fi, de asemenea, returnate ca parte a unei interogări. Dorim să apară o nouă coloană numită „Rezultate” în setul nostru de rezultate. Valoarea acestuia va fi conținutul coloanei ProductName din tabelul ProdA dacă ProdA are o valoare (nu este NULL), altfel ar trebui să fie preluat din tabelul ProdB.

Funcția imediată (IIF) poate fi utilizată pentru a genera acest rezultat. Funcția are trei parametri. Prima este o condiție care trebuie evaluată la o valoare Adevărată sau Falsă. Al doilea parametru este valoarea care trebuie returnată dacă condiția este True, iar al treilea parametru este valoarea care trebuie returnată dacă condiția este False.

Construcția completă a funcției pentru situația noastră arată astfel:

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

Observați că parametrul condiție nu verifică egalitatea. O valoare nulă dintr-o bază de date nu are o valoare care poate fi comparată cu orice altă valoare, inclusiv cu o altă valoare nulă. Cu alte cuvinte, Null nu este egal cu Null. Vreodată. Pentru a trece peste asta, în schimb, verificăm valoarea folosind cuvântul cheie „Is”.

Am fi putut folosi de asemenea „Nu este nul” și am schimbat ordinea parametrilor Adevărat și Fals pentru a obține același rezultat.

Când introduceți acest lucru în Query Designer, trebuie să tastați întreaga funcție în intrarea Field:. Pentru a-l crea pentru a crea coloana „Rezultate”, trebuie să utilizați un alias. Pentru a face acest lucru, prefigurați funcția cu „Rezultate:” așa cum se vede în imaginea următoare.

dreapta-exterior-aliased-rezultate-design

Codul SQL echivalent pentru a face acest lucru ar fi:

SELECTĂ ProdA.ProductName, ProdB.ProductName, IIF (ProdA.ProductID Is Null, ProdB.ProductName, ProdA.ProductName) AS Rezultate de la ProdA DREPT ÎNREGISTRARE ProdB PE ProdA.ProductID = ProdB.ProductID;

Acum, când vom rula această interogare, va produce aceste rezultate.

right_outer_with_aliased_results

Aici vedem pentru fiecare intrare în care tabelul ProdA are o valoare, acea valoare este reflectată în coloana Rezultate. Dacă nu există o intrare în tabelul ProdA, intrarea de la ProdB apare în Rezultate, exact ceea ce a cerut cititorul nostru.

Pentru mai multe resurse pentru învățarea Microsoft Access, consultați Joel Lee Cum să înveți Microsoft Access: 5 resurse online gratuite Cum să înveți Microsoft Access: 5 resurse online gratuiteTrebuie să gestionați o cantitate mare de date? Ar trebui să vă uitați în Microsoft Access. Resursele noastre gratuite de studiu vă pot ajuta să începeți și să învățați abilitățile pentru proiecte mai complexe. Citeste mai mult .

Bruce se joacă cu electronica încă din anii '70, calculatoarele de la începutul anilor '80 și răspunzând cu exactitate la întrebări despre tehnologie pe care nu le-a folosit și nici nu le-a văzut întreaga perioadă. De asemenea, se enervează prin încercarea de a cânta la chitară.