Команда SELECT - SQL и другие команды SQL для данной версии Visual FoxPro 9.0 существенно улучшены и расширены. В данном Параграфе рассматриваются и обсуждаются как улучшенные так и новые функциональные особенности технологии SQL (в реализации Visual FoxPro).
Расширенные Возможности
Некоторые ограничения команды SELECT - SQL теперь сняты, улучшены Технологические Характеристики SQL Visual FoxPro 9.0. В следующей Таблице перечислены снятые Ограничения или Улучшенные характеристики.
Возможность | Краткое Описание |
---|---|
Количество Секций Join и Подзапросов в команде SELECT - SQL |
В версии Visual FoxPro 9.0 снято общее ограничение по количеству секций JOIN и Подзапросов в одной команде SELECT - SQL. Предыдущее ограничение = 9 (девять). |
Количество Секций UNION в команде SELECT - SQL |
В версии Visual FoxPro 9.0 снято ограничение по количеству секций UNION в одной команде SELECT - SQL. Предыдущее ограничение = 9 (девять). |
Количество ссылок на Таблицы в одной команде SELECT - SQL |
В версии Visual FoxPro 9.0 снято ограничение по количеству ссылок на Таблицы в одной команде SELECT - SQL. Предыдущее ограничение = 30 (тридцать). |
Количество Аргументов в Секции IN( ) |
В версии Visual FoxPro 9.0 снято ограничение по количеству аргументов (<=24), Значений в секции IN () из общего утверждения WHERE. Однако, количество рассматриваемых Значений может быть определено системной Функцией: SYS(3055) – FOR and WHERE Clause Complexity. Относительно Функциональных изменений секции IN, смотрите подраздел Изменения функциональности в Текущей (9) версии. |
Расширение функциональности использования ПодЗапросов SQL
В версии Visual FoxPro 9.0 обеспечена большая Гибкость при создании Подзапросов. Например, теперь поддерживаются несколько ПодЗапросов в одной команде SELECT-SQL. Далее описаны основные Улучшения функциональности ПодЗапросов.
Несколько ПодЗапросов
Visual FoxPro 9.0 поддерживает множественные вложенные ПодЗапросы, с поддержкой Корреляции элементов относительно Родительского Запроса. Теперь отсутствуют Ограничения по глубине вложенных Подзапросов. В версии Visual FoxPro 8.0, возникала Ошибка = 1842 (SQL: Подзапрос, недопустимое вложение), которая порждалась при использовании более Одного вложения ПодЗапросов в одной команде SQL.
Далее приводится Основная допустимая синтаксическая Конструкция для нескольких вложенных ПодЗапросов.
SELECT … WHERE … (SELECT … WHERE … (SELECT …) …) …
Пример:
Представленный далее Пример приводит к возникновению ошибочной ситуации в версии Visual FoxPro 8.0; Однако, в версии Visual FoxPro 9.0. он успешно выполняется:
![]() |
|
---|---|
CREATE CURSOR MyCursor (field1 I) |
Секция GROUP BY в Коррелированном ПодЗапросе:
Многие Запросы могут быть оценены как успешно выполняемые в зависимости от содержания ПодЗапроса или от изменяемого Значения в секции WHERE Родительского Запроса. В Запросах, содержащих Коррелированные ПодЗапросы (называемые также Повторяющимися Подзапросами), выполнение подзапроса существенно зависит от значений некоторых элементов Родительского Запроса. Это означает, что указанный ПодЗапрос выполняется многократно, для каждой результирующей Записи Родительского Запроса.
В версии Visual FoxPro 8.0 не допускалось использование выражения GROUP BY в Коррелированном ПодЗапросе, и возникала Ошибочная ситуация = 1828 (SQL: недопустимое использование выражения GROUP BY в ПодЗапросе). В версии Visual FoxPro 9.0 указанное ограничение снято, рассматриваемое выражение GROUP BY может эффективно использоваться в коррелированных подзапросах, в резельтирующий наборе данных включаются уже более одной Записи.
Далее приводится поддерживаемая теперь синтаксическая конструкция команды SQL с секцией GROUP BY в коррелированном Подзапросе.
SELECT … WHERE … (SELECT … WHERE … GROUP BY …) …
Пример:
Следующий программный Код приводит к ошибке в версии Visual FoxPro 8.0, Но успешно выполняется в версии Visual FoxPro 9.0.
![]() |
|
---|---|
CLOSE DATABASES ALL |
Секция TOP N в НеКоррелированных ПодЗапросах:
Версия Visual FoxPro 9.0 поддерживает теперь секцию TOP N в некоррелированных ПодЗапросах. Требуется использовать выражение ORDER BY если указывается рассматриваемая конструкция TOP N; Это единственный случай, при использовании ее в Подзапросах.
Далее представлена основная синтаксическая Конструкция использования утверждения TOP N в некоррелированных Подзапросах.
SELECT … WHERE … (SELECT TOP nExpr [PERCENT] … FROM … ORDER BY …) …
Пример:
Следующий программный код приводит к Ошибке в версии Visual FoxPro 8.0; однако - успешно выполняется в версии Visual FoxPro 9.0.
![]() |
|
---|---|
CLOSE DATABASES ALL |
Подзапросы в Списках столбцов команды SELECT:
Версия Visual FoxPro 9.0 теперь допускает Подзапросы, как Столбцы или части выражения в Результирующем наборе (списке столбцов). Значение ПодЗапроса оценивается по тем же правилам, как и в операциях Сравнения. Если Подзапрос не возвращает ни одной Записи, то возвражается стандартное значение = NULL.
При использовании описанной выше конструкции в версии Visual FoxPro 8.0, возникаент Ошибочная ситуация = 1810 (SQL: Неверное использование ПодЗапроса).
Далее приводится общая допустимая синтаксическая конструкция Списка столбцов в команде SELECT.
SELECT … (SELECT …) … FROM …
Пример:
Следущий далее программный Код приводит к ошибке в версии Visual FoxPro 8.0; однако - успешно выполняется в версии Visual FoxPro 9.0.
![]() |
|
---|---|
SELECT T1.field1, (SELECT field2 FROM MyCursor2 T2; |
Использование Агрегатных Функций в Подзапросах, как столбцов в команде SELECT:
Теперь, в версии Visual FoxPro 9.0, поддерживаются агрегатные функции в Конструкциях Подзапросов используемых в выражених сравнения <, <=, >, >=, а также ALL, ANY, или SOME. Смотрите дополнительно подраздел по использованию агрегатных функций: Соглашения для Операторов SQL SELECT.
Пример:
Далее приводится программный Код, в котором используется агрегатная функция COUNT( ), как элемент Списка Подзапроса SELECT.
![]() |
|
---|---|
CLOSE DATABASES ALL |
Коррелированные Подзапросы допускают теперь сложные Выражения Сравнения с коррелированным Полем:
В версии Visual FoxPro 8.0, ссылки на коррелируемые Поля (столбцы) могли быть указаны только в следующих Случаях:
Коррелируемое Поле <оператор сравнения> Локальное Поле
-или-
Локальное Поле <оператор сравнения> Коррелируемое Поле
В версии Visual FoxPro 9.0, в выражениях Сравнения, допускаются более сложные Конструкции, локальные поля, корреляционные поля, выражения:
Коррелируемое Поле <оператор сравнения> Локальное выражение
-или в форме-
Локальное выражение <оператор сравнения> Коррелируемое Поле
В локальном выражении должна быть использована по крайней мере одна ссылка на локальное Поле, и не может быть использована ссылка на Итоговый (коррелированный) Столбец результирующего Набора.
Пример:
В представленном Коде локальное выражение (MyCursor2.field2 / 2) сравнивается с итоговым Полем (Столбцом) (MyCursor.field1).
![]() |
|
---|---|
SELECT * FROM MyCursor ; |
Нововведения для сравниваемых выражений при использовании Подзапросов:
В версии Visual FoxPro 8.0, в левой части выражения сравнения при использовании операторов сравнения: [NOT] IN, <, <=, =, ==, <>, !=, >=, >, ALL, ANY, SOME и Подзапроса, указанного в правой части, может быть использована ссылка на Одну, и только Одну Таблицу из соответствующей секции FROM. В случае сравнения с коррелированным Подзапросом, данная Таблица должны быть также Коррелированной.
В версии Visual FoxPro 9.0, конструкции Сравнения работают в следующизх Режимах:
-
Выражение, размещенное в левой части конструкции сравнения IN должна содержать ссылку по крайней мере на Одну Таблицу, из соответствующей секции FROM.
-
Аналогично, в левой части выражения сравнения, использующего операторы =, ==, <>, !=, а также: ALL, SOME, ANY должна быть указана ссылка по крайней мере на Одну Таблицу из секции FROM.
-
Аналогично, в левой части выражения сравнения, использующего операторы >, >=, <, <=, а также: ALL, SOME, ANY (SELECT TOP…) должна быть указана ссылка по крайней мере на Одну Таблицу из секции FROM.
-
Аналогично, в левой части выражения сравнения, использующего операторы >, >=, <, <=, а также: ALL, SOME, ANY (SELECT <агрегатная функция>…) должна быть указана ссылка на по крайней мере на Одну Таблицу из Секции FROM.
-
Аналогично, в левой части выражения сравнения, использующего операторы >, >=, <, <=, а также: ALL, SOME, ANY (для подзапросов с использованием GROUP BY и/или HAVING) должна быть указана ссылка по крайней мере на ОДдну Таблицу из секции FROM.
В версии Visual FoxPro 9.0, когда левая часть выражения сравнения не содержит списка требуемых Значений (например, для конструкций типа ALL, SOME, ANY) не требуется указание ссылки на хотя бы одну Таблицу из секции FROM.
Во всех остальных случаях, в левой части Сравнения, может быть указано не более одной ссылки на Таблицу из соответствующей секции FROM. Для коррелированных Подзапросов, левая часть сравнения не может содержать ссылку на столбец Коррелированной Таблицы (коррелированной - итоговой, результирующей).
Использование Подзапросов в командах UPDATE - SQL, подсписках SET:
В версии Visual FoxPro 9.0, смотрите подраздел: UPDATE - SQL, команда, теперь поддерживаются Подзапросы в секции SET.
Подзапросы в секциях SET должны удовлетворять тем же требованиям,ераций Сравнения. Если Подзапрос не возвращает результирующих Записей, то возвращается значение = NULL.
Только один Подзапрос допустим в секции SET. Если в данной секции SET используется Подзапрос, то утверждение типа WHERE недопустимо.
Общая синтаксическая конструкция для описанного случая может выглядеть следующим образом:
UPDATE … SET … (SELECT …) …
Пример:
Далее представлен пример программного кода, демонстрирующий использование Подзапроса в секции SET, для команды UPDATE - SQL:
![]() |
|
---|---|
CLOSE DATA |
Составные (вложенные) конструкции SELECT
в секциях FROM:
В составных конструкциях SELECT часто появляются ссылки на различные Таблицы. Различные Таблицы в операторе SELECT указываются в секции FROM, которые задаются в виде Алиасов или пользовательских Имен. Результирующий Набор оператора SELECT, с использованием таблиц из секции FROM, создается при помощи Внешнего Объединения SELECT (Outer Select). Версия Visual FoxPro 9.0 обеспечивает использовани Подзапросов в секции FROM.
Составные конструкции SELECT указываются в круглых скобках и требуют обязательного указания результирующего Алиаса главного Оператора. Корреляция не поддерживается. Для составных (вложенных) операторов SELECT действителен синтаксис и Ограничения, как для обычного SQL - SELECT, но оганичения на Подзапросы не не поддерживаются. Все составные (вложеные) конструкции SELECT должны выполняться до выполнения Главного оператора SELECT.
Далее представлена каноническая, синтаксическая конструкция для составного (вложенного) Подзапроса в секции FROM.
SELECT … FROM (SELECT …) [AS] Alias…
Пример:
Далее представлен пример использования вложенного SQL-SELECT из секции FROM.
![]() |
|
---|---|
SELECT * FROM (SELECT * FROM MyCursor T1; |
Конструкция ORDER
BY с именами Полей в секции UNION:
При использовании секции UNION в версии Visual FoxPro 8.0, вы были вынуждены использовать Номера результирующих Столбцов для определения необходимой Сортировки, определяемой в секции ORDER BY. В версии Visual FoxPro 9.0, описанное ограничение снято и вы можете указавать Имена результирующих Столбцов.
Требуемые имена столбцов сортировки должны быть определены в итоговом Списке результирующего оператора SELECT (последнего при использовании конструкций UNION); только после этого данные Столбцы могут быть указаны в секции Сортировки ORDER BY.
Пример:
Далее представлен пример использования имен итоговых столбцов для определения режимов Сортировки в секции ORDER BY.
![]() |
|
---|---|
CLOSE DATABASES all |
Оптимизация выполнения конструкции TOP N:
В версии Visual FoxPro 8.0, и в более младших версиях, когда используется конструкция TOP N [PERCENT], сначала выполняется выборка и сортировка всех Результирующих Записей, а потом извлекаются требуемые (TOP N). В версии Visual FoxPro 9.0, выполнение подобных SQL-SELECT значительно улучшено, увеличена скорость выборки, за счет Исключающих Записей (Eliminating Records), которые изначально отбрасываются и не участвуют в формировании результирующего Набора, создаваемого по конструкции TOP N, исключаются из процесса сротировуки на ранних стадиях выполнения Запроса.
Конструкция TOP N оптимизируется только в том случа, когда для стандартной команды SET ENGINEBEHAVIOR установлено значение = 90.
Оптимизация требует, чтобы конструкция TOP N возвращала не более чем N записей в Результирующем Наборе (что недействительно для версии Visual FoxPro 8.0 и более ранних версий), когда же определено SET ENGINEBEHAVIOR = 90, то процессы оптимизации Включаются.
Секция TOP N PERCENT не может быть Оптимизирована, если результирующий Набор не поместим целиком в оперативную память Рабочей Станции.
Улучшенная Оптимизация выборки из нескольких Таблиц с составными условиями типа OR (или)
Версия Visual FoxPro 9.0 обеспечивает улучшение Оптимизации типа Rushmore для многотабличных Выборок с условными конструкциями OR (ИЛИ). Visual FoxPro использует оптимизацию Rushmore для фильтрованных сложных составных Условий типа OR для обоих сторон определяющих условия выборки; в данном случае возможна Улучшенная Оптимизация. Следующий далее пример иллюстрирует вышесказанное:
![]() |
|
---|---|
CLEAR |
По представленному Сценарию выполнения Запроса, выборка из Таблицы Test1 может быть оптимизированапо Rushmore; для этого рекомендуется использовать следующие Оптимизируемые Конструкции:
(f1 IN (1,2,3) OR f1 IN (17,18,19))
А для Таблицы Test2 - можно использовать следующую Оптимизацию:
(f2 IN (17,18,19) OR f2 IN (1,2,3))
Поддержка для Локально Буферизованных Данных (Local Buffered Data):
Иногда, бывает полезно пользоваться Запросами SELECT - SQL для получения Данных из Таблиц, которые не изменяются в текущий момент (данные - статичные), таблицы представлены в виде буферизованных Курсоров. Во многих случаях, когда создаются Контролы типа Сетка (Grid), Списки (ListBox/ComboBox), указанные Курсоры могут содержать несколько новых Записей, которые еще не отражены на Диске (пока не ваполнена Запись на Диск). Однако, в текущий момент, оператор SQL основан на реальных данных, которые уже отображены на Диске.
Версия Visual FoxPro 9.0 обеспечивает расширения Языка (Visual FoxPro), для поддержки актуальных данных в динамических конструкциях SELECT - SQL, которые основаны либо на новых данных из буферов Курсоров или на данных с Диска.
Новый синтаксис команды SELECT - SQL теперь поддерживает секцию WITH … BUFFERING, которая позволяет контролировать обновление Данных на Диске и Буферах. Дополнительную информацию смотрите в разделе: SELECT - SQL, команда, - WITH, секция.
Если вы не используете указание параметра BUFFERING, процесс загружаемых данных определяется согласно Сценарию, определяемому текущей установкой команды SET SQLBUFFERING. Дополнительно смотрите раздел: SET SQLBUFFERING, команда.
Расширение других Команд SQL (Visual FoxPro)
В текущем разделе описываются расширения для команд: INSERT - SQL, команда, UPDATE - SQL, команда, и DELETE - SQL, команда, действительные для версии Visual FoxPro 9.0.
Секция UNION в команде INSERT - SQL:
Начиная с версии Visual FoxPro 9.0, секция UNION теперь поддерживается в команде: INSERT - SQL.
Далее представлена основная синтаксическая конструкция использования секции UNION:
INSERT INTO … SELECT … FROM … [UNION SELECT … [UNION …]]
Пример:
Далее демонстрируется использование секции UNION в команде INSERT-SQL.
![]() |
|
---|---|
CLOSE DATABASES ALL |
Коррелируемые команды UPDATE - SQL:
Начиная с версии Visual FoxPro 9.0 поддерживаются Корреляционные Изменения Данных при помощи соответствующей команды UPDATE - SQL.
Если секция FROM включена в команду UPDATE -SQL, тогда имя, следующее после ключевого слова UPDATE определяет наименование результирующего набора данных операции Изменения. Это может быть именем Таблицы, именем Алиаса, или именем файла данных. Следующая логическая цепочка может быть использована для выбора результирующей таблицы:
-
Если указанное Имя явно или неявно совпадает с именем Таблицы, указанной в секции FROM, тогда эта таблицы используется как результирующий набор в операции Изменения (UPDATE SQL).
-
Если Имя соответствует имени алиаса Курсора из текущей Сессии Данных, тогда этот Курсор - результирующий набор.
-
Если указано имя Таблицы или Файла, то данное имя используется в качестве результирующего набора.
В команде UPDATE -SQL, секция FROM имеет аналогичный синтаксис, как и секция FROM в команде SELECT - SQL, за исключением следующих Ограничений:
-
Результирующая Таблица или Курсор не могут быть включены в качестве второстепенного (присоединяемого) Набора Данных в утверждении OUTER JOIN.
-
Результирующий Курсор не может быть Результатом ПодЗапроса.
-
Все другие присоединяемые Элементы (JOIN) должны быть уже вычислены, до определения Результирующего набора.
Действителен следующий общий синтаксис для команды SQL- UPDATE.
UPDATE … SET … FROM … WHERE
…
Пример:
Далее представлен пример Корреляционного Изменения Данных с помощью команды: UPDATE -SQL.
![]() |
|
---|---|
CLOSE DATABASES ALL |
Корреляционные команды DELETE - SQL:
Начиная с версии Visual FoxPro 9.0, теперь поддерживается Корреляционное Удаление с помощью команды DELETE - SQL.
Если в секции FROM указана более чем одна таблица, тогда Имя, заданное сразу за ключевым словом DELETE является обязательным для успешного выполнения операции удаления. Данное имя может указывать: на имя Таблицы, Алиаса Рабочей Области или имя файла Данных. Рекомендуется поддерживаться следующей Логике:
-
Если указанное Имя, явно или неявно, соответствует Таблице, указанной в секции FROM, тогда эта таблица является результирующим набором при операции Удаления.
-
Если Имя соответствует Алиасу Курсора для текущей Сессии Данных, тогда этот курсор является результирующим Набором.
-
Указанное явно имя Таблицы или файла Данных является результирующим набором.
Синтаксис секции FROM для команды DELETE -SQL подчиняется аналогичным правилам для секции FROM рассмотренной выше команды SELECT - SQL, но имеют место следующие Ограничения:
-
Результирующий курсор или Таблица не могут быть второстепенным (присоединяемым) элементом в утверждении OUTER JOIN.
-
Результирующий Курсор не может быть результирующим набором Подзапроса.
-
Для возможности использования результирующего Курсора в конструкциях Объединения, все прочие Элементы JOIN должны быть определены до вычисления рассматриваемого Курсора.
Для данного случая справедлива следующая синтаксическая Конструкция команды SQL - DELETE:
DELETE [alias] FROM alias1 [, alias2 … ] … WHERE …
Пример:
Далее представлен пример корреляционной (зависимой) команды DELETE -SQL.
![]() |
|
---|---|
CLOSE DATABASES ALL |
Изменяемые Поля (столбцы) в команде UPDATE - SQL:
Количество Полей, которые могут быть изменены с помощью команды UPDATE - SQL больше не ограничено числом = 128 (ограничение для версии 8). Теперь это ограничение = 255, что соответствует максимальному количеству Полей в Таблице (Visual FoxPro).
Команда SET ENGINEBEHAVIOR:
Указанная команда SET ENGINEBEHAVIOR, в версии Visual FoxPro 9.0, имеет дополнительную опцию = 90, которая влияет на поведение в команде SELECT - SQL секции TOP N и Агрегатных Функций. Смотрите дополнительную информацию по данному вопросу в разделе: SET ENGINEBEHAVIOR.
Преобразование Типов Данных:
Преобразование типов данных (например, преобразование между полем memo и символьным полем) существенно улучшено в версии Visual FoxPro 9.0. Данное преобразование обеспечивается в команде ALTER TABLE - SQL, когда в опции COLUMN изменяется структура Таблицы, поддерживаемое в Дизайнере Таблиц.
См. также
Описание
Введение в Развитие Подсистемы Разработки ОтчетовФункциональные улучшения обработки Данных и XML
Расширение функциональности Классов
Улучшения и Расширения Языка Программирования (Visual FoxPro)
Рапсширения в Интерактивной Среде Разработки (IDE)
Расширения в Дизайнерах и Построителях Visual FoxPro
Прочие Улучшения Функциональности
Изменения Функциональности для Текущей (9) версии
ALTER TABLE - SQL, команда
SET SQLBUFFERING, команда
SET ENGINEBEHAVIOR, команда