Как да напиша SQL заявки на Microsoft Access от нулата

Как да напиша SQL заявки на Microsoft Access от нулата

Microsoft Access е може би най -мощният инструмент в целия пакет на Microsoft Office, но въпреки това мистифицира (а понякога и плаши) потребителите на Office. С по -стръмна крива на обучение от Word или Excel, как би трябвало някой да се увие около използването на този инструмент? Тази седмица Брус Епър ще разгледа някои от проблемите, породени от този въпрос от един от нашите читатели.





Читателят пита:

Имам проблеми с писането на заявка в Microsoft Access. Имам база данни с две продуктови таблици, съдържащи обща колона с цифров код на продукта и свързано име на продукта. Искам да разбера кои продукти от таблица А могат да бъдат намерени в таблица Б. Искам да добавя колона с име Резултати, която съдържа името на продукта от Таблица А, ако съществува, и името на продукта от Таблица В, когато не съществува в Таблица А. Имате ли някакви съвети?





Отговорът на Брус:

Microsoft Access е система за управление на бази данни (СУБД), предназначена за използване както на Windows, така и на Mac машини. Той използва двигателя за бази данни Jet на Microsoft за обработка и съхранение на данни. Той също така предоставя графичен интерфейс за потребителите, който почти елиминира необходимостта от разбиране на езика за структурирани заявки (SQL).





SQL е командният език, използван за добавяне, изтриване, актуализиране и връщане на информация, съхранявана в базата данни, както и за промяна на основните компоненти на базата данни, като добавяне, изтриване или промяна на таблици или индекси.

Начална точка

Ако все още не сте запознати с Access или друга RDBMS, бих ви предложил да започнете с тези ресурси, преди да продължите:



  • И така, какво е база данни? където Райън Дубе използва Excel, за да покаже основите на релационните бази данни.
  • Кратко ръководство за начало с Microsoft Access 2007 което е преглед на високо ниво на Access и компонентите, които съдържат база данни на Access.
  • Бърз урок за таблици в Microsoft Access 2007 разглежда създаването на първата ви база данни и таблици за съхраняване на вашите структурирани данни.
  • Бърз урок по заявки в Microsoft Access 2007 разглежда средствата за връщане на конкретни части от данните, съхранявани в таблиците на базата данни.

Основното разбиране на представените в тези статии понятия ще направи следното малко по -лесно смилаемо.

Връзки и нормализиране на бази данни

Представете си, че управлявате компания, която продава 50 различни вида джаджи по целия свят. Имате клиентска база от 1250 и средно за месец продавате 10 000 джаджи на тези клиенти. Понастоящем използвате една електронна таблица за проследяване на всички тези продажби - ефективно една таблица от база данни. И всяка година добавя хиляди редове към вашата електронна таблица.





Горните изображения са част от електронната таблица за проследяване на поръчки, която използвате. Сега кажете, че и двамата клиенти купуват джаджи от вас няколко пъти годишно, така че да имате много повече редове и за двамата.





Ако Джоан Смит се омъжва за Тед Бейнс и взема фамилията му, всеки ред, който съдържа нейното име, сега трябва да бъде променен. Проблемът се усложнява, ако случайно имате два различни клиента с името „Joan Smith“. Просто стана много по -трудно да поддържате данните си за продажбите последователни поради доста често срещано събитие.

Като използваме база данни и нормализираме данните, можем да разделим елементите в множество таблици като инвентар, клиенти и поръчки.

Просто разглеждайки клиентската част от нашия пример, бихме премахнали колоните за Име на клиента и Адрес на клиента и ги поставихме в нова таблица. На изображението по -горе също съм разбил нещата по -добре за по -подробен достъп до данните. Новата таблица съдържа и колона за първичен ключ (ClientID) - номер, който ще се използва за достъп до всеки ред в тази таблица.

В първоначалната таблица, където премахнахме тези данни, бихме добавили колона за външен ключ (ClientID), която е връзката към правилния ред, съдържаща информацията за този конкретен клиент.

Сега, когато Джоан Смит променя името си на Джоан Бейнс, промяната трябва да се направи само веднъж в таблицата на клиента. Всяка друга справка от присъединени таблици ще издърпа правилното име на клиента, а доклад, който разглежда това, което Джоан е закупила през последните 5 години, ще получи всички поръчки както под моминското, така и под семейното й име, без да се налага да променя начина на генериране на отчета .

Като допълнителна полза, това също намалява общото количество консумирано хранилище.

Присъединете се към типове

SQL дефинира пет различни типа съединения: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER и CROSS. Ключовата дума OUTER е незадължителна в SQL израза.

Microsoft Access позволява използването на INNER (по подразбиране), LEFT OUTER, RIGHT OUTER и CROSS. FULL OUTER не се поддържа като такъв, но като използвате LEFT OUTER, UNION ALL и RIGHT OUTER, той може да бъде фалшифициран за цената на повече цикли на процесора и I/O операции.

Резултатът от CROSS съединение съдържа всеки ред от лявата таблица, сдвоен с всеки ред от дясната таблица. Единственият път, когато съм виждал да се използва CROSS присъединяване, е по време на тестване на натоварване на сървъри на бази данни.

Нека да разгледаме как работят основните съединения, след което ще ги модифицираме според нашите нужди.

Нека започнем със създаването на две таблици, ProdA и ProdB, със следните свойства на дизайна.

Автономерирането е автоматично нарастващо дълго цяло число, присвоено на записи, когато се добавят към таблицата. Опцията Текст не е променена, така че ще приеме текстов низ с дължина до 255 знака.

Сега ги попълнете с някои данни.

За да покажа разликите в начина на работа на трите типа съединяване, изтрих записи 1, 5 и 8 от ProdA.

Следващия, създайте нова заявка като отидете на Създаване> Дизайн на заявки . Изберете двете таблици от диалоговия прозорец Показване на таблица и щракнете върху Добавяне , тогава Близо .

Щракнете върху ProductID в таблица ProdA, плъзнете я към ProductID в таблица ProdB и освободете бутона на мишката, за да създадете връзката между таблиците.

Щракнете с десния бутон върху реда между таблиците, представящ връзката между елементите и изберете Свойства за присъединяване .

По подразбиране е избран тип съединяване 1 (INNER). Вариант 2 е ляв външен съединител и 3 е десен външен съединение.

Първо ще разгледаме присъединяването INNER, така че щракнете върху OK, за да отхвърлите диалоговия прозорец.

В дизайнера на заявки изберете полетата, които искаме да видим от падащите списъци.

Когато изпълним заявката (червеният удивителен знак в лентата), тя ще покаже полето ProductName от двете таблици със стойността от таблицата ProdA в първата колона и ProdB във втората.

Забележете, че резултатите показват само стойности, при които ProductID е равен и в двете таблици. Въпреки че има запис за ProductID = 1 в таблица ProdB, той не се показва в резултатите, тъй като ProductID = 1 не съществува в таблица ProdA. Същото важи и за ProductID = 11. Той съществува в таблица ProdA, но не и в таблица ProdB.

С помощта на бутона Изглед на лентата и превключването към SQL изглед можете да видите SQL заявката, генерирана от дизайнера, използвана за получаване на тези резултати.

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

Връщайки се към Design View, променете типа съединяване на 2 (НАЛЯВО ВЪН). Изпълнете заявката, за да видите резултатите.

Както можете да видите, всеки запис в таблица ProdA е представен в резултатите, докато само тези в ProdB, които имат съвпадащ запис ProductID в таблица ProdB, се показват в резултатите.

Празното пространство в колоната ProdB.ProductName е специална стойност (NULL), тъй като няма съвпадаща стойност в таблицата ProdB. Това ще се окаже важно по -късно.

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

Опитайте същото с третия тип съединяване (RIGHT OUTER).

Резултатите показват всичко от таблицата ProdB, докато показва празни (известни като NULL) стойности, където таблицата ProdA няма съответстваща стойност. Досега това ни доближава най -много до желаните резултати във въпроса на нашия читател.

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

Използване на функции в заявка

Резултатите от функция също могат да бъдат върнати като част от заявка. Искаме нова колона с име „Резултати“ да се появи в нашия набор от резултати. Стойността му ще бъде съдържанието на колоната ProductName на таблица ProdA, ако ProdA има стойност (не е NULL), в противен случай трябва да се вземе от таблица ProdB.

Функцията Незабавна IF (IIF) може да се използва за генериране на този резултат. Функцията приема три параметъра. Първото е условие, което трябва да се оцени до True или False стойност. Вторият параметър е стойността, която трябва да бъде върната, ако условието е True, а третият параметър е стойността, която трябва да бъде върната, ако условието е False.

Конструкцията на пълната функция за нашата ситуация изглежда така:

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

Забележете, че параметърът условие не проверява за равенство. Нулева стойност в база данни няма стойност, която може да бъде сравнена с всяка друга стойност, включително друга Null. С други думи, Null не е равно на Null. Никога. За да преминем през това, ние вместо това проверяваме стойността с помощта на ключовата дума „Is“.

Можехме също да използваме „Is Not Null“ и да променим реда на параметрите True и False, за да получим същия резултат.

Когато поставяте това в конструктора на заявки, трябва да въведете цялата функция в полето Field:. За да го накарате да създаде колоната „Резултати“, трябва да използвате псевдоним. За да направите това, предговорете функцията с „Резултати:“, както се вижда на следната екранна снимка.

Еквивалентният SQL код за това ще бъде:

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;

Сега, когато изпълним тази заявка, тя ще даде тези резултати.

как да заобиколите блокиран уебсайт

Тук виждаме за всеки запис, където таблицата ProdA има стойност, тази стойност се отразява в колоната Резултати. Ако няма запис в таблицата ProdA, записът от ProdB се появява в Резултати, което е точно това, което нашият читател попита.

За повече ресурси за изучаване на Microsoft Access, вижте „Как да научите Microsoft Access“ на Джоел Лий: 5 безплатни онлайн ресурса.

Дял Дял Туит електронна поща Струва ли си да надстроите до Windows 11?

Windows е преработен. Но достатъчно ли е това, за да ви убеди да преминете от Windows 10 към Windows 11?

Прочетете Напред
Свързани теми
  • Производителност
  • Попитайте експертите
За автора Брус Епър(13 статии са публикувани)

Брус играе с електроника от 70 -те години, компютри от началото на 80 -те и отговаря точно на въпросите за технологиите, които не е използвал и не е виждал през цялото време. Той също се дразни, опитвайки се да свири на китара.

Още от Брус Епър

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и изключителни оферти!

Щракнете тук, за да се абонирате