Фраза HAVING



Фраза HAVING

Для применения условий к группам, созданным фразой group by, используется фраза having, которая играет такую же роль для групп, что и фраза where для записей.

Замечание
Замечание

Разница между фразами where и having состоит в том, что where применяется к строкам, в то время как having применяется к группам.

Запрос может содержать и фразу where, и фразу having. В этом случае первой выполняется фраза where, поскольку она выполняется до разбиения на группы.

Рассмотрим пример выборки городов, в которых имеется более десяти покупателей:

SELECT cCountry

FROM Customer ;

GROUP BY cCountry;

HAVING COUNT(*)>10

Предупреждение
Вы не можете использовать фразу having отдельно от фразы group by.





Расширенные средства выборки данных



Глава 18. Расширенные средства выборки данных

Вывод результатов запроса Просмотр результатов запроса в режиме Browse Сохранение результатов запроса в курсоре Сохранение результатов запроса в таблице Представление результатов запроса на экране Сохранение результатов запроса в формате HTML Использование в программах команды Select Использование переменных при формировании запросов Подзапросы Фраза HAVING Оператор EXISTS Оператор UNION



Использование переменных при формировании запросов



Использование переменных при формировании запросов

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

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

Откройте новое окно редактирования программы. Для этого в меню File (Файл) выберите команду New (Новый). В открывшемся диалоговом окне выберите опцию Program (Программа) и нажмите кнопку New file (Новый файл). Откройте окно созданного ранее запроса, содержащего выборку из таблиц ordsalem и Ordsaied с итоговой суммой по каждому заказу. Нажмите кнопку Show the SQL Window (Показать окно SQL) на панели инструментов Query Designer (Конструктор запроса) или в меню Query (Запрос) выберите команду View SQL (Показать SQL). В окне просмотра выделите команду select и сохраните ее во временном буфере Windows. Скопируйте содержимое буфера Windows в окно редактирования программы. Укажите перед командой select начальную и конечную даты, определяющие промежуток времени, а также значение переменной, которая задает имя результирующей таблицы:

dBeg=CTOD("01.04.03") && начальная дата

dEnd=CTOD("30.0<3.03") && конечная дата                            

cOutput="Ords" && имя результирующей таблицы

Добавьте в конструкцию select условие задания периода времени, используя переменные dBeg и dEnd:

SELECT Ordsalem.icdorder AS заказ,;

SUM(Ordsaled.nQuant*Ordsaled.nUnitPrice) AS стоимость;

FROM sales!ordsalem INNER JOIN sales!ordsaled ;

ON Ordsalem.icdorder = Ordsaled.icdorder;

WHERE Ordsalem.dDoc BETWEEN dBeg AND dEnd;

GROUP BY Ordsalem.icdorder;

INTO TABLE &cOutput

Сохраните программу под именем Ords.prg и проверьте синтаксис.

Использование в программах команды Select



Использование в программах команды Select

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



Оператор EXISTS



Оператор EXISTS

Оператор exists принимает значение True (Истина), если результат выполнения подзапроса является непустым множеством. Если порожденное подзапросом множество пусто, то exists принимает значение False (Ложь). Оператор not exists работает в точности наоборот. Он истинен, если результат подзапроса пуст, и ложен в противном случае.

Замечание
Замечание

Операторы exists и not exists всегда помещаются перед подзапросом.

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

SELECT cNmGoods ;

FROM Goods

WHERE EXISTS

(SELECT *

FROM Customer, Ordsalem, Ordsaled ;

WHERE Ordsalem.icdOrder=Ordsaled.icdOrder ;

AND Ordsalem.iCdCustomer = Customer.iCdCustomer ;

AND Ordsaled.iCdGoods = Goods.iCdGoods ;

AND Customer.cCity = 'Новгород')





Оператор UNION



Оператор UNION

Для объединения результатов запросов используется оператор union. Результатом объединения является результирующее множество, состоящее из всех строк, входящих в какое-либо одно или в оба результирующих множества объединяемых запросов.

В качестве примера выберем список покупателей, которые живут в Новгороде или покупают товар с кодом 2103:

SELECT icdCustomer ;

FROM Customer ;

WHERE cCity = 'Новгород' ;

UNION ;

SELECT icdCustomer;

FROM Ordsalem, Ordsaled ;

WHERE Ordsalem.icdOrder=Ordsaled.icdOrder ;

AND icdGoods = 2103

Из результата выборки, использующей оператор union, исключаются повторяющиеся строки. Для отображения их в результирующей выборке используйте опцию ALL.

Предупреждение
Фраза order by в запросе с использованием оператора union может входить только в последний оператор select.





Подзапросы



Подзапросы

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

SELECT icdGoods ;

FROM Goods;

WHERE nUnitPrice >;

(SELECT 0.9 * MAX (nUnitPrice) ;

FROM Goods)





Представление результатов запроса на экране



Представление результатов запроса на экране

На рис. 18.4 показано диалоговое окно Query Destination (Результаты запроса), в котором выбрана опция Screen (Экран).

Просмотр результатов запроса в режиме Browse



Просмотр результатов запроса в режиме Browse

По умолчанию Visual FoxPro помещает результаты запроса во временную таблицу и выводит ее на экран в режиме Browse (Обзор) (рис. 18.2). После закрытия окна временная таблица удаляется из памяти. Этот режим удобен в том случае, если вы хотите просто просмотреть результаты запроса.

Просмотр запроса в режиме Browse



Рис. 18.2. Просмотр запроса в режиме Browse




Диалоговое окно Query Destination с установленной опцией Cursor



Рис. 18.3. Диалоговое окно Query Destination с установленной опцией Cursor


Совет
Совет

Для повышения быстродействия и избежания проблем, связанных с именами файлов при работе в сети, небольшие курсоры желательно держать в памяти или на локальном диске. При увеличении размера курсоров и отсутствии достаточного количества места Visual FoxPro записывает их на физический носитель.





Диалоговое окно Query Destination с выбранной опцией Screen



Рис. 18.4. Диалоговое окно Query Destination с выбранной опцией Screen


Область Secondary output (Вторичный вывод) содержит опции, указывающие, куда дополнительно направляются результаты запроса:

None (Нет) — вывода результатов запроса не происходит; То printer (На принтер) — результаты запроса выводятся на принтер; То text file (В текстовый файл) — вывод результатов осуществляется в текстовый файл.

В области Options (Параметры) диалогового окна расположены два флажки. При установке флажка Suppress column headings (He отображать заголовки столбцов) в отображаемом запросе не указываются заголовки столбцов. Установленный флажок Pause between screens (Пауза между экранами) указывает на необходимость делать паузу при заполнении экрана.

Замечание
Замечание

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



Диалоговое окно Save As HTML



Рис. 18.5. Диалоговое окно Save As HTML




Окно редактирования запроса в формате HTML



Рис. 18.6. Окно редактирования запроса в формате HTML




Просмотр HTML-файла в окне Web-браузера



Рис. 18.7. Просмотр HTML-файла в окне Web-браузера


Поле, расположенное в нижней части диалогового окна Save As HTML (Сохранить как HTML-файл), позволяет указать расположение сохраняемого файла. Если хотите изменить указанный по умолчанию адрес, воспользуйтесь кнопкой открытия окна диалога Save As (Сохранить как), расположенной справа от поля, укажите имя создаваемого файла с расширением НТМ. а также папку, в которой файл будет сохранен.





Программа и полученная в результате ее выполнения таблица Ords



Рис 18.8. Программа и полученная в результате ее выполнения таблица Ords




Выполните программу, в результате чего в таблицу ords будет записана итоговая сумма по заказам (рис 18.8). В дальнейшем вы можете использовать эту таблицу для просмотра, печати отчета или построения графика.



Сохранение результатов запроса в формате HTML



Сохранение результатов запроса в формате HTML

Visual FoxPro позволяет сохранять результат выполнения запроса, как и любую другую таблицу, в формате HTML. Для этого предназначена команда Save As HTML (Сохранить как HTML-файл) из меню File (Файл), открывающая соответствующее диалоговое окно (рис. 18.5), содержащее три опции, приведенные в табл. 18.2.

Сохранение результатов запроса в курсоре



Сохранение результатов запроса в курсоре

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

Для направления результатов запроса в курсор в диалоговом окне Query Destination (Результаты запроса) установите опцию Cursor (Курсор) (рис. 18.3), в поле Cursor name (Имя курсора) введите имя курсора и нажмите кнопку ОК. Введенное имя будет служить псевдонимом для ссылки на результаты запроса. В окне расположены флажки следующего назначения:

READWRITE — указывает, что курсор является временным и модифицируемым. Для таблиц, содержащих автоинкрементные поля, эти свойства в курсоре не наследуются; NOFILTER — указывает, что создается курсор, который может использоваться в последующих запросах.

Сохранение результатов запроса в таблице



Сохранение результатов запроса в таблице

Для сохранения результатов запроса в таблице предназначена кнопка Table (

Назначение кнопок диалогового окна Query Destination



Таблица 18.1. Назначение кнопок диалогового окна Query Destination

Кнопка Назначение Browse (Обзор) 

Сохраняет результат выборки в стандартной результирующей таблице и отображает результаты запроса в режиме Browse (Обзор) на экране Cursor (Курсор)  Обеспечивает временное хранение результатов запроса в виде, доступном только для чтения Table (

Опции диалогового окна Save As HTML



Таблица 18.2. Опции диалогового окна Save As HTML

Опция Назначение
Save file for later use (Сохранить файл) Сохраняет результат запроса на диске в формате файла HTML
Save and edit file (Сохранить файл и открыть для редактирования) Сохраняет результат запроса на диске в формате файла HTML и открывает его для редактирования (рис. 18.6)
Save file and view in web browser (Сохранить файл и открыть для просмотра в Web-браузере)

Сохраняет результат запроса на диске в формате файла HTML и открывает его для просмотра в окне Web-браузера (рис. 18.7)


Таблица диалогового окна Query...



Таблица) диалогового окна Query Destination (Результаты запроса). При ее нажатии становится доступным поле Table name (Имя таблицы), используемое для ввода имени таблицы, в которой будут сохранены результаты. Для указания папки, в которой требуется сохранить таблицу, воспользуйтесь расположенной справа от поля кнопкой, открывающей диалоговое окно Open (Открыть).

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



Вывод результатов запроса



Вывод результатов запроса

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

Visual FoxPro может направить результат выборки в стандартную результирующую таблицу, которая отображается на экране в режиме Browse (Обзор), во вновь создаваемую таблицу, в курсор или в активное окно.

Для изменения направления вывода используется диалоговое окно Query Destination (Результат запроса) (рис. 18.1). Чтобы его открыть, выполните одно из приведенных далее действий.

Нажмите кнопку Query Destination (Результат запроса) на панели инструментов Query Designer (Конструктор запроса). В меню Query (Запрос) выберите команду Query Destination (Результаты запроса).

Диалоговое окно Query Destination (Результаты запроса) содержит кнопки, описанные в табл. 18.1.