Обработка данных

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

Согласно реляционной модели (см. “Реляционные БД”), все данные организованы в таблицы и, соответственно, все запросы обрабатывают таблицы. Очень важно подчеркнуть, что таблицы находятся не только на входе, но и на выходе любого запроса. То есть результатом любого запроса всегда является таблица.

Отметим, что таблицы, являющиеся исходными данными запроса, в свою очередь, могут являться результатом другого запроса.

На приведенной схеме пунктирные стрелки обозначают необязательные исходные данные запроса.

На приведенной схеме пунктирные стрелки обозначают необязятельные исходные данные запроса

Демонстрационная БД

Для рассмотрения всех дальнейших примеров нам понадобится небольшая демонстрационная база данных, заполненная минимумом информации. Возьмем для этих целей три таблицы из базы данных, которая служила для схожих иллюстративных целей в статье “Реляционные БД”. А именно, мы ограничимся таблицами “Учитель”, “Предмет” и таблицей связи “Учитель—Предмет”.

Допустим, что у нас есть три учителя. Иванов Иван Иванович преподает математику и информатику, Петров Петр Петрович — математику и физику, Сидорова Мария Ивановна — только информатику.

Реляционные операции

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

В статье “Реляционные БД” отмечено, что теория реляционных баз данных была сформулирована Коддом на строгом математическом языке. Изложение указанной теории не входит в наши задачи, поскольку лежит далеко за рамками не только школьного курса, но и практики использования баз данных. Поэтому здесь мы акцентируем внимание читателя лишь на тех вопросах, которые являются важными для понимания сути механизмов выполнения типичных запросов. С этой точки зрения нельзя обойтись без рассмотрения трех реляционных операций: выбора, проектирования и соединения.

Операция выбора

Посредством операции выбора из таблицы можно выбрать строки, удовлетворяющие некоторому условию. Например, из таблицы “Учитель—Предмет” посредством операции выбора можно выбрать все строки, относящиеся к учителю с номером 2:

ВЫБРАТЬ ВСЕ ПОЛЯ ИЗ ТАБЛИЦЫ

«Учитель—Предмет» ГДЕ «Номер учителя»=2

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

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

ВЫБРАТЬ ПОЛЕ «Фамилия» ИЗ ТАБЛИЦЫ «Учитель»

Результатом операции будет следующая таблица:

Отметим, что в предыдущем примере операция проектирования также использовалась — она “спряталась” во фразе ВСЕ ПОЛЯ. А в последнем примере неявно используется операция выбора, только она выбирает все строки. Вообще явно или неявно операции выбора и проектирования используются при любой выборке информации из базы данных.

Операция соединения

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

Пусть имеются две таблицы — A и B, в каждой по одному полю. В таблице A две строки, в таблице — три.

Декартовым произведением таблиц A и B будет таблица из двух полей и шести строк:

Возвращаясь к демонстрационному примеру, построим соединение таблиц “Учитель”, “Предмет” и “Учитель—Предмет”. Легко видеть, что пример получается достаточно громоздким. В нем 3 * 3 * 5 = 45 строк.

Само по себе соединение таблиц выглядит громоздким и бесполезным. Но истинная мощь реляционных операторов проявляется в их композиции.

Пусть нам требуется получить список учителей, дополненный предметами, которые они преподают. Для этого из соединения таблиц “Учитель”, “Учитель—Предмет” и “Предмет” надо выбрать строки, в которых номер учителя из таблицы “Учитель” совпадает с номером учителя из таблицы “Учитель—Предмет” и номер предмета из таблицы “Учитель—Предмет” совпадает с номером предмета из таблицы “Предмет”. Указанное логическое условие можно записать следующим образом:

«Учитель».»Номер учителя» = «Учитель—Предмет».»Номер учителя» И

«Учитель—Предмет».»Номер предмета» = «Предмет».»Номер предмета»

Соответствующие строки выделены в приведенной выше таблице — результате операции соединения.

Для решения последней задачи требуется применить все три операции — соединения, выбора и проекции. Соответствующий запрос имеет следующий вид:

ВЫБРАТЬ ПОЛЯ «Фамилия», «Имя», «Отчество», «Предмет»

ИЗ СОЕДИНЕНИЯ ТАБЛИЦ «Учитель», «Учитель—Предмет», «Предмет»

ГДЕ «Учитель».»Номер учителя» = «Учитель—Предмет».»Номер учителя» И

«Учитель—Предмет».»Номер предмета» = «Предмет».»Номер предмета»

При выполнении этого запроса сначала будет выполнена операция соединения и получена приведенная выше большая таблица. Затем посредством операции выбора из нее будут выбраны требуемые строки. И на последнем этапе с помощью операции проектирования будут оставлены лишь интересующие нас поля:

Язык SQL

Все реляционные СУБД поддерживают специальный язык SQL (Stuctured Query Language), на котором записываются запросы. Этот же язык упоминается в статье “Описание данных”, поскольку фактически SQL состоит из двух языков — DML (Data Manipulation Language) и DDL (Data Declaration Language).

История языка SQL началась в 1974 г. Первый прототип языка назывался SEQUEL (название образовано от Structured English Query Language). Впоследствии переработанная версия SEQUEL получила название SQL. Первый стандарт языка был принят в 1987 г.

SQL — декларативный язык. Это означает, что клиент лишь указывает, что именно ему требуется, а как это получить, решает сама СУБД.

Примеры подобных декларативных запросов были приведены выше при иллюстрации реляционных операций. Эти примеры могут быть практически буквально переписаны на SQL с использованием самой употребительной команды языка SELECT. Продемонстрируем это.

Иллюстрация операции выбора

SELECT * FROM «Учитель-Предмет» WHERE «Номер учителя»=2

Иллюстрация операции проектирования

SELECT «Фамилия» FROM «Учитель»

Иллюстрация операции соединения

SELECT «Фамилия», «Имя», «Отчество», «Предмет»

FROM «Учитель», «Учитель—Предмет», «Предмет»

WHERE «Учитель».»Номер учителя» = «Учитель—Предмет».»Номер учителя» И

«Учитель—Предмет».»Номер предмета» = «Предмет».»Номер предмета»

Из этих примеров видно, что операцию выбора выполняет предложение WHERE, операцию проектирования — список полей после SELECT, а операцию соединения — запятая в предложении FROM.

Язык QBE

Язык QBE (Query BExample) был разработан отделением IBM Reseach в конце 70-х годов на основе шаблонов, предложенных Робертом Злуфом. Он был задуман как средство, облегчающее работу для неспециалистов. Этот язык получил у пользователей столь широкое признание, что в настоящее время он реализован практически по всех популярных СУБД.

Язык QBE использует визуальный подход к организации доступа к информации в базе данных. Работа в нем осуществляется посредством задания образцов значений в шаблоне запроса.

Усовершенствованная версия QBE — GQBE (графический QBE) используется в конструкторе запросов Microsoft Access. На следующем рисунке показано, как выглядит в GQBE запрос, который был использован для иллюстрации операции соединения.

Любая реализация QBE, в том числе и GQBE, является лишь интерфейсом к SQL.

Виды запросов на обработку данных

Все приведенные выше примеры являлись запросами на выборку информации. Запросы этого типа являются наиболее распространенными. Все такие запросы на языке SQL реализуются посредством команды SELECT.

Перечислим другие типичные операции обработки данных: добавление (на языке SQL — INSERT), модификация (UPDATE), удаление (DELETE).

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

Отдельно следует сказать о запросах, которые плохо укладываются в строгую реляционную модель. Например, следующий запрос на языке SQL возвращает количество строк в таблице “Учителя”:

SELECT COUNT(*) FROM «Учителя»

Понятно, что количество — число, атомарное значение. Тем не менее все реляционные СУБД сформируют таблицу, содержащую единственное значение. И уже эта таблица будет результатом запроса.

Дополнительные интерфейсы для редактирования и представления данных

Практически все современные СУБД предоставляют удобные интерфейсы редактирования и представления данных — формы и отчеты. Важно отметить, что указанные средства не имеют отношения к теории реляционных баз данных и лишь облегчают взаимодействие пользователей с СУБД. Этот вопрос нуждается в подобном уточнении, так как во многих популярных системах таблицы, запросы, формы и отчеты оказываются равноположенными (см. рисунок).

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

Методические рекомендации

В том, что касается “обработки данных”, на любом уровне обучения основное внимание, безусловно, следует уделить запросам на выборку информации. Это благодатная тема, которая, в частности, имеет отношение к важнейшей составляющей школьного курса информатики — основам математической логики (см. “Логические операции”, “Логические выражения”). Также в запросах на выборку возникает понятие упорядоченности данных (сортировки). Это, в свою очередь, позволяет напомнить о том, что понятие порядка неразрывно связано с типом данных. Именно здесь можно на практических и наглядных примерах продемонстрировать, например, лексикографический порядок строк.

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

Отметим также, что основы языка SQL, по крайней мере в части, касающейся самого содержательного оператора — SELECT, не слишком сложны, а запросы на SQL крайне наглядны. Опыт показывает, что они много лучше проявляют суть изучаемых понятий, чем запросы на QBE. Графический интерфейс QBE очень удобен, но он специально создавался для пользователей, которым надо быстрее конструировать запросы и меньше вникать в суть используемых средств. Тогда как SQL идеально подходит именно для обучения.

Однако у SQL есть и серьезный “недостаток”: он приближен к естественному языку, но к… английскому. Поэтому можно рекомендовать использовать псевдо-SQL с русскими словами (например, так, как это было сделано выше). И уже от записи таких конструкций переходить к QBE. (Тут можно вспомнить и об Алгоритмическом языке, который начал использоваться еще в первых учебниках информатики. Недаром ведь это было сделано! Русский синтаксис, пусть и несколько непривычный для профессионалов, доказал свою педагогическую эффективность.)