Анимация
JavaScript
|
Главная Библионтека Для того чтобы использовать RQBE, вам достаточно выполнить команду New из меню File, а затем выбрать тип создаваемого файла - Query. RQBE - это интерактивная среда, в которой вы формируете запрос в основном с помощью мыши, перетаскивая нужные вам поля в определенные области диалогового окна. Результатом будет запрос, оформленный в виде файла с расширением QPR. При этом выполнить запрос вы сможете с помощью команды DO. Если вы изучаете SQL для использования в FoxPro, то пользуйтесь любым из вышеизложенных способов, но если вам нравится RQBE, то все равно заглядывайте в полученный код, потому что это поможет вам лучше понять язык. Разбирайте каждое слово в полученной команде, и успех в недалеком будущем вас будет ожидать всенепременно. В среде СУБД Microsoft Access нет командной строки в том понятии, в котором она существует в Visual FoxPro. Для того чтобы создать запрос, в контейнере БД выберите страницу Запросы, нажмите на кнопку Создать. На экране появится Конструктор запросов. При этом вы легко будете переходить из Конструктора запросов в окно редактирования SQL или к результатам выполнения запроса. Среди рассматриваемых средств разработки СУБД Microsoft Access имеет наиболее мощные средства визуального конструирования запросов. Здесь вы можете создать не только запрос на выборку, но и запросы обновления, удаления, создания таблиц, добавления. Об этих запросах мы поговорим ниже. Visual Basic использует для работы с данными процессор баз данных Microsoft Jet, такой же, как и Access. Но в связи с тем, что Visual Basic является универсальным средством разработки, здесь не присутствуют такие развитые средства визуального проектирования, как в Microsoft Access. В то же время, так как все объекты DAO - объекты по доступу к данных - доступны и из Visual Basic, то мы вполне можем добиться функциональности, которой добиваемся в Access. Другое дело, какой ценой мы этого достигнем. Напомним, что в Microsoft SQL Server для того, чтобы выполнить команду SQL, необходимо запустить приложение iSQLW. Вы можете набрать требуемую команду и запустить ее на выполнение. При этом на вкладке Query Results вы увидите полученный результат. Зная SQL, вы можете значительно увеличить ваши возможности при работе с электронными таблицами Microsoft Excel. Несмотря на то, что вы можете непосредственно читать некоторые форматы данных, иногда полезно немного сократить в объеме количество записей перед обработкой в Excel. В этом вам может помочь приложение Microsoft Query, которое можно использовать для построения запросов к данным внешнего и внутреннего формата Excel с целью уменьшения объема данных, необходимых для текущего сеанса работы. Итак, везде присутствует SQL. Где-то как основное средство работы, где-то как вспомогательное. Мы думаем, что теперь вы вполне готовы к разговору о более сложных запросах. Посмотрим еще раз на команду SQL, о которой мы уже говорили: SELECT * FROM mytable Заменим абстрактную таблицу Mytable таблицей из примера к этой книге. Одна из таблиц называется Model, в ней хранятся данные о всех моделях автомобилей, которые задействованы в реселлерской деятельности компании. К примеру, нам не нужны для дальнейшей обработки все поля из этой таблицы. Чтобы выбрать нужные, мы должны их просто перечислить: SELECT name model, swept volume, quantity drum FROM model Может случиться, что вам захочется иметь более наглядные заголовки вместо часто абстрактных наименований английскими буквами или даже на английском языке. Тогда мы используем ключевое слово AS после названия колонки. Перепишем наш запрос в другом виде: SELECT name model AS наименование, ; swept volume AS рабочий объем, ; quantity drum AS кол цилиндров ; FROM model Этот синтаксис верен для Visual FoxPro и Microsoft Access. При работе с Microsoft SQL Server подобная задача выполняется немного по-другому: SELECT наименование= name model, : рабочий объем= swept volume,; кол цилиндров= quantity drum ; FROM model Итоговый запрос может содержать дублирующие друг друга по всем полям записи. Если вам не нужна избыточная информация, то введите после SELECT ключевое слово DISTINCT: SELECT DISTINCT наименование= name model, : рабочий объем= swept volume,; кол цилиндров= quantity drum ; FROM model Противоположным по смыслу DISTINCT ключевым словом является ALL, как правило, оно является значением по умолчанию и его можно не приводить. Но это уже зависит от вашего стиля программирования. Иногда считается правильным указывать все значения и ключевые слова для лучшей "читабельности" кода. Порядок, в котором поля выводятся в итоге, зависит только от того, в какой последовательности вы перечислите их в своем запросе. Если необходимо во второй колонке вывести количество цилиндров, то следует изменить порядок указания полей в списке выводимых результатов: SELECT name model, quantity drum ,swept volume FROM model Теперь количество цилиндров будет указываться сразу после наименования модели автомобиля. Помимо полей из таблиц, в список выводимых колонок можно включать функции, переменные, константы и выражения. Например, если вы хотите особо отметить каждую третью запись, вы можете выполнить следующий запрос: SELECT IIF(MOD(RECNO(),3) = 0,"Y","N"),RECNO(),cost; FROM "automobile passenger car" При этом в каждой третьей записи в результирующем курсоре в первой колонке появится буква "Y". В запросе можно использовать пользовательскую функцию и выводить ее результаты в курсор. Правда, здесь накладывается некоторое ограничение: желательно, чтобы функция не перемещала указатель записи в таблице, из которой выбираются данные. До сих пор мы рассматривали организацию запросов к одной таблице. В реальной жизни это довольно редкий случай. Как правило, информацию нужно получать их двух и более таблиц. При этом нужно учитывать факт, что таблицы должны быть связаны между собой, при этом необязательно каждая с каждой, можно связать две таблицы через одного или нескольких посредников. Если вы хотите узнать, в какой стране находится штаб-квартира фирмы, автомобиль которой приобрел каждый покупатель, то нужно создать вот такой запрос: SELECT Customer.name customer, Country.country name, ; Model.name model,; Firm.name firm; FROM "auto store!customer", "auto store!account",; "auto store!automobile passenger car" Automobile passenger car,; "auto store!model", "auto store!firm",; "auto store!country"; WHERE Customer.key customer = Account.key customer; AND Automobile passenger car.key auto = Account.key auto; AND Model.key model = ; Automobile passenger car.key model; AND Firm.key firm = Model.key firm; AND Country.key country = Firm.key country В итоге получится следующая выборка: NAME COUNTRY NAME NAME CUSTOMER MODEL FIRM Безумные медведи Италия 145 1.4 Alfa Romeo Общество нац. героев Италия 145 1.4 Alfa Romeo Пронырливые волки Италия 146 1.9 Alfa Romeo Угрюмые слоны Германия M3 3.0 BMW Голодные лисы Германия 740i 4.0 BMW Голодные лисы Германия 840Ci 4.0 BMW Угрюмые слоны Германия 840Ci 4.0 BMW В этом запросе появилось предложение WHERE, о котором мы прежде не упоминали. Обратившись к теории, скажем, что это слово позволяет нам определить предикат, который будет обрабатывать каждую строку таблиц, и, в зависимости от его истинности, нужные нам поля из этих строк окажутся в итоговом запросе. В нашем конкретном случае мы просто определяли, есть ли соответствующие значения по связующему полю для таблицы в таблице, с которой мы ее связываем. Например, строчка Automobile passenger car.key auto = Account.key auto ограничит нашу выборку только теми записями, которые имеют одинаковые значения и в таблице Automobile passenger car, и в таблице Account по полю key auto. Проведя соответствующее исследование для других связующих пар, мы поймем, каким образом ограничивается набор выбранных данных. Вышеприведенный синтаксис правилен для любого диалекта SQL, используемого в рассматриваемых средствах разработки. Рассмотрим более простой пример. Нам хочется узнать для автомобиля название его фирмы-производителя. Запрос будет выглядеть так: SELECT model.name model,firm.name firm ; FROM model,firm ; WHERE model.key firm = firm.key firm Далее рассмотрим, как этот запрос будет выглядеть, если мы построим его с помощью Конструктора запросов Microsoft Access. SELECT DISTINCTROW firm.name firm, model.name model FROM firm INNER JOIN model ON firm.key firm = model.key firm; В предложении FROM появилась конструкция: firm INNER JOIN model ON firm.key firm = model.key firm что в дословном переводе означает: внутренняя связь таблицы Firm с таблицей Model по полю key firm. Почему нельзя просто все записать в предикат, составленный с помощью предложения WHERE? Можно. Но полученный запрос не будет модифицирующим, то есть вы не сможете изменять данные в запросе, а соответственно и редактировать данные в исходной таблице посредством запроса. Ядро базы данных Microsoft Jet - достаточно гибкое средство в отношении типов и форматов SQL выражений, используемых для создания связей между таблицами. В дополнение к связям, которые вы можете указать в предикате, составляемом с помощью предложения WHERE, Microsoft Jet SQL может использовать предложение JOIN, чтобы указать внутреннюю, левую внешнюю или правую внешнюю связь, а также неэквивалентные связи, в которых связующим критерием является не равенство значений в связующих полях двух таблиц, а выражение условия, которое должно возвращать истину. Внутренняя связь может быть сложная, когда вы связываете несколько таблиц, например: SELECT DISTINCTROW firm.name firm, model.name model, country.country name FROM model INNER JOIN (firm INNER JOIN country ON firm.key country = country.key country) ON model.key firm = firm.key firm ; В вышеприведенном примере мы ищем штаб-квартиру фирмы-производителя каждой модели. Помимо внутреннего (INNER JOIN) объединения, вы можете использовать внешние объединения, при этом различаются левые внешние и правые внешние объединения: LEFT JOIN и RIGHT JOIN. Используя левое внешнее объединение, вы получаете в итоговом запросе все записи из левой таблицы и только те записи из правой таблицы, которые имеют соответствующие значения по связующему полю в левой таблице. SELECT DISTINCTROW [automobile passenger car].date issue, account.account 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [ 70 ] 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |