Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Nieizv - MOI Liektsii po GIZIS_3794.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
483 Кб
Скачать
☆

3. Команда sql-запрос

Команда SQL-ЗАПРОС позволяет формулировать еще более сложные запросы, чем команда ВЫБРАТЬ.

Записи в таблице запросов, созданной командой ВЫБРАТЬ, не содержат никакой дополнительной информации по сравнению с исходной таблицей. Это, по существу, те же записи.

С помощью команды SQL-ЗАПРОС можно создавать таблицы запросов, содержащие данные, которые не присутствуют явно в исходных таблицах.

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

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

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

Вычисляемые колонки

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

Стандартный текст в окошке "Выбрать колонки" Њ звездочка (*), которая показывает, что все колонки базовых таблиц следует включить в таблицу запроса. В остальных случаях надо удалить звездочку и перечислить только необходимые колонки.

В выражениях для вычисляемых колонок можно использовать функции обобщения count, sum, avg, wtavg, max и min. Например:

- sum(НАСЕЛЕНИЕ ) - численность населения всего мира.

- sum(Area(obj), "sq km") - суммарная площадь всех стран мира.

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

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

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

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

При обобщении данных надо указать:

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

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

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

ТОРГ_ПРЕД  

МЕСЯЦ  

ПРОДАЖИ

Иванов  

Май  

1200

Петросян  

Май  

900

Гольдштейн  

Май  

 100

Иванов  

Июнь  

900

Петросян  

Июнь  

1400

Гольдштейн  

Июнь  

600

Иванов  

Июль  

1200

Петросян  

Июль  

700

Гольдштейн  

Июль  

1000

Вычислим общий объем продаж, сделанных каждым из агентов, если в

диалоге "SQL-запрос" указать:

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

- "Сгруппировать по колонке": ТОРГ_ПРЕД

ТОРГ_ПРЕД

sum(ПРОДАЖИ)

Иванов

3300

Петросян

3000

Гольдштейн

2700

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

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

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

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

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

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

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

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

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

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

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

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

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

При работе с несколькими таблицами Вы должны так заполнить окошко "с условием", чтобы при выполнении запроса правильно сопоставлялись записи из разных таблиц.

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

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

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

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

Пример. Создадим таблицу, содержащую следующую информацию:

- Число государств на континенте

- Общую численность населения континента

- Общую площадь континента

Откройте таблицу WORLD.TAB и увеличьте его на все окно. Выполните команду Запрос > SQL-запрос. Заполните его следующим образом:

Поле "Выбрать колонки": континент, count(*) "страны", sum(население) "общее население", sum(area(obj,"sq km")) "общая площадь"

Поле "Из таблиц" - world

Поле "Сгруппировать по колонкам" - Континент

Условие Where

Выражение Where в окошке "с условием" позволяет объединять таблицы MapInfo более логично и более просто.

Порядок полей

Порядок полей, используемых в объединении таблиц не имеет значения. Любой из вариантов синтаксиса приемлем:

Select * from A,B where A.field1 = B.field1

Select * from A,B where B.field1 = A.field1

Но, когда Вы переключаете порядок географических операндов, географические операторы так же должны измениться. Следующие операторы производят одинаковые результаты:

Select * from states, cities where states.obj contains cities.obj

Select * from states, cities where cities.obj within states.obj

Поиск информации внутри колонки данных - функция InStr

Функция InStr используется для размещения строковой переменной внутри большой строковой переменной. Эта функция полезна для поиска символьных полей, чтобы определить позицию определенного строкового символа или группы символов. Она также может быть полезна для поиска любой части строкового символа.

Например, Вам надо выбрать все улицы в таблице ДОРОГИ, содержащие слово "Большая" в колонке УЛИЦЫ.

Условие в запросе будет выглядеть так: InStr(1, "Улицы","Большая");

Если функция InStr встретит любое появление "Большая" она вернет позицию на следующее за этим место.

Синтаксис функции INSTR определяется следующим образом:

INSTR ( position, string, substring), где: position - это стартовая позиция поиска, string - это строковый символ или поле, содержащее строковый символ, который надо найти, substring - это строковый символ, который следует найти

Если строковый символ, который Вы ищете, не существует, то будет возвращено значение 0.

Выбор записей из одной таблицы, которых нет в другой таблице

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

NOT имя_колонки IN(SELECT имя_колонки FROM второй_таблицы)

Выбор четных или нечетных записей из таблицы

Каждая запись в таблице имеет порядковый номер в колонке RowID.

Для выбора четных записей условие выглядит так: RowID Mod 2=0

Для выбора нечетных записей условие выглядит так: RowID Mod 2>0

Отсутствие растеризации (зернистости) графических объектов при масштабировании зоны просмотра. [5]

Рис.1 Растровая и векторная модели пространственных данных