РАБОТАЕМ С ДАННЫМИ | КОМПЬЮТЕРНАЯ ГАЗЕТА
Оборотная сторона Microsoft Access Хитрое это дело - программирование. Ядро внутри может быть совершенно одинаковым, но стоит придумать два различных пользовательских интерфейса, и даже матерые профессионалы не сумеют с уверенностью сказать, они имеют дело с одной и той же программой или с двумя разными. Это явление имеет, как минимум, два характерных аспекта. Во-первых, зачастую внутри множества знакомых нам программ работают одни и те же рабочие алгоритмы, а порой даже и исходные коды. Во-вторых, есть у подавляющего большинства СУБД кое-что, их всех роднящее. Это "кое-что" называется SQL. (c) Компьютерная газета | Предыстория языка запросов (SQL) уже описывалась ранее, так что сейчас мы это дело пропустим и сразу перейдем к практической стороне вопроса. Посредством механизма SQL становится возможным как обращаться к содержимому баз Microsoft Access из других приложений (в том числе и приложений от других производителей), так и получать данные для Microsoft Access из внешних приложений, поддерживающих SQL. Кроме того, язык запросов удобно использовать еще в тех случаях, когда нужно получать типовые данные, расположенные в одном и том же месте в строго определенном порядке, и разрабатывать для этого целый стандартный запрос (с таблицами и прочими радостями) совершенно излишне. Обычно с этой проблемой конечные пользователи не сталкиваются, так как разрабатываемые ими базы данных, как правило, чрезвычайно просты и системные ограничения для них не играют практически никакой роли. Другое дело, когда приходится разрабатывать серьезное приложение для так называемого "корпоративного" применения, оперирующее большим массивом данных и единовременно выполняющее множество всевозможных внутренних программ, для чего ему требуется много памяти и вычислительной мощности. Как известно, девять десятых мощности компьютера тратится на пользовательский интерфейс и прочие сопутствующие действия, с непосредственными вычислениями никак не связанные. Следовательно, нередко можно сэкономить за счет написания некоторых простых запросов Microsoft Access непосредственно на SQL, тем более, что на самом деле он же применяется в ядре самой СУБД Microsoft Access. Перед тем как изучить несколько практических примеров использования языка запросов, нужно рассмотреть ряд соглашений, которые приняты в Microsoft Access. Соглашения SQL Значение Прописные буквы Прописными буквами пишутся ключевые и зарезервированные слова, которые должны быть введены в том виде, в котором они написаны. Правда Microsoft Access "понимает" ключевые слова, которые написаны не только прописными, но и строчными буквами. Курсив Как правило, задаваемые пользователем имена переменных набираются курсивом. Угловые скобки <> Далее в угловые скобки будут заключаться элементы синтаксиса, которые пользователь должен задать самостоятельно. Текст внутри таких скобок характеризует элемент, но не описывает синтаксис этого элемента. Квадратные скобки [ ] В квадратные скобки заключаются необязатель-ные элементы, разделяемых символом "вертикальная черта" |. Фигурные скобки { } Фигурные скобки заключают в себе один или несколько элементов, разделенных вертикальной чертой. Многоточие ... В примерах многоточие указывает на то, что вышеописанный элемент может быть повторен несколько раз. Ядром языка запросов является инструкция SELECT. Она используется каждый раз, когда нужно просмотреть или выбрать строку или столбец таблицы базы данных. Инструкцию SELECT <список полей> используют пять базовых предложений языка запросов: - FROM <список таблиц> - [WHERE <спецификация выбора строк>] - [GROUP BY <спецификация группировки>] - [HAVING <спецификация выбора групп>] - [ORDER BY <спецификация сортировки>] В языке запросов, реализованном в Microsoft Access, поддерживаются четыре крайне важных дополнительных расширения: TRANSFORM (позволяет строить перекрестные запросы), IN (создание связи с удаленной базой данных), DISTINCTROW (определение запроса-объединения с потенциальной возможностью объединения данных), WITH OWNER-ACCESS OPTION (позволяет создавать специализированные запросы, которые может выполнять пользователь, не имеющий права доступа к таблицам, которыми оперирует данный запрос). Базовой конструкцией языка запросов является выражение, например: [+|-] {функция | (выражение) | литерал |имя_столбца} [{ + | - | * | / | \ | ^ | MOD | &} {функция | (выражение) | литерал | имя_столбца} ]... В качестве функции могут быть использованы итоговые функции SQL, например такие, как AVG, COUNT, MAX, MIN, STDEV, STDEVP, SUM, VAR или VARP. Кроме того, в качестве функции могут применяться встроенные функции Microsoft Access и даже встроенного языка Access Basic. В качестве выражения могут быть применены любые другие синтаксические конструкции SQL, разделенные знаками операций (умножение, сложение, вычитание и так далее). Под литералом понимается числовая или буквенно-цифровая константа. Последнюю следует заключить в кавычки или апострофы. Для включения апострофа в тело константы следует включить его дважды в тело литерала. Литерал, задающий время или дату, должен обязательно заключаться в символы #. В качестве имени столбца разработчик может использовать любое имя столбца (поля) таблицы или запроса. Ограничение тут всего одно: оперировать можно только теми таблицами, которые предварительно описаны в списке предложения FROM текущей инструкции. В противном случае Microsoft Access напрочь откажется понимать такое предложение, что приведет к ошибке. Обратите внимание, если одно и то же имя столбца применяется в нескольких таблицах сразу, то нужно обязательно указывать еще и имя таблицы [Таблица Альфа].[Столбец 1] При помощи символа "логическое и" прямо в теле предложения языка запросов можно соединять несколько буквенно-цифровых констант в одну и использовать результат как единое целое. Например: AVG (COAST) - автоматическое определение среднего значения столбца COAST некоторой таблицы. (PRICE *.5) - автоматическое уменьшение числового содержимого столбца PRICE на половину. Чуть ранее, я уже упоминал предложение FROM, при помощи которого описываются все источники данных для запроса. Синтаксис предложения выглядит следующим образом. FROM {{ имя_таблицы [[AS] псевдоним ] | Имя_запроса_выборки [[AS] псевдоним ] } | <таблица_объединения>},... где таблица_объединение есть ({ имя_таблицы [[AS] псевдоним ] | имя_запроса_выборки [[AS] псевдоним ] | <таблица_объединения> { INNER | LEFT | RIGHT } JOIN { имя_таблицы [[AS] псевдоним ] | имя_запроса_выборки [[AS] псевдоним ] | <таблица_объединения> } ON <условие_объединения>) При желании, для каждой таблицы или запроса вы можете определить временное рабочее имя, которое может быть более информативным, чем основное имя. Также нередко псевдоним используется в тех случаях, когда его написать короче, чем полное истинное имя таблицы или запроса. Только тут уж придется строго придерживаться выбранной линии. Если вы назначили таблице или запросу псевдоним, то в данном предложении языка запросов уже нельзя будет указать псевдоним вперемешку с истинным именем. Если истинное имя таблицы или запроса, равно как и псевдоним, совпадают с каким-нибудь зарезервированным словом SQL, например ORDER, то оно обязательно должно быть заключено в квадратные скобки. Как вы уже могли заметить, программирование на SQL весьма похоже на обычное программирование на любом другом языке. Увы, рамки газетной статьи не позволяют рассмотреть его подробно, поэтому я лучше расскажу о том, как можно относительно быстро разобраться в языке запросов без лишних книжек и ненужной нервотрепки. Я уже говорил, что внутри любого запроса или таблицы Microsoft Access на самом деле "лежит" запись на SQL. Так вот, ее можно весьма успешно использовать в качестве оперативного и удобного учебника по SQL. Метод прост и очевиден. Сначала берете и создаете таблицу или запрос в обычной среде визуального программирования Microsoft Access. Затем проверяете работоспособность полученной конструкции. Если все нормально, то далее следует переключить представление таблицы или запроса в режим языка запросов и внимательно изучить полученную последовательность команд. При желании, с ними можно поэкспериментировать для лучшего понимания. Переключение "в SQL" делается следующим образом. Активизируйте интересующий вас объект, например запрос (см. рис. 1). Наведите маркер мыши в любое место окна запроса или таблицы и нажатием правой клавиши мыши активизируйте контекстно-зависимое меню (см. рис. 2). Там есть режим РЕЖИМ SQL, который нам, собственно, и нужен. Microsoft Access мгновенно преобразует запрос в набор предложений языка запросов (см. рис. 3). Как говорится, автоматика в действии. Теперь можно, в зависимости от желания, либо просто просмотреть запись, либо что-нибудь в ней "подредактировать". Потом, когда нужда в SQL отпадет, можно все вернуть назад. Это делается опять же через контекстно-зависимое меню мыши, которое, правда, имеет несколько другой вид (см. рис. 4). В нем существует режим РЕЖИМ ТАБЛИЦЫ, который превращает набор предложений языка запросов в графически оформленный, такой родной и привычный, модуль. Если вы перед этим ничего не меняли, то все вернется на круги своя. В противном случае Microsoft Access произведет некоторые изменения, которые будут зависеть от того, что вы там дописали на "эскуэле" в исходном коде. В сочетании с достаточно мощным встроенным в Microsoft Access учебником по SQL такой прием позволяет довольно быстро наработать необходимые навыки, если не для полноценного программирования на SQL, то во всяком случае для того, чтобы понимать его особенности и чувствовать, когда имеет смысл использовать именно конструкции на SQL. Александр Запольскис E-mail: leshy@nestor.minsk.by