Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Команда SELECT – SQL




Конструктор запросов представляет собой визуальный построитель выражения команды выборки. Разработчик может в любой момент из конструктора представления данных посмотреть его программный эквивалент, используя соответствующий управляющий элемент на панели инструментов View Designer (рис.18).

Рис. 18 Панель View Designer

По нажатию на элемент просмотра SQL на экране появляется стандартное окно редактирования текстовых выражений, в котором отображается сформированный конструктором представлений программный код, реализующий работу представления данных. В самом начале всегда располагается конструкция SELECT – SQL, в которой включены только те опциональные части, которые были определены разработчиком в конструкторе представления. После оператора выборки располагается большой блок команд DBSetProp. Эта часть программного представления отвечает за настройку обратной связи данных, т.е. за то, чтобы редактирование данных в представлении отображалось в исходных таблицах. Таким образом, представление данных состоит из двух логических частей: собственно самой выборки данных и блока обратной связи.

Очень часто блок обратной связи просто не нужен, например, при формировании справочных наборов данных или источников данных для отчетов. В таких случаях рекомендуется использовать только оператор выборки в программной части приложения (программный код в методах различных компонентов проекта). Существует несколько способов создания такого кода. Самым простым и очевидным является построение выражения в конструкторе запросов, с последующим копированием полученного текста оператора SELECT в необходимое место программы. Однако этот метод обладает огромным недостатком, а именно, конструктор представлений предназначен для организации работы именно представлений данных, а не выборок. Поэтому, зачастую, явное копирование выражения SELECT приводит к неправильной работе программного кода. Разработчик вынужден впоследствии корректировать команду выборки данных исходя из конкретных условий задачи.

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

Синтаксис команды SELECT – SQL представляет довольно сложную конструкцию:

SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]] Select_List_Item [,...]

FROM [FORCE] Table_List_Item [,...]

[[JoinType] JOIN DatabaseName!]Table [[AS] Local_Alias]

[ON JoinCondition [AND | OR [JoinCondition | FilterCondition]...]

[WITH (BUFFERING = lExpr)]

[WHERE JoinCondition | FilterCondition [AND | OR JoinCondition | FilterCondition]...]

[GROUP BY Column_List_Item [,...]] [HAVING FilterCondition [AND | OR...]]

[UNION [ALL] SELECTCommand]

[ORDER BY Order_Item [ASC | DESC] [,...]]

[INTO StorageDestination | TO DisplayDestination]

[PREFERENCE PreferenceName] [NOCONSOLE] [PLAIN] [NOWAIT]

 

однако обязательными являются только те элементы, которые не включены в квадратные скобки []. Таким образом, минимальная конструкция оператора выборки выглядит следующим образом:

SELECT Select_List_Item FROM Table_List_Item

 

В этом выражении Select_List_Item обозначает список имен полей, разделенных запятой, которые будут входить в результирующую выборку, а Table_List_Item – список открытых таблиц, из которых будет производиться выборка. Если в результате необходим полный набор полей, допускается использование служебного символа *.

Например:

SELECT cnmGoods FROM Goods

по этой команде будет создана выборка данных из таблицы GOODS, включающая в себя все значения поля cnmGoods. Выборка будет автоматически открыта в окне табличного просмотра BROWSE.

 

SELECT icdGoods, cnmGoods, cnmGoodsGrp, nUnitPrice FROM Goods

по этой команде в результат выборки будут помещены значения всех полей из таблицы GOODS. Обратите внимание, что эквивалентной является команда SELECT * FROM Goods.

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

Например, по команде SELECT cnmGoddsGrp From Goods пользователь получит полный список значений выражения поля cnmGoodsGrp. Причем количество записей в выборке будет совпадать с количеством записей в исходной таблице Goods, т.е. если было 50 товаров, принадлежащих одной группе, то в результате будут 50 одинаковых записей групп, что само по себе не имеет глубокого смысла. Команда SELECT DISTINCT cnmGoddsGrp From Goods в результате выдаст только неповторяющиеся записи, не зависимо от того, сколько раз значение встречается в исходной таблице, что приведет к формированию полного списка всех групп товаров, что уже является достаточно осмысленным. Полученный список групп удобно использовать как источник данных для элементов выбора на формах ввода.

Остальные необязательные элементы эквивалентны соответствующим вкладкам в конструкторе представлений. Вкратце рассмотрим основные из них.

JOIN – служебное слово, позволяющее произвести соединение данных нескольких таблиц. Перед ним необходимо указать тип соединения (INNER, LEFT, RIGHT, FULL). Допускается указывать только один тип соединения. После служебного слова ON указывается условие соединения. Т.к. выборка в данном случае проводится из нескольких таблиц, перед именами полей следует указать имя таблицы через точку (ИмяТаблицы. ИмяПоля). Допускается указывать несколько условий, разделенных логическими операторами.

Например:

SELECT * FROM Customer LEFT JOIN Phoncust ON Customer.icdCustomer=Phoncust.icdCustomer

по этой команде пользователь получит полный набор данных о заказчиках и их телефонах, если у заказчика нет телефона, недостающие поля будут заполнены пустым значением NULL. Изменением типа соединения на RIGHT можно добиться результата, когда будет выдана информация только о тех заказчиках, у которых ЕСТЬ телефоны (SELECT * FROM Customer RIGHT JOIN Phoncust ON Customer.icdCustomer=Phoncust.icdCustomer).

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

Например:

SELECT * FROM Customer WHERE cCity=”Рыбница”

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

Команда SELECT * FROM Customer WHERE cCity=”Рыбница” AND cCity=”Резина” выдаст вообще пустой результат, т.к. по логике должны быть выбраны заказчики, проживающие в двух городах сразу. Для выбора заказчиков из двух городов в данном случае следовало использовать логический оператор OR (SELECT * FROM Customer WHERE cCity=”Рыбница” OR cCity=”Резина”).

Строго говоря, логический оператор AND, при указании условия для одного поля, можно использовать для указания диапазона значений. Команда SELECT * FROM Goods WHERE nUnitPrice>=10 AND nUnitPrice<100 выберет только те товары, цены на которые входят в диапазон [10, 100). Обратите внимание, что товар с ценой 10 попадет в результат выборки, а товар с ценой 100 – нет.

GROUP BY – служебное слово, позволяющее указать группировку данных. В основном используется при работе с вычисляемыми полями. Можно указать несколько полей через запятую, по которым будет производиться группировка данных, при этом порядок группировки будет соответствовать указанному списку полей.

ORDER BY – позволяет указать условие сортировки результата выборки. Служебные поля ASC и DESC служат для определения сортировки данных.

Например:

SELECT DISTINCT cCity FROM Customer ORDER BY cCity ASC

выдаст неповторяющийся список городов проживания заказчиков, отсортированный по алфавиту.

SELECT * FROM Goods WHERE cnmGoodsGrp=”Мебель” ORDER BY nUnitPrice DESC

выдаст товары из таблицы Goods, имеющие группу «Мебель», расположенные в порядке убывания цены.

INTO – служебное слово, позволяющее указать место назначения результата выборки. Местом назначения может быть массив, курсор или таблица (ARRAY, CURSOR, TABLE). Курсор в данном случае представляет собой временную таблицу в оперативной памяти, открытую в уникальной рабочей области. С курсором допускается проводить все операции, применимые к таблицам.

В случае использование служебного слова TO можно указать в качестве места назначения файл, принтер или экран (FILE, PRINTER, SCREEN).

 




Поделиться с друзьями:


Дата добавления: 2015-05-09; Просмотров: 638; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.026 сек.