Выполнил Романов А.Н.
Российский государственный гуманитарный университет
Москва 2007
Язык запросов SQL
Первыми попытками уйти от построения баз данных (БД) на основе физической структуры их размещения на носителях являлись индексные файлы. Они обеспечивали доступ к записанной в них информации посредством индексных ключей, то есть для поиска неких конкретных записей в файле использовалась совокупность указателей. К недостаткам такого подхода можно отнести, в частности, неоптимальное хранение информации (дублирование, недостаточное структурирование) и значительное время поиска в больших файлах, не говоря уже о существенных требованиях, предъявляемых к аппаратному обеспечению.
Одним из решений упомянутых проблем стали иерархические БД. В таких базах элементы строго упорядочены, причем так, что данные одного уровня подчиняются (является подмножеством) данным другого, вышестоящего уровня. В такой модели связи могут быть отражены в виде дерева, причем допускаются только односторонние — от старших уровней к младшим. Подобная структура все еще напоминает древовидную файловую систему, где директории являются верхними уровнями, а файлы — нижними. Несмотря на то что по сравнению с индексными файлами это был существенный шаг вперед, иерархические БД наследовали многочисленные недостатки предыдущих систем, заключавшиеся в сложности алгоритмов доступа к данным нижних уровней и повышенных аппаратных требованиях.
Иерархические БД не получили широкого распространения, уступив место новой концепции хранения данных (реляционные БД). Она заключалась в использовании табличного метода хранения и доступа к конкретным записям, который используются и в настоящее время.
Прогресс в области сетевых технологий поспособствовал возникновению проблем организации доступа к данным, расположенным на серверах, с удаленных компьютеров — участников сети. Для оптимизации этого процесса и снижения сетевого трафика Международной организацией по стандартизации (ISO) был разработан и внедрен структурированный язык запросов SQL.
С развитием Глобальной сети и ростом объемов обращающейся в ней информации задачи предоставления доступа к последней практически повсеместно стали решаться с помощью технологий БД в общем и SQL в частности. В настоящее время рядовой пользователь, сам того не зная, активно работает с базами данных, даже просто просматривая веб-странички и форумы, или пользуясь сервисами электронной почты и ICQ.
Несмотря на то что иерархические БД еще не канули в лету окончательно, они, как упоминалось выше, используются крайне редко — в основном при решении неких специализированных задач, вследствие чего не имеет смысла подробно останавливаться на их устройстве. Гораздо интереснее рассмотреть реляционные БД.
Итак, данные в таких базах размещены во взаимосвязанных таблицах, строки которых называются записями, а столбцы — полями. При этом данные в ячейках одного поля должны быть одинакового типа. В каждой таблице, как правило, имеются специальные поля, которые позволяют однозначно идентифицировать ту или иную запись — они называются первичными ключами или первичными индексами. Такие поля помогают отличать одну запись от другой, даже если все остальные поля нескольких таких записей абсолютно идентичны. Например, представьте, что вы разрабатываете справочник сотрудников своей организации, и при этом каждая запись хранит данные об одном сотруднике, а их выборка осуществляется по полю «Фамилия». Может оказаться так, что в организации работает несколько человек с одинаковой фамилией. Чтобы отличить эти записи друг от друга, применяются первичные индексные поля. Чаще всего за тип данных первичного ключа берется целочисленное значение счетчика — в таком случае при добавлении новой записи в таблицу значения этого поля заполняются автоматически. Однако не запрещается использовать в качестве первичного ключа поле, имеющее, к примеру, символьный тип данных, хотя подобные ситуации возникают крайне редко.
Помимо задачи идентификации записей первичные индексы также часто используются для связывания между собой данных из разных таблиц. Кроме первичных индексов существуют и вторичные индексы, которые обеспечивают механизм быстрого поиска и доступа к данным таблицы. Чтобы получить ответ на запрос к таблице, не имеющей индексного поля, SQL-серверу придется сканировать полностью всю таблицу, считывая строки целиком. Очевидно, что такой подход при больших объемах информации слишком расточителен с точки зрения затрат аппаратных ресурсов. Тем не менее необходимо помнить, что с увеличением количества индексов растет и объем базы данных.
По признаку метода доступа БД делятся на локальные, сетевые и распределенные.
К локальным базам доступ возможен только с того компьютера, на котором они расположены. Сетевые базы призваны обеспечить работу с данными с других компьютеров посредством локальной сети или Интернета. Распределенные БД — это, по сути, подвид сетевых баз с той лишь разницей, что различные части информации находятся на множестве разных компьютеров.
На сегодняшний день основным видом является второй тип БД — сетевые базы. Именно они применяются в Интернете для организации доступа пользователей к информации сайтов, форумов, гостевых книг и каталогов товаров.
Такие БД делятся на файл-серверные и клиент-серверные. В файл-серверной модели при подключении СУБД клиента к удаленной базе все данные скачиваются на локальный компьютер, а после их обработки или изменения снова закачиваются на сервер для обновления в полном составе. Таким образом, происходит весьма интенсивный информационный обмен с сервером, что чрезвычайно нагружает сеть. Кроме того, в такой модели весьма сложно организовать одновременную работу нескольких пользователей, поэтому в настоящее время она используется редко и только для простых баз. Клиент-серверная модель организована совершенно иначе. Система управления такой базой состоит из двух частей — клиента и сервера. Клиентская часть программы посылает запросы с помощью языка запросов SQL,
серверная часть обрабатывает их и отправляет обратно только те данные, которые были нужны пользователю. Информация об изменении этих данных возвращается на сер-
вер, который обрабатывает ее и фиксирует в общей базе. Нагрузка на сеть при такой организации работы минимальна, а организацию одновременной работы нескольких пользователей берет на себя сервер.
Целью любой СУБД являться предоставление пользователю простых механизмов доступа и манипулирования данными. Существует много различных методов ее достижения, одним из которых является язык SQL. Расшифрованная и переведенная на русский язык эта аббревиатура будет выглядеть как Структурированный Язык Запросов.
Стандарт языка SQL. определяется Американским национальным институтом стандартов (ANSI) и Международной организацией по стандартизации (ISO). Однако некоторые производители БД вносят в язык свои изменения и дополнения. Например, компания Огас1е создала язык PL/SQL, который является процедурным расширением оригинального SQL.
Однако и стандартный SQL может использоваться в двух различных вариантах — интерактивном и вложенном. Первый представляется собой отдельный программный модуль на SQL, который сам выполняет запросы и отображает результаты работы. Второй — это внедрение элементов SQL в другой язык высокого уровня, например С или Delphi. В этом случае основная программа самостоятельно формирует запросы для сервера SQL, а потом использует результаты выборок из базы, не предъявляя их пользователю в чистом виде.
В целом же SQL — это язык, ориентированный на работу с реляционными базами данных. Его использование позволяет на порядок сократить объем работ, который понадобился бы в случае создания приложений, использующих БД на универсальном языке программирования, например на том же С.
Действительно, чтобы сформировать реляционную базу данных на С, нужно было бы описать как минимум один объект (двумерный массив), называемый в SQL. таблицей, который должен иметь возможность менять размер для вмещения любого необходимого числа строк. Затем пришлось бы создавать процедуры для помещения значений в такую таблицу, а также поиска и извлечения этих значений. Это непросто даже на первый взгляд. Так, если бы вы захотели найти все строки в таблице «TAB», в которых значения некоего поля «num» равно 5, то необходимо было бы выполнить по шагам весьма сложную процедуру.
Грамотный листинг программы, реализующий такой алгоритм на С и соблюдающий все подобающие проверки займет, пожалуй, всю эту страницу. В случае же использования SQL достаточно написать вот такой запрос:
SELECT *
FROM tab
WHERE num = 5
Дело в том, что команды SQL могут работать со всеми записями таблицы как с единым объектом. Необходимость организации циклов и проверок значений вручную отпадает.
Упомянутый в примере оператор SELECT является основным и наиболее часто используемым для выборки данных из таблиц. Все обращения к таблицам происходят в виде запросов, которые состоят из таких же операторов, — меняются только условия поиска.
В настоящее время трудно найти язык программирования высокого уровня, который бы не поддерживал работу с SQL. Для этих целей разработчиками различных компиляторов предусмотрены специальные библиотеки компонентов, которые обеспечивают связь между приложениями, написанными на их языке, и серверами SQL, в результате чего данные, которые будут выбираться из базы, можно использовать в клиентской программе обработки по своему усмотрению.
Сразу предупредим, что SQL Server 2000 возможно установить только на серверные версии операционной системы Windows — 2000 Server и 2003 Server. Попытки инсталляции ее на пользовательские версии ОС, такие как Windows ХР Professional, если только речь не идет о клиентской части, не увенчаются успехом. Если же вы непременно хотите пользоваться языком запросов, работая под пользовательской ОС, существует MSDE — это урезанная версия SQL Server, которая входит в дистрибутив МS Office 2003.