Манипулирование данными
Введение в язык SQL
В этом разделе мы рассмотрим назначение языка SQL, познакомимся с его историей и проанализируем причины, по которым он приобрел в настоящее время столь большое значение для приложений баз данных.
Назначение языка SQL
Любой язык работы с базами данных должен предоставлять пользователю следующие возможности:
• создавать базы данных и таблицы с полным описанием их структуры;
• выполнять основные операции манипулирования данными, такие как
вставка, модификация и удаление данных из таблиц;
• выполнять простые и сложные запросы.
Кроме того, язык работы с базами данных должен решать все указанные выше задачи при минимальных усилиях со стороны пользователя, а структура и синтаксис его команд должны эыть достаточно просты и доступны для изучения. И, наконец, он должен быть универсальным, т.е. отвечать некоторому признанному стандарту, что позволит использовать один и тот же синтаксис иструктуру команд при переходе от одной СУБД к другой. Язык SQL удовлетворяет практически всем этим требованиям.
SQL является примером языка преобразования данных, или же языка, предназначенного для работы с таблицами с целью преобразования входных данных к требуемому выходному виду. Язык SQL, который определен стандартом ISO, имеет два основных компонента:
• язык DDL (Data Definition Language), предназначенный для определения
структур базы данных и управления доступом к данным;
• язык DML (Data Manipulation Language), предназначенный для выборки и обновления данных.
До появления стандарта SQL3 язык SQL включал только команды определения и манипулирования данными; в нем отсутствовали какие-либо команды управления ходом вычислений. Другими словами, в этом языке не было команд IF ... THEN ...ELSE, GO TO, DO ... WHILE и любых других, предназначенных для управления ходом вычислительного процесса. Подобные задачи должны были решаться программным путем (с помощью языков программирования или управления заданиями) либо интерактивно (в результате действий, выполняемых самим пользователем). По причине
подобной незавершенности (с точки зрения организации вычислительного процесса) язык SQL мог использоваться двумя способами. Первый предусматривал интерактивную работу, заключающуюся во вводе пользователем с терминала отдельных операторов SQL. Второй состоял во внедрении операторов SQL в программы на процедурных языках, как описано в главе 21. Язык SQL3, формальное определение которого принято в 1999 году, рассматривается в главе 27.
Язык SQL относительно прост в изучении.
• Это непроцедурный язык, поэтому в нем необходимо указывать, какая информация должна быть получена, а не как ее можно получить. Иначе говоря, язык SQL не требует указания методов доступа к данным,
• Как и большинство современных языков, SQL поддерживает свободный формат записи операторов. Это означает, что при вводе отдельные элементы операторов не связаны с фиксированными позициями на экране.
• Структура команд задается набором ключевых слов, представляющих собой
обычные слова английского языка, такие как CREATE TABLE (Создать таблицу), INSERT (Вставить), SELECT (Выбрать). Например:
• CREATE TABLE Staff (staffNo VARCHAR(S), IName VARCHAR(15),salary DECIMAL(7,2));
• INSERT INTO Staff VALUES ('SG16', 'Brown', 8300);
• SELECT staffNo, IName, salary
FROM Staff
WHERE salary > 10000;
• Язык SQL может использоваться широким кругом пользователей, включая администраторов баз данных (АБД), руководящий персонал компании, прикладных программистов и множество других конечных пользователей разных категорий.
В настоящее время для языка SQL существуют международные стандарты [173],[176], формально определяющие его как стандартный язык создания и манипулирования реляционными базами данных, каковым он фактически и является.
Особая роль языка SQL
Язык SQL является первым и пока единственным стандартным языком работы с базами данных, который получил достаточно широкое распространение.
Есть еще один стандартный язык работы с базами данных, NDL (Network
Database Language), который построен на использовании сетевой модели CODASYL, но он применяется лишь в немногих разработках. Практически все крупнейшие разработчики СУБД в настоящее время создают свои продукты с использованием языка SQL либо интерфейса SQL, и большинство таких компаний участвуют в работе, по меньшей мере, одной организации, которая занимается разработкой стандартов этого языка. В SQL сделаны огромные инвестиции как со стороны разработчиков, так и со стороны пользователей. Он стал частью архитектуры приложений (например, такой как System Application Architecture(SAA) корпорации IBM), а также является стратегическим выбором многих крупных и влиятельных организаций (например, консорциума Х/Open, занятого разработкой стандартов для среды UNIX), Язык SQL также принят в качестве федерального стандарта обработки информации (Federal Information Processing Standard — FIPS), который должен соблюдаться в СУБД для получения разрешения продавать ее на территории США. Консорциум разработчиков SQL Access Group прилагает усилия по созданию расширений языка SQL, которые позволят обеспечить взаимодействие разнородных систем.
Запись операторов SQL
В этом разделе кратко описана структура операторов SQL и представлена система обозначений, которая используется для определения формата различных конструкций языка SQL. Оператор SQL состоит из зарезервированных слов, а также из слов, определяемых пользователем. Зарезервированные слова являются постоянной частью языка SQL и имеют определенное значение. Их следует записывать именно так, как указано в стандарте, и нельзя разбивать на части для переноса из одной строки в другую. Слова, определяемые пользователем, задаются самим пользователем (в соответствии с определенными синтаксическими правилами) и представляют собой имена различных объектов базы данных —таблиц, столбцов, представлений, индексов и т.д. Слова в операторе размещаются в соответствии с установленными синтаксическими правилами. Хотя в стандарте это не указано, многие диалекты языка SQL требуют задания в конце оператора некоторого символа, обозначающего окончание его текста; как правило, с этой целью используется точка с запятой (;).
Большинство компонентов операторов SQL не чувствительно к регистру. Это означает, что могут использоваться любые буквы — как строчные, так и прописные. Одним важным исключением из этого правила являются символьные литералы — данные, которые должны вводиться точно так же, как были введены соответствующие им значения, хранящиеся в базе данных. Например, если в базе данных хранится значение фамилии 'SMITH1 , а в условии поиска указан символьный литерал ' Smith1 , то эта запись не будет найдена.
Поскольку язык SQL имеет свободный формат, отдельные операторы SQL и их оследовательности будут иметь более удобный для чтения вид при использовании отступов и выравнивания. Рекомендуется придерживаться следующих правил.
• Каждая конструкция в операторе должна начинаться с новой строки.
• Начало каждой конструкции должно быть обозначено таким же отступом, что и начало других конструкций оператора.
• Если конструкция состой-:: из нескольких частей, каждая из них должна начинаться с новой строки с некоторым отступом относительно начала конструкции, что будет указывать на их подчиненность.
В этой и следующей главе для определения формата операторов SQL мы будем применять следующую расширенную форму системы обозначений BNF(Backus Naur Form — форма Бэкуса-Наура).
• Прописные буквы будут использоваться для записи зарезервированных слов и должны указываться в операторах точно так же, как это будет показано.
• Строчные буквы будут использоваться для записи слов, определяемых пользователем.
• Вертикальная черта ( ) указывает на необходимость выбора одного из нескольких приведенных значений, например a b | с.
• Фигурные скобки определяют обязательный элемент, например {а}.
• Квадратные скобки определяют необязательный элемент, например [а].
• Многоточие (...) используется для указания необязательной возможностиповторения конструкции от нуля до нескольких раз, например
{а Ь} [,с...]. Эта запись означает, что после а или Ь может следовать от нуля до нескольких повторений с, разделенных запятыми.
На практике для определения структуры базы данных (в основном ее таблиц)используются операторы DDL, а для заполнения этих таблиц данными и выборки из них информации с помощью запросов — операторы DML. В этой главе вначале мы познакомимся с операторами DML и лишь затем обратимся к операторам языка DDL. Подобный подход отражает большую важность операторов
DML с точки зрения рядового пользователя.
Манипулирование данными
В этом разделе обсуждаются следующие операторы языка SQL DML:
• SELECT — выборка данных избазы;
• INSERT — вставкаданных в таблицу;
• UPDATE — обновлениеданных в таблице;
• DELETE — удалениеданных из таблицы.
Ввиду сложности оператора SELECT и относительной простоты остальных операторов DML, большая часть данного раздела посвящена обсуждению возможностей оператора SELECT и его различных форматов. Начнем с рассмотрения самых простых запросов, затем перейдем к более сложным вариантам выборки данных, использующим функции сортировки, группирования≫ агрегирования, а также выполнения запроса к нескольким таблицам. В конце данной главы описаны операторы INSERT, UPDATE и DELETE языка SQL.
Для построения примеров операторов SQL используется контекст учебного приложения DreamHome. В базе данных приложения DreamHome имеются следующие таблицы:
Branch (branchNo, street, city, postcode)
Staff (sjiajE f No, fName, IName, position, sex, DOB, salary,
branchNo)
PropertyForRent (propertyNo, street, city, postcode, type, rooms,
rent, ownerNo, staffNo, branchNo}
Client (clientNo, fName, IName, telNo, prefType, maxRent)
PrivateOwner (ownerNo, fName, IName, address, telNo)
Viewing (clientNo, propertyNo, viewDate, comment)
Литералы
Прежде чем приступить к обсуждению операторов DML, необходимо выяснить, что означает такое понятие, как "литерал". Литералы представляют собой константы, которые используются в операторах SQL. Существуют различные формы литералов для каждого типа данных, которые поддерживаются SQL(Однако мы не станем углубляться в подробности и укажем лишь различия между литералами, которые следует заключать в одинарные кавычки, и теми, которые не следует. Все нечисловые значения данных всегда должны заключаться в одинарные кавычки, а все числовые данные не должны заключаться в одинарные кавычки. Ниже приведен пример использования литералов для вставки данных в таблицу.
INSERT INTO PropertyForRent(propertyNo, street, city, postcode,type,
rooms, rent, ownerNo, staffNo, ranchNo)
VALUES('PA14', 46 Holhead1, 'Aberdeen1 , 'AB7 5SU1 , 'House1 , 6,
650.00, 'C0461 , 'SA91 , ' B 0 0 7 ' ) ;
Значение столбца rooms является литералом целочисленного типа, а значение столбца rent — это десятичный числовой литерал. Ни один из них не должен заключаться в одинарные кавычки. Значения всех остальных столбцов представляют собой символьные строки и обязательно должны быть взяты в одинарные кавычки.
Простые запросы
Назначение оператора SELECT состоит в выборке и отображении данных одной или более таблиц базы данных. Это исключительно мощный оператор, способный выполнять действия, эквивалентные операторам реляционной алгебры выборки, проекции и соединения (см. раздел 4.1), причем в пределах единственной выполняемой команды. Оператор SELECT является чаще всего используемой командой языка SQL. Общий формат оператора SELECT имеет следующий вид:
SELECT [DISTINCT; [• ALL] .{ * I [columnExpression IAS newName]] [ , ' . . . ' } ' }
FROM TaJbleWame '{alias][ , . . - ]
[WHERE condition].,
[GROUP BY columnwise] [HAVING condition]
QRDER BY columnList]
Здесь параметр columnExpression представляет собой имя столбца или выражение из нескольких имен. Параметр TableName является именем существующей в базе данных таблицы (или представления), к которой необходимо получить доступ. Необязательный параметр alias — это сокращение, устанавливаемое для имени таблицы TableName. Обработка элементов оператора SELECT
выполняется в следующей последовательности.
• FROM. Определяются имена используемой таблицы или нескольких таблиц.
• WHERE. Выполняется фильтрация строк объекта в соответствии с заданными условиями.
• GROUP BY. Образуются группы строк, имеющих одно и то же значение в указанном столбце.
• HAVING. Фильтруются группы строк объекта в соответствии с указанным условием.
• SELECT. Устанавливается, какие столбцы должны присутствовать в выходных данных.
• ORDER BY. Определяется упорядоченность результатов выполнения оператора.
Порядок конструкций в операторе SELECT не может быть изменен. Только две конструкции оператора — SELECT и FROM — являются обязательными, все остальные конструкции могут быть опущены. Операция выборки с помощью оператора SELECT является замкнутой, в том смысле, что результат запроса к таблице также представляет собой таблицу (см. раздел 4.1). Существует множество вариантов использования данного оператора, что иллюстрируется приведенными ниже примерами.