Структурированный язык запросов sql
Все языки манипулирования данными, созданные до появления реляционных баз данных и разработанные для многих систем управления базами данных персональных компьютеров, были ориентированы на операции с данными, представленными в виде логических записей файлов. Это требовало от пользователей детального знания организации хранения данных и достаточных усилий для указания не только того, какие данные нужны, но и того, где они размещены и как шаг за шагом получить их. Рассматриваемый непроцедурный язык SQL (Structured Query Language - структуризованный язык запросов) ориентирован на операции с данными, представленными в виде логически взаимосвязанных совокупностей таблиц. Особенность предложений этого языка состоит в том, что они ориентированы в большей степени на конечный результат обработки данных, чем на процедуру этой обработки. SQL сам определяет, где находятся данные, какие индексы и даже наиболее эффективные последовательности операций следует использовать для их получения: не надо указывать эти детали в запросе к базе данных.
Непроцедурность языка означает, что на нем можно указать, что нужно сделать с базой данных, но нельзя описать алгоритм этого процесса. Все алгоритмы обработки SQL-запросов генерируются самой СУБД и не зависят от пользователя. Язык SQL состоит из набора операторов, которые можно разделить на несколько категорий:
- Data Definition Language (DDL) — язык определения данных, позволяющий создавать, удалять и изменять объекты в базах данных;
- Data Manipulation Language (DML) — язык управления данными, позволяющий модифицировать, добавлять и удалять данные в имеющихся объектах базы данных;
- Data Control Languages (DCL) — язык, используемый для управления пользовательскими привилегиями;
- Transaction Control Language (TCL) — язык для управления изменениями, сделанными группами операторов;
- Cursor Control Language (CCL) — операторы для определения курсора, подготовки операторов SQL к выполнению и некоторых других операций.
В начале 80-х годов SQL и стал фактическим стандартом таких языков для профессиональных реляционных СУБД. В 1987 году он стал международным стандартом языка баз данных и начал внедряться во все распространенные СУБД персональных компьютеров.
Объекты базы данных
14.2.1 Таблицы SQL
Понятие "таблица", как правило, связывается с реальной таблицей (создается с помощью предложения CREATE TABLE), т.е. c таблицей, для каждой строки которой в действительности имеется некоторый двойник, хранящийся в физической памяти машины. Таблицы поддерживаются всеми реляционными СУБД, и в их полях могут храниться данные разных типов. Однако SQL использует и создает ряд виртуальных (как будто существующих) таблиц: представлений, курсоров и неименованных рабочих таблиц, в которых формируются результаты запросов на получение данных из базовых таблиц и, возможно, представлений. Это таблицы, которые не существуют в базе данных, но как бы существуют с точки зрения пользователя.
Представление представляет собой виртуальную таблицу, предоставляющую данные из одной или нескольких реальных таблиц. Реально оно не содержит никаких данных, а только описывает их источник. Нередко такие объекты создаются для хранения в базах данных сложных запросов. Фактически представление - это хранимый запрос. Создание представлений в большинстве современных СУБД осуществляется специальными визуальными средствами. Они позволяют отображать на экране необходимые таблицы, устанавливать связи между ними, выбирать отображаемые поля, вводить ограничения на записи и др. Нередко эти объекты используются для обеспечения безопасности данных, например, путем разрешения просмотра данных с их помощью без предоставления доступа непосредственно к таблицам. Помимо этого некоторые представления объектов могут возвращать разные данные в зависимости, например, от имени пользователя, что позволяет ему получать только интересующие его данные.
При создании таблиц важным является определение первичных ключей. Очень часто первичные ключи генерируются самой СУБД. Это более удобно, чем их генерация в клиентском приложении, так как при многопользовательской работе генерация ключей с помощью СУБД — это единственный способ избежать дублирования ключей и получать их последовательные значения. В разных СУБД для генерации ключей используются разные объекты. Некоторые из таких объектов хранят целое число и правила, по которым генерируется следующее за ним значение, —обычно это выполняется с помощью триггеров. Некоторые СУБД поддерживают специальные типы полей для первичных ключей. При добавлении записей такие поля заполняются автоматически последовательными значениями (обычно целыми). В случае Microsoft Access и Microsoft SQL Server такие поля называются Identity fields.
В большинстве реляционных СУБД ключи реализуются с помощью объектов, называемых индексами, которые можно определить как список номеров записей, указывающий, в каком порядке их предоставлять..
14.2.2 Ограничения
Большинство современных серверных СУБД содержат специальные объекты, называемые ограничениями. Эти объекты содержат сведения об ограничениях, накладываемых на возможные значения полей. Например, с помощью такого объекта можно установить максимальное или минимальное значение для данного поля, и после этого СУБД не позволит сохранить в базе данных запись, не удовлетворяющую данному условию. Помимо ограничений, связанных с установкой диапазона изменения данных, существуют также ссылочные ограничения. Не все СУБД поддерживают ограничения. В этом случае для реализации аналогичной функциональности правил можно либо использовать другие объекты (например, триггеры), либо хранить эти правила в клиентских приложениях, работающих с этой базой данных.
14.2.3 Запросы к базам данных
Модификация и выбор данных, изменение метаданных и некоторые другие операции осуществляются с помощью запросов.
Большинство современных СУБД (и некоторые средства разработки приложений) содержат средства для генерации таких запросов. Один из способов манипуляции данными называется «queries by example» (QBE) — запрос по образцу. QBE представляет собой средство для визуального связывания таблиц и выбора полей, которые следует отобразить в результате запроса. Можно также написать запрос непосредственно на языке SQL.
В отличие от реляционной таблицы в результатах запроса строки упорядочены, и их порядок определяется исходным запросом (и иногда — наличием индексов). Поэтому можно определить текущую строку в таком наборе и указатель на нее, который называется курсором.
14.2.4 Транзакции
Транзакция — это группа операций над данными, которые либо выполняются все вместе, либо все вместе отменяются. Завершение транзакции означает, что все операции, входящие в состав транзакции, успешно завершены, и результат их работы сохранен в базе данных. Откат транзакции означает, что все уже выполненные операции, входящие в состав транзакции, отменяются и все объекты базы данных, затронутые этими операциями, возвращены в исходное состояние. Для реализации возможности отката транзакций многие СУБД поддерживают запись в log-файлы, позволяющие восстановить исходные данные при откате. Транзакция может состоять из нескольких вложенных транзакций.
14.2.5 Пользователи и роли
Предотвращение несанкционированного доступа к данным является серьезной проблемой, которая решается разными способами. Самый простой — это парольная защита либо всей таблицы, либо некоторых ее полей. В настоящее время более популярен другой способ защиты данных — создание списка пользователей с именами (user names) и паролями (passwords). Некоторые СУБД, в основном серверные, поддерживают не только список пользователей, но и роли. Роль — это набор привилегий. Если конкретный пользователь получает одну или несколько ролей, то вместе с ними — и все привилегии, определенные для данной роли.
14.2.6 Системный каталог
Любая реляционная СУБД, поддерживающая списки пользователей и ролей, должна их где-то хранить. В дополнение к этим спискам многие СУБД хранят списки таблиц, индексов, триггеров, процедур и др., а также сведения о том, кто ими владеет. Эти списки называются системными таблицами, а соответствующая часть базы данных называется системным каталогом. Отметим, что не все СУБД поддерживают системные каталоги. Вся информация об используемых структурах данных, логической организации данных, правах доступа пользователей и, наконец, физическом расположении данныхявляется базой метаданных (БМД). Для управления БМД существует специальное программное обеспечение администрирования баз данных, которое предназначено для корректного использования единого информационного пространства многими пользователями.
14.2.7 Триггеры и хранимые процедуры
Триггеры и хранимые процедуры, поддерживаемые в большинстве современных серверных СУБД, используются для хранения исполняемого кода.
Хранимая процедура — это специальный вид процедуры, который выполняется сервером баз данных. Хранимые процедуры пишутся на процедурном языке, который зависит от конкретной СУБД. Они могут вызывать друг друга, читать и изменять данные в таблицах, и их можно вызвать из клиентского приложения, работающего с базой данных. Хранимые процедуры обычно используются при выполнении часто встречающихся задач.
Триггерами называется специальный класс хранимых процедур, автоматически запускаемых при добавлении, изменении и удалении данных из таблицы. Триггер срабатывает при модификации данных и запускает хранимую процедуру, выполняющую определенные действия. Триггеры также содержат исполняемый код, но их, в отличие от процедур, нельзя вызвать из клиентского приложения или хранимой процедуры. Триггер всегда связан с конкретной таблицей и выполняется тогда, когда при редактировании этой таблицы наступает событие, с которым он связан (например, вставка, удаление или обновление записи).