Реклама
Microsoft Access, пожалуй, самый мощный инструмент во всем пакете Microsoft Office, однако он загадывает (и иногда пугает) опытных пользователей Office. С более крутой кривой обучения, чем Word или Excel, как кто-то должен думать об использовании этого инструмента? Эта неделя, Брюс Эппер рассмотрим некоторые проблемы, вызванные этим вопросом у одного из наших читателей.
Читатель спрашивает:
У меня проблемы с написанием запроса в Microsoft Access.
У меня есть база данных с двумя таблицами продуктов, содержащей общий столбец с числовым кодом продукта и соответствующим названием продукта.
Я хочу узнать, какие продукты из Таблицы A можно найти в Таблице B. Я хочу добавить столбец с именем Results, который содержит название продукта из таблицы A, если он существует, и имя продукта из таблицы B, если его нет в таблице A.
У тебя есть какой-нибудь совет?
Брюс ответ:
Microsoft Access - это система управления базами данных (СУБД), предназначенная для использования на компьютерах под управлением Windows и Mac. Он использует ядро базы данных Microsoft Jet для обработки и хранения данных. Он также предоставляет графический интерфейс для пользователей, что практически исключает необходимость понимания языка структурированных запросов (SQL).
SQL - это командный язык, используемый для добавления, удаления, обновления и возврата информации, хранящейся в базы данных, а также изменять основные компоненты базы данных, такие как добавление, удаление или изменение таблиц или индексы.
Отправная точка
Если вы еще не знакомы с Access или другой RDBMS, я бы посоветовал вам начать с этих ресурсов, прежде чем продолжить:
- Так что же такое база данных? Так что же такое база данных? [MakeUseOf Объясняет]Для программиста или технологического энтузиаста концепция базы данных - это то, что действительно можно принять как должное. Тем не менее, для многих людей сама концепция базы данных немного чужая ... Читать далее где Райан Дубе использует 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 виджетов этим клиентам. В настоящее время вы используете одну электронную таблицу для отслеживания всех этих продаж - фактически одну таблицу базы данных. И каждый год добавляет тысячи строк в вашу таблицу.
Приведенные выше изображения являются частью используемой вами таблицы отслеживания заказов. Теперь скажите, что оба этих клиента покупают у вас виджеты несколько раз в год, чтобы у вас было гораздо больше строк для них обоих.
Если Джоан Смит выходит замуж за Теда Бэйнса и берет его фамилию, теперь необходимо изменить каждую строку, содержащую ее имя. Проблема усугубляется, если у вас есть два разных клиента с именем «Джоан Смит». Просто стало намного сложнее поддерживать согласованность данных о продажах из-за довольно распространенного события.
Используя базу данных и нормализуя данные, мы можем разделить элементы на несколько таблиц, таких как запасы, клиенты и заказы.
Просто глядя на клиентскую часть нашего примера, мы удалили столбцы для Client Name и Client Address и поместили их в новую таблицу. На изображении выше, я также разбил вещи лучше для более детального доступа к данным. Новая таблица также содержит столбец для первичного ключа (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 его можно подделать за счет увеличения числа циклов ЦП и операций ввода-вывода.
Вывод соединения CROSS содержит каждую строку левой таблицы в паре с каждой строкой правой таблицы. Единственный раз, когда я видел соединение CROSS, это нагрузочное тестирование серверов баз данных.
Давайте посмотрим, как работают основные объединения, а затем изменим их в соответствии с нашими потребностями.
Начнем с создания двух таблиц ProdA и ProdB со следующими свойствами проектирования.
AutoNumber - это автоматически увеличивающееся длинное целое число, назначаемое элементам по мере их добавления в таблицу. Параметр «Текст» не был изменен, поэтому он будет принимать текстовую строку длиной до 255 символов.
Теперь заполните их некоторыми данными.
Чтобы показать различия в том, как работают 3 типа соединения, я удалил записи 1, 5 и 8 из ProdA.
Затем создайте новый запрос, перейдя в Создать> Дизайн запроса. Выберите обе таблицы в диалоговом окне «Показать таблицу» и нажмите кнопку Добавить, тогда близко.
Нажмите ProductID в таблице ProdA, перетащите его в ProductID в таблице ProdB и отпустите кнопку мыши, чтобы создать связь между таблицами.
Щелкните правой кнопкой мыши строку между таблицами, представляющими отношения между элементами и выберите Объединить свойства.
По умолчанию выбран тип соединения 1 (INNER). Вариант 2 - соединение слева и справа, а 3 - соединение справа.
Сначала мы рассмотрим ВНУТРЕННЕЕ объединение, поэтому нажмите ОК, чтобы закрыть диалоговое окно.
В конструкторе запросов выберите поля, которые мы хотим видеть из раскрывающихся списков.
Когда мы запустим запрос (красный восклицательный знак на ленте), он отобразит поле ProductName из обеих таблиц со значением из таблицы ProdA в первом столбце и ProdB во втором.
Обратите внимание, что результаты показывают только значения, в которых ProductID одинаков в обеих таблицах. Даже если в таблице ProdB есть запись для ProductID = 1, она не отображается в результатах, поскольку ProductID = 1 не существует в таблице ProdA. То же самое относится к ProductID = 11. Он существует в таблице ProdA, но отсутствует в таблице ProdB.
Используя кнопку «Вид» на ленте и переключившись в представление SQL, вы можете увидеть запрос SQL, сгенерированный конструктором, который использовал эти результаты.
ВЫБЕРИТЕ ProdA.ProductName, ProdB.ProductName ОТ СОЕДИНЕНИЯ ProdA INNER ProdB ON ProdA.ProductID = ProdB.ProductID;
Возвращаясь к представлению «Дизайн», измените тип соединения на 2 (ВЛЕВО НАРУЖНО). Запустите запрос, чтобы увидеть результаты.
Как видите, каждая запись в таблице ProdA представлена в результатах, в то время как в результатах отображаются только те записи в ProdB, которые имеют соответствующую запись ProductID в таблице ProdB.
Пустое пространство в столбце ProdB.ProductName является специальным значением (NULL), поскольку в таблице ProdB нет совпадающего значения. Это окажется важным позже.
ВЫБЕРИТЕ ProdA.ProductName, ProdB.ProductName ОТ ProdA ВЛЕВО СОЕДИНИТЬ ProdB ON ProdA.ProductID = ProdB.ProductID;
Попробуйте то же самое с третьим типом соединения (ВПРАВО).
Результаты показывают все из таблицы ProdB, пока она показывает пустые (известные как NULL) значения, где таблица ProdA не имеет совпадающего значения. Пока что это приближает нас к желаемым результатам в вопросе нашего читателя.
ВЫБЕРИТЕ ProdA.ProductName, ProdB.ProductName ОТ ProdA ПРАВИЛЬНОЕ СОЕДИНЕНИЕ ProdB ON ProdA.ProductID = ProdB.ProductID;
Использование функций в запросе
Результаты функции также могут быть возвращены как часть запроса. Мы хотим, чтобы в нашем наборе результатов появился новый столбец с именем «Результаты». Его значением будет содержимое столбца ProductName таблицы ProdA, если ProdA имеет значение (не NULL), в противном случае его следует взять из таблицы ProdB.
Функция Immediate IF (IIF) может использоваться для получения этого результата. Функция принимает три параметра. Первое - это условие, которое должно принимать значение True или False. Второй параметр - это значение, которое будет возвращено, если условие истинно, а третий параметр - это значение, которое будет возвращено, если условие ложно.
Полная функциональная конструкция для нашей ситуации выглядит следующим образом:
IIF (ProdA.ProductID является нулевым, ProdB.ProductName, ProdA.ProductName)
Обратите внимание, что параметр условия не проверяет равенство. Значение Null в базе данных не имеет значения, которое можно сравнить с любым другим значением, включая другое значение Null. Другими словами, Null не равен Null. Когда-либо. Чтобы обойти это, мы вместо этого проверяем значение с помощью ключевого слова «Is».
Мы могли бы также использовать «Is Not Null» и изменить порядок параметров True и False, чтобы получить тот же результат.
Когда вы помещаете это в Query Designer, вы должны ввести всю функцию в поле Field:. Чтобы создать столбец «Результаты», необходимо использовать псевдоним. Для этого предварите функцию «Результаты:», как показано на следующем снимке экрана.
Эквивалентный код SQL для этого будет:
ВЫБЕРИТЕ ProdA.ProductName, ProdB.ProductName, IIF (ProdA.ProductID равно NULL, ProdB.ProductName, ProdA.ProductName) КАК РЕЗУЛЬТАТЫ ИЗ ПРОД. ПРАВ.
Теперь, когда мы запустим этот запрос, он выдаст эти результаты.
Здесь мы видим для каждой записи, где таблица ProdA имеет значение, это значение отражается в столбце Результаты. Если в таблице ProdA нет записи, запись из ProdB отображается в результатах. Это именно то, о чем просил наш читатель.
Для получения дополнительных ресурсов для изучения Microsoft Access, посмотрите Джоэл Ли Как изучить Microsoft Access: 5 бесплатных онлайн-ресурсов Как изучить Microsoft Access: 5 бесплатных онлайн-ресурсовВам нужно управлять большим количеством данных? Вы должны посмотреть в Microsoft Access. Наши бесплатные учебные ресурсы помогут вам начать и освоить навыки для более сложных проектов. Читать далее .
Брюс играет с электроникой с 70-х годов, с компьютерами с начала 80-х и точно отвечает на вопросы о технологиях, которые он не использовал и не видел все время. Он также раздражает себя, пытаясь играть на гитаре.