Фраза 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 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
Использование в программах команды 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 (Обзор) на экране
Опции диалогового окна 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.