Cum se scrie interogări Microsoft Access SQL de la zero

Cum se scrie interogări Microsoft Access SQL de la zero

Microsoft Access este, fără îndoială, cel mai puternic instrument din întreaga suită Microsoft Office, totuși mistifică (și uneori îi sperie) pe utilizatorii puternici ai Office. Cu o curbă de învățare mai abruptă decât Word sau Excel, cum ar trebui cineva să-și înfășoare capul în jurul utilizării acestui instrument? În această săptămână, Bruce Epper va analiza unele dintre problemele provocate de această întrebare de la unul dintre cititorii noștri.





Un cititor întreabă:

Am probleme cu 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 numeric de produs și un nume de produs asociat. Vreau să aflu ce produse din tabelul A pot fi găsite în Tabelul B. Vreau să adaug o coloană numită Rezultate care conține numele produsului din Tabelul A dacă există și numele produsului din Tabelul B 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 (SGBD) conceput pentru utilizare atât pe mașinile Windows, cât și pe cele Mac. Folosește motorul de baze de date Jet Microsoft pentru procesarea și stocarea datelor. De asemenea, oferă o interfață grafică pentru utilizatori, care aproape elimină necesitatea de a înțelege Structured Query Language (SQL).





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

Punct de start

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



  • Deci, ce este o bază de date? unde Ryan Dube folosește Excel pentru a arăta elementele de bază ale bazelor de date relaționale.
  • Un ghid rapid pentru a începe cu Microsoft Access 2007 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 din Microsoft Access 2007 analizează crearea primei baze de date și tabele pentru stocarea datelor structurate.
  • Un tutorial rapid despre interogări în Microsoft Access 2007 analizează mijloacele pentru a returna porțiuni specifice din datele stocate în tabelele bazei de date.

Având o înțelegere de bază a conceptelor furnizate în aceste articole, va fi ușor de digerat următoarele.

Relații cu 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 într-o lună medie vindeți 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 - efectiv un singur tabel de baze de date. Și în fiecare an adaugă mii de rânduri pe foaia dvs. de calcul.





Imaginile de mai sus fac parte din foaia de calcul de urmărire a comenzilor 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 acum trebuie 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 datorită unui eveniment destul de obișnuit.

Folosind o bază de date și normalizând datele, putem separa articolele în mai multe tabele, cum ar fi inventarul, clienții și comenzile.

Uitându-ne doar la porțiunea clientului din exemplul nostru, am elimina coloanele pentru Numele clientului și Adresa clientului și le-am pune într-un tabel nou. În imaginea de mai sus, am spart lucrurile mai bine pentru un acces mai granular la date. Noul tabel conține, de asemenea, 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 în care am eliminat aceste date, am adăuga o coloană pentru o cheie străină (ClientID) care este legătura cu rândul corespunzător care conține informațiile pentru acest client.

Acum, când Joan Smith își schimbă numele în Joan Baines, schimbarea trebuie făcută doar o dată în tabelul Client. Orice altă referință din tabelele alăturate va extrage numele clientului corespunzător și un raport care analizează ceea ce a cumpărat Joan în ultimii 5 ani va primi toate comenzile atât sub numele ei de fată, cât și pe cele căsătorite, fără a fi nevoie să schimbe modul în care este generat raportul. .

Ca un avantaj suplimentar, acest lucru reduce și cantitatea totală de stocare consumată.

Alăturați-vă tipurilor

SQL definește cinci tipuri diferite de îmbinări: INTERIOR, EXTERIOR STÂNGA, EXTERIOR DREPT, EXTERIOR COMPLET și CRUZ. Cuvântul cheie OUTER este opțional în instrucțiunea SQL.

Microsoft Access permite utilizarea INTERIORULUI (implicit), EXTERIOR STÂNGA, EXTERIOR DREAPTA și CROSS. FULL OUTER nu este acceptat ca atare, dar prin utilizarea LEFT OUTER, UNION ALL și RIGHT OUTER, poate fi falsificat la costul mai multor cicluri CPU și operațiuni I / O.

Ieșirea unei îmbinări CROSS conține fiecare rând al tabelului din stânga asociat cu fiecare rând al tabelei din dreapta. Singura dată când am văzut o combinație CROSS folosită este în timpul testării încărcării serverelor de baze de date.

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

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

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

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

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

Următorul, creați o nouă interogare mergând la Creați> Design interogare . Selectați ambele tabele din dialogul Afișare tabel și faceți clic pe Adăugare , atunci Închide .

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

Faceți clic dreapta pe linia dintre tabele reprezentând relația dintre elemente și selectați Alăturați proprietăților .

În mod implicit, este selectat tipul de asociere 1 (INNER). Opțiunea 2 este o îmbinare EXTERNĂ STÂNGA și 3 este o îmbinare EXTERNĂ DREAPTA.

Ne vom uita mai întâi la unirea INNER, așa că faceți clic pe OK pentru a închide dialogul.

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

Când execută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.

Observați că rezultatele arată numai valori în care ID-ul produsului 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 și pentru ProductID = 11. Există în tabelul ProdA, dar nu în tabelul ProdB.

Folosind butonul Vizualizare de pe panglică și trecând la Vizualizare SQL, puteți vedea interogarea SQL generată de proiectantul utilizat pentru a obține aceste rezultate.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA INNER JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

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

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 de identificare ProductID corespunzătoare î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.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA LEFT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

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

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

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA RIGHT JOIN ProdB ON 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 de rezultate. Valoarea sa va fi conținutul coloanei ProductName din tabelul ProdA dacă ProdA are o valoare (nu este NULL), altfel ar trebui preluată din tabelul ProdB.

Funcția Immediate IF (IIF) poate fi utilizată pentru a genera acest rezultat. Funcția ia 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.

Structura funcțională completă 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 o altă valoare nulă. Cu alte cuvinte, Null nu este egal cu Null. Vreodată. Pentru a depăși acest lucru, verificăm valoarea folosind cuvântul cheie „Este”.

Am fi putut folosi și „Is Not Null” și am fi schimbat ordinea parametrilor True și False pentru a obține același rezultat.

Când introduceți acest lucru în Query Designer, trebuie să tastați întreaga funcție în câmpul: intrare. Pentru a crea coloana „Rezultate”, trebuie să utilizați un alias. Pentru a face acest lucru, prefațați funcția cu „Rezultate”, așa cum se vede în următoarea captură de ecran.

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 Results FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

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

ce trebuie să faceți dacă contul Facebook este clonat

Aici vedem pentru fiecare intrare în care tabelul ProdA are o valoare, această valoare se reflectă î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 Cum să învățați Microsoft Access: 5 resurse online gratuite ale lui Joel Lee.

Acțiune Acțiune Tweet E-mail Merită să faceți upgrade la Windows 11?

Windows a fost reproiectat. Dar este suficient pentru a vă convinge să treceți de la Windows 10 la Windows 11?

Citiți în continuare
Subiecte asemănătoare
  • Productivitate
  • Întrebați experții
Despre autor Bruce Epper(13 articole publicate)

Bruce se joacă cu electronica din anii 70, computerele de la începutul anilor 80 și răspunde cu exactitate la întrebări despre tehnologia pe care nu a folosit-o și nici nu a văzut-o tot timpul. De asemenea, se enervează încercând să cânte la chitară.

Mai multe de la Bruce Epper

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Faceți clic aici pentru a vă abona