Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MI6UGRU

.pdf
Скачиваний:
16
Добавлен:
13.02.2015
Размер:
14.71 Mб
Скачать

Глава 10: Запросы

Сохранение запросов

Любой запрос, созданный в диалогах “Выбрать” и SQL-Запрос”, может быть сохранен как таблица запроса MapInfo. Таблицы запросов включают два файла: .TAB и .QRY. После того, как Вы выполнили команды в диалогах “Выбрать” и “SQL-запрос”, выполните команду ФÀÉË ОХРАНИТЬ ÇАПРОС, и, таким образом, запрос сохранится в виде таблицы. Когда Вы открываете эту таблицу, автоматически открываются таблицы, на основе которых выполняется запрос и далее этот запрос выполняется.

Внимание: Запросы, сделанные на основе других запросов, не могут быть сохранены в виде таблицы или Рабочего набора.

Сохранение запросов в Рабочем наборе

Вы также можете сохранять запросы в Рабочих наборах. Когда открывается Рабочий набор, содержащий запрос, то запрос автоматически будет выполняться, и откроются все окна, созданные при этом запросе. В отличие от сохранения запроса в виде таблицы, отдельный .TAB файл при сохранении запроса в Рабочем наборе создан не будет.

Внимание: Для сохранения запросов в Рабочих наборах необходимо установить флажок Сохранять запросы в Рабочем Наборе в диалоге “Стартовые режимы” (НАСТРОЙКИ > ÐЕЖИМЫ > ÑТАРТОВЫЕ…). По умолчанию флажок установлен.

Шаблоны запросов

Шаблоны запросов можно создавать, когда Вы сохраняете запрос или SQL-Запрос в виде шаблона и перезагружаете его. При этом Вы избавляетесь от проблем вводить параметры запроса, каждый раз, когда Вы этот запрос используете. Диалоги “Запрос” и “SQL-Запрос” имеют кнопки СОХРАНИТЬ… è ÇАГРУЗИТЬ…, позволяющие облегчить Вам эту задачу. Шаблоны запросов полезны для воссоздания запросов в случае обновлении таблиц, использующихся в таких запросах, или для выполнения запросов к таблице, имеющей такие же поля как и у таблицы, к которой изначально был сделан запрос.

Сохранение шаблонов

После завершения составления запроса или SQL-Запроса, нажмите кнопку СОХРАНИТЬ, чтобы сохранить запрос в виде шаблона или файла запроса. Откроется диалог “Сохранить запрос в файле”. Задайте имя файлу запроса, укажите каталог и нажмите кнопку СОХРАНИТЬ. Файлы запросов сохраняются с расширением .QRY и

187

Глава 10: Запросы

размещаются в каталоге, определенном в Настройках (НАСТРОЙКИ > ÐЕЖИМЫ > ÊАТАЛОГИ).

Псевдонимы названий колонок

При создании вычисляемой колонки MapInfo использует выражение в качестве названия колонки. Оно может быть неудобочитаемым. Вы можете задать псевдоним – свое название колонки.

Например, колонка плотности населения в окне Списка из предыдущего примера будет иметь название:

НАСЕЛЕНИЕ / Area(obj, “sq km")

Мы можем дать этой колонке более содержательное название. Чтобы переименовать колонку, добавьте свое название в окошко Выбрать колонки при перечислении используемых колонок. Это название должно следовать сразу после вычисляемого выражения, отделяться от него пробелом и быть заключено в двойные кавычки. Например:

Страна, Население / Area(obj, “sq km") "ПЛ_НАСЕЛЕНИЯ"

При создании временной таблицы запроса MapInfo назовет колонку плотности населения ПЛ_НАСЕЛЕНИЯ.

Псевдонимы можно задавать не только для вычисляемых колонок. Например, если каждая страна рассматривается как отдельный регион сбыта, можно переименовать колонку СТРАНА в ТЕРРИТОРИЯ. Это делается аналогично вычисляемым колонкам:

СТРАНА "ТЕРРИТОРИЯ", Население / Area(obj, “sq km") “ПЛ_НАСЕЛЕНИЯ".

Пример...

Вычисление суммарной плотности населения мира

В этом примере мы разберем несколько сторон SQL-запросов: Создание вычисляемых колонок с помощью функций обобщения; Переименование колонок путем введения псевдонимов; Создание результирующей таблицы на основе таблицы WORLD; Выполнение команды SQL-ЗАПРОС над новой таблицей.

188

Глава 10: Запросы

Мы будем использовать таблицу статистики о странах мира (WORLD). Надо создать

таблицу, которая содержала бы суммарную плотность населения всего мира,

вычисленную по следующей формуле:

ВСЕ НАСЕЛЕНИЕ / ВСЯ ПЛОЩАДЬ

Хотя таблица WORLD не содержит явно данные о суммарной численности населения и суммарной площади всех стран мира, эту информацию можно получить с помощью функции обобщения sum(), примененной к колонке НАСЕЛЕНИЕ, и функции Area. Это мы и сделаем в нашем первом запросе.

Откройте таблицу WORLD.TAB и увеличьте ее на все окно. Выполните команду ЗАПРОС > SQL-ЗАПРОС. Появится диалог "SQL-запрос".

Проделайте следующие действия:

1.Находясь в окошке из таблиц, выберите WORLD из окошка списка Таблицы.

2.Нажав клавишу TAB, переместитесь в окошко Выбрать колонки и удалите там звездочку (*).

3.Выберите "Sum" из окошка списка Обобщение.

Выберите НАСЕЛЕНИЕ из окошка списка Колонки.

После того, как Вы выбрали НАСЕЛЕНИЕ, появятся круглые скобки и курсор будет помещен перед закрывающей скобкой [)]. Выведите его из скобок, нажав клавишу с правой стрелкой.

Будет создана вычисляемая колонка Sum (НАСЕЛЕНИЕ), в которую будет сохранена суммарная численность населения всего мира.

4.Нажмите пробел и введите псевдоним названия колонки ОБЩНАСЕЛЕНИЕ. Запомните, что псевдоним должен отделяться от выражения пробелом. Теперь колонка Sum(НАСЕЛЕНИЕ) будет показываться в окне с использованием названия-псевдонима ОБЩНАСЕЛЕНИЕ.

5.Выберите "Sum" из окошка списка Обобщение.

6.Выберите "Area" из окошка списка Функции.

После того, как Вы выбрали "Area", появятся круглые скобки и курсор будет помещен перед закрывающей скобкой [)]. Выведите его из скобок, нажав клавишу с правой стрелкой.

Будет создана вычисляемая колонка Sum (Area), в которую будет сохранена суммарная площадь государств всего мира.

7. Нажмите пробел и введите псевдоним названия колонки ОБЩНАСЕЛЕНИЕ. Будет создана вычисляемая колонка Sum (Area), в которую будет сохранена суммарная площадь государств всего мира.

189

Глава 10: Запросы

8.Оставьте пустыми окошки с условием, сгруппировать по è порядок по.

9.Нажав клавишу TAB, переместитесь в окошко поместить в таблицу. Введите в качестве названия итоговой таблицы ОБЩПЛОТНОСТЬ.

10.Нажмите кнопку ПРОВЕРИТЬ. Нажмите OK.

Проверьте, чтобы был установлен флажок Результат в Список.

11. Нажмите OK.

MapInfo создаст таблицу запроса с именем “ОбщПлощадь”, которая будет состоять из двух колонок. В первой колонке будет содержаться общая численность населения в мире, а во второй – общая площадь стран мира:

190

Глава 10: Запросы

Теперь, зная общую численность населения и общую площадь стран мира, мы можем

вычислить общую плотность населения с помощью SQL-запроса к только что созданной

таблице ОÁÙÏЛОЩАДЬ. В этом SQL-запросе мы разделим общую численность

населения на общую площадь стран мира.

Выполните команду ЗАПРОС > SQL-ЗАПРОС. Появится диалог "SQL-запрос".

Заполните его следующим образом:

1.В окошке из таблиц выберите ОБЩАЯПЛОЩАДЬ из выпадающего списка.

2.Перейдите в окошко Выбрать колонки и удалите информацию, оставшуюся от последнего запроса.

3.Выберите ОБЩНАСЕЛЕНИЕ из выпадающего списка колонок.

Помните, что ОБЩНАСЕЛЕНИЕ - это колонка, которую мы создали из последнего запроса.

Обратите внимание, что когда Вы выбираете ОБЩНАСЕЛЕНИЕ, COL1 появляется в поле

Выбрать колонки. Это номер колонки этого поля. Когда выбираются колонки, полученные от предыдущих запросов, MapInfo использует номер колонки вместо имени. Колонки могут отсылаться к имени или номеру, где номер соответствует порядку колонок в окошке Выбрать колонки. COL1 и COL2 относятся к первой и второй колонке соответственно.

4.Выберите знак (/) из выпадающего списка операторов.

5.Выберите ОБЩАЯПЛОЩАДЬ из выпадающего списка колонок. COL2 появится в поле

Выбрать колонки.

6.Оставьте окошки с условием, сгруппировать по колонкам è порядок задать по колонке пустыми.

7.Перейдите в окошко и поместить в таблицу. Наберите МИРПЛОТНОСТЬ в качестве имени этой таблицы.

8.Нажмите кнопку ПРОВЕРИТЬ. Нажмите OK.

9.Убедитесь, что флажок в окошке Результат в Список установлен.

191

Глава 10: Запросы

10. Нажмите OK.

Обратите внимание, что когда Вы выберете ОБЩПЛОЩАДЬ, в окошко Выбрать колонки можно помещать надписи ОБЩНАСЕЛЕНИЕ и ОБЩПЛОЩАДЬ. Это номер данного поля в таблице.

MapInfo создаст таблицу запроса с именем МИРПЛОТНОСТЬ, которая будет содержать значение средней плотности населения всего мира в квадратных километрах.

Обобщение данных

Под обобщением данных мы понимаем выполнение математической операции над значениями всех записей из некоторой колонки таблицы. В отличие от команды

192

Глава 10: Запросы

ÂЫБРАТЬ, которая позволяет выполнять математические операции над отдельными записями, язык SQL дает возможность обобщать данные из всех записей в заданной колонке.

MapInfo для каждой группы значений в заданной колонке (колонках) создает отдельную строку. При обобщении данных надо указать:

Как группировать записи.

Как суммировать (обобщать) данные.

Например, имеется таблица торговых агентов и объемов продаж за три месяца:

ÒÎÐÃ_ÏÐÅÄ

МЕСЯЦ

ПРОДАЖИ

 

 

 

Иванов

Ìàé

1200

 

 

 

Петросян

Ìàé

900

 

 

 

Гольдштейн

Ìàé

1100

 

 

 

Иванов

Èþíü

900

 

 

 

Петросян

Èþíü

1400

 

 

 

Гольдштейн

Èþíü

600

 

 

 

Иванов

Èþëü

1200

 

 

 

Петросян

Èþëü

700

 

 

 

Гольдштейн

Èþëü

1000

 

 

 

MapInfo может также вычислить общий объем продаж, сделанных каждым из агентов, если в диалоге "SQL-запрос" указать:

В окошке Выбрать колонки: ТОРГ_ПРЕД, sum(ПРОДАЖИ)

Сгруппировать по колонке: ÒÎÐÃ_ÏÐÅÄ

ÒÎÐÃ_ÏÐÅÄ

sum(ПРОДАЖИ)

 

 

Иванов

3300

 

 

Петросян

3000

 

 

Гольдштейн

2700

 

 

или вычислить среднемесячный объем продаж каждого агента:

Выбрать колонки: ТОРГ_ПРЕД, avg(ПРОДАЖИ)

Сгруппировать по колонке: ÒÎÐÃ_ÏÐÅÄ

ÒÎÐÃ_ÏÐÅÄ

avg(ПРОДАЖИ)

 

 

Иванов

1100

 

 

Петросян

1000

 

 

Гольдштейн

900

 

 

193

Глава 10: Запросы

или общий объем продаж за каждый месяц:

Выбрать колонки: МЕСЯЦ, sum(ПРОДАЖИ)

Сгруппировать по колонке: МЕСЯЦ

МЕСЯЦ

sum(ПРОДАЖИ)

 

 

Ìàé

3200

 

 

Èþíü

2900

 

 

Èþëü

2900

 

 

В MapInfo имеется шесть функций обобщения:

Count(*): подсчитывает число записей в группе. В качестве ее аргумента указывается *, так как она применима только ко всей записи, а не к какому-то отдельному полю записи.

Sum (выражение): вычисляет сумму значений в <выражении> для всех записей группы.

Average (выражение): вычисляет среднее значение в <выражении> для всех записей группы.

WtAvg (выражение): вычисляет средневзвешенное значение <выражения> для всех записей группы.

Max (выражение): находит наибольшее значение в <выражении> среди всех записей группы.

Min (выражение): находит наименьшее значение в <выражении> среди всех записей группы.

Группирующее и упорядочивающее предложения

Результаты SQL-запроса можно сгруппировать по значениям из некоторой колонки так, что записи, содержащие одинаковые значения в этой колонке, будут объединены вместе. Такую колонку можно определить в окошке Сгруппировать по диалога "SQLзапрос". При использовании также функций обобщения строки с одинаковыми значениями в группировочных колонках считаются одной группой. Повторяющиеся записи при этом не учитываются, а обобщенные значения выдаются в вычисляемых колонках. Задайте названия колонок или их номер в окошке Выбрать колонки. При использовании вычисляемых колонок следует указывать именно номер.

Кроме того, можно указать MapInfo порядок сортировки результатов запроса. Стандартный порядок – по возрастанию (для строковых полей – по алфавиту). Как и в окошке

Сгруппировать по, здесь можно указывать название колонки или ее условный номер. Для вычисляемых колонок следует указывать номер. При этом не надо указывать “COL" перед номером колонки.

194

Глава 10: Запросы

Подробнее предложения "Сгруппировать по" и "Порядок задать по" описаны в главе "SQL-запрос" â Справочнике MapInfo.

Объединение таблиц командой SQL-запрос

При выполнении SQL-запросов к нескольким таблицам MapInfo должна объединить данные из разных таблиц. Допустим, имеется таблица, содержащая только графические объекты и их названия, и таблица статистических данных для некоторого региона. Надо показать эти статистические данные на карте. Можно объединить статистические и географические данные в одну таблицу с помощью команды SQL-

ЗАПРОС.

При работе с несколькими таблицами Вы должны так заполнить окошко с условием, чтобы при выполнении запроса правильно сопоставлялись записи из разных таблиц. Например, рассмотрим таблицу WORLD и таблицу экономической статистики (ECO_STATS) по всем странам мира. Надо создать временную таблицу запроса, которая объединила бы оба набора данных:

Выбрать колонки: * (напомним, что звездочка означает, что в таблицу запроса надо включить все колонки исходных таблиц)

Из таблиц: WORLD, ECO_STATS

С условием: WORLD.Страна = ECO_STATS.Страна

Две колонки, с помощью которых Вы сопоставляете записи из разных таблиц, не обязательно должны иметь одинаковое название. Например, рассмотрим таблицу иностранных клиентов (INT_CUST), содержащую колонку регионов сбыта ("Территория"). В эту колонку записаны названия континентов. Чтобы временно объединить эту таблицу с таблицей стран мира, составьте запрос следующим образом:

"Выбрать колонки": *

"Из таблиц": WORLD, INT_CUST

"С условием": WORLD.Континент = INT_CUST.Территория

Пример...

Общая численность населения и площадь континентов

Зная теперь, как MapInfo обобщает данные, мы можем вычислить общую численность населения и общую площадь каждого континента. Мы хотим создать таблицу, содержащую следующую информацию:

195

Глава 10: Запросы

Число государств на континенте Общую численность населения континента Общую площадь континента

При этом мы хотим, чтобы континенты были перечислены в алфавитном порядке. Откройте таблицу WORLD.TAB и увеличьте его на все окно. Выполните команду Запрос > SQL-запрос. Появится диалог "SQL-запрос".

Заполните его следующим образом:

1.В окошке из таблиц выберите WORLD из выпадающего списка таблиц.

2.В окошке Выбрать колонки выберите КОНТИНЕНТ из выпадающего списка, и выберите Count(*) из выпадающего списка Обобщение.

Один раз нажмите пробел и напечатайте псевдоним колонки КОНТИНЕНТ. Помните, что псевдоним отделяется от выражения пробелом. Колонка КОНТИНЕНТ Count(*) появится в результирующей таблице как СТРАНЫ.

3.Выберите Sum из выпадающего списка Обобщение.

4.Выберите НАСЕЛЕНИЕ из выпадающего списка Колонки.

После выбора колонки НАСЕЛЕНИЕ курсор переместится к скобке [)]. Переместите его направо за скобку.

Sum (НАСЕЛЕНИЕ) создаст результирующую колонку, в которой будут результаты расчета населения земного шара.

5.Нажмите один раз пробел и введите псевдоним колонки ОБЩНАСЕЛЕНИЕ. В результирующей таблице под именем ОБЩНАСЕЛЕНИЕ появится колонка Sum(НАСЕЛЕНИЕ) .

6.Выберите Sum из выпадающего списка Обобщить.

7.Выберите Area из выпадающего списка Функции.

После того, как Вы выберите Area, курсор будет располагаться перед последней скобкой [)]. Переместите его направо за скобку.

Sum(Area) создаст дополнительную колонку, которая будет содержать результат вычисления общей площади.

8.Один раз нажмите пробел и введите псевдоним колонки ОБЩПЛОЩАДЬ.

Âрезультирующей таблице появится колонка Sum(Area(obj, “sq mi”)) под именем ОÁÙÏЛОЩАДЬ.

9.В окошке сгруппировать по колонкам выберите КОНТИНЕНТ из выпадающего списка Колонки.

10.В окошке порядок задать по колонке, выберите КОНТИНЕНТ из выпадающего списка

Колонки.

196

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]