- •1. Особенности организации данных в гис
- •2. Подходы организации связи между данными
- •3. Формы представления объектов в гис:
- •4. Модели организации пространственных данных в гис.
- •2. Основополагающие элементы базы пространственных данных.
- •3. Модель базы пространственных данных.
- •4. Типы векторных объектов, основанные на определении про-странственных размеров:
- •2.4. Представление пространственных объектов в гис
- •2.5. Ввод данных в гис
- •2. Запросы
- •3. Команда sql-запрос
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 Растровая и векторная модели пространственных данных
