реклама

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

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

Имам проблеми с писането на заявка в Microsoft Access.

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

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

Имате ли съвет?

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

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

instagram viewer

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

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

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

  • И така, какво е база данни? И така, какво е база данни, така или иначе? [MakeUseOf обяснява]За програмист или технологичен ентусиаст концепцията за база данни е нещо, което наистина може да се приеме за даденост. Въпреки това, за много хора самата концепция на база данни е малко чужда ... Прочетете още където Ryan Dube използва Excel, за да покаже основите на релационните бази данни.
  • Бързо ръководство за започване на работа с Microsoft Access 2007 Бързо ръководство за започване на работа с Microsoft Access 2007 Прочетете още който е преглед на високо ниво на Access и компонентите, които съдържат база данни на Access.
  • Бърз урок към таблиците в Microsoft Access 2007 Бърз урок към таблиците в Microsoft Access 2007 Прочетете още разглежда създаването на първата ви база данни и таблици, за да съхранявате вашите структурирани данни.
  • Бърз урок за запитвания в Microsoft Access 2007 Бърз урок за запитвания в Microsoft Access 2007 Прочетете още разглежда средствата за връщане на конкретни части от данните, съхранявани в таблиците на базата данни.

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

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

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

плосък маса-1плосък маса 2

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

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

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

нормализиране

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

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

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

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

Видове за присъединяване

SQL дефинира пет различни типа присъединения: ВЪТРЕШНО, ЛЯВО ВЪНШНО, НАДЯСНО ВЪНШНО, ПЪЛНО ИЗКЛЮЧВАНЕ и CROSS. Ключовата дума OUTER не е задължителна в оператора SQL.

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

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

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

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

достъп на таблицата DEFS

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

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

достъп шкафчета

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

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

ново запитване

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

design_view

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

join_properties

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

Първо ще разгледаме присъединяването на ВЪТРЕШНИТЕ, така че щракнете върху OK, за да прекратите диалога.

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

дизайн-изглед-2

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

inner_join

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

дизайн-лента

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

ИЗБЕРЕТЕ ProdA.ProductName, ProdB.ProductName ОТ ПРОДА ВЪТРЕШНИЯ ПРИЛУЧАЙТЕ ProdB ON ProdA.ProductID = ProdB.ProductID;

Връщайки се към Design View, променете типа на присъединяване на 2 (LEFT OUTER). Изпълнете заявката, за да видите резултатите.

left_outer_join

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

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

ИЗБЕРЕТЕ ProdA.ProductName, ProdB.ProductName ОТ ProdA ЛЯВО ПРИЛУЧАЙТЕ ProdB ON ProdA.ProductID = ProdB.ProductID;

Опитайте същото с третия тип присъединяване (НАДЯСНО ВЪНШНО).

right_outer_join

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

ИЗБЕРЕТЕ ProdA.ProductName, ProdB.ProductName ОТ ПРОДАВАЙТЕ НАДЯСНО ПРИЛОЖЕТЕ ProdB ON ProdA.ProductID = ProdB.ProductID;

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

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

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

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

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

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

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

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

десен външен изгладени резултати дизайн

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

ИЗБЕРЕТЕ ProdA.ProductName, ProdB.ProductName, IIF (ProdA.ProductID е нула, ProdB.ProductName, ProdA.ProductName) КАТО Резултати ОТ PRODA ПРАВО ПРИЛОЖЕТЕ ProdB ON ProdA.ProductID = ProdB.ProductID;

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

right_outer_with_aliased_results

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

За повече ресурси за научаване на Microsoft Access, вижте Джоел Лий Как да научите Microsoft Access: 5 безплатни онлайн ресурса Как да научите Microsoft Access: 5 безплатни онлайн ресурсаТрябва ли да управлявате голямо количество данни? Трябва да погледнете в Microsoft Access. Нашите безплатни учебни ресурси могат да ви помогнат да започнете и да усвоите уменията за по-сложни проекти. Прочетете още .

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