Основные операторы языка SQL рассмотрим, опираясь на его реализацию в стандартном интерфейсе ODBC (Open DataBase Connectivity – совместимость открытых баз данных) фирмы Microsoft.Операторы языка можно условно разделить на два подъязыка: язык определения данных (Data Definition Language - DDL) и язык манипулирования данными (Data Manipulation Language - DML). Основные операторы языка представлены в табл. 4.3. Рассмотрим формат и основные возможности основных операторов.
3. Оператор создания таблицы имеет формат вида:
CREATE TABLE <имя таблицы>
(<имя столбца><тип данных>[NOT NULL]
[,<имя столбца><тип данных>[ NOT NULL]]…)
Обязательными операндами оператора являются имя создаваемой таблицы и имя хотя бы одного столбца (поля) с указанием типа данных, хранимых в этом столбце.
Таблица 4.3. Основные операторы языка SQL
Вид
Название
Назначение
DDL
CREATE TABLE
DROP TABLE
ALTER TABLE
CREATE INDEX
DROP INDEX
CREATE VIEW
DROP VIEW
GRAND*
REVOKE*
Создание таблицы
Удаление таблицы
Изменение структуры таблицы
Создание индекса
Удаление индекса
Создание представления
Удаление представления
Назначение привилегий
Удаление привилегий
DML
SELECT
UPDATE
INSERT
DELETE
Выборка записей
Изменение записей
Вставка новых записей
Удаление записей
При создании таблицы для отдельных полей могут указываться некоторые дополнительные правила контроля вводимых в них значений. Конструкция NOT NULL (не пустое) служит именно таким целям и для столбца таблицы означает, что в этом столбце должно быть определено значение.
В общем случае в разных СУБД могут использоваться различные типы данных. В интерфейсе ODBC поддерживаются свои стандартные типы данных, например, символьные (SQL_CHAR, SQL_VARCHAR, SQL_LONGVARCHAR) и др. При работе с БД некоторой СУБД посредством интерфейса ODBC выполняется автоматическое преобразование стандартных типов данных, поддерживаемых интерфейсом, в типы данных источников и обратно. При необходимости обмен данными между программой и источником данных может вестись без преобразования – во внутреннем формате данных источника.
Пример 1.Создание таблицы.
Пусть требуется создать таблицу товары описания товаров, имеющую поля: тип – вид товара, код_комп – идентификатор компании-производителя, имя – название товара и цена – цена товара. Оператор определения таблицы может иметь следующий вид:
CREATE TABLE товары(тип SQL_CHAR(8) NOT NULL,
код_комп SQL_CHAR(10) NOT NULL, имя SQL_VARCHAR(20),
цена SQL_DECIMAL(8,2)).
2. Оператор изменения структуры таблицы имеет формат вида:
Изменение структуры таблицы может состоять в добавлении (ADD), изменении (MODIFY), или удалении (DROP) одного или нескольких столбцов таблицы. Правила записи оператора ALTER TABLE такие же, как и оператора CREATE TABLE. При удалении столбца указывать <тип данных> не нужно.
Пример 2.Добавления поля таблицы.
Пусть в созданной ранее таблице товары необходимо добавить поле количество, отводимое для хранения величины запаса товара. Для этого следует записать оператор вида:
ALTER TABLE товары (ADD количество SQL_INTEGER).
3. Оператор удаления таблицы имеет формат вида:
DROP TABLE <имя таблицы>
Оператор позволяет удалить имеющуюся таблицу. Например, для удаления таблицы с именем текущая достаточно записать оператор вида:
DROP TABLE текущая.
4. Оператор создания индекса имеет формат вида:
CREATE [UNIQUE] INDEX <имя индекса>
ON <имя таблицы>
(<имя столбца> [ASC|DESC]
[, <имя столбца>[ ASC|DESC]…)
Оператор позволяет создать индекс для одного или нескольких столбцов заданной таблицы с целью ускорения выполнения запросных и поисковых операций с таблицей. Для одной таблицы можно создать несколько индексов.
Задав необязательную опцию UNIQUE, можно обеспечить уникальность значений во всех указанных в операторе столбцах. По существу, создание индекса с указанием признака UNIQUE означает определение ключа в созданной ранее таблице.
При создании индекса можно задать порядок автоматической сортировки значений в столбцах – в порядке возрастания ASC (по умолчанию), или в порядке убывания DESC. Для разных столбцов можно задать различный порядок сортировки.
Пример 3.Создание индекса.
Пусть для таблицы служащие, имеющей поля имя, зарплата, руководитель и отдел, требуется создать индекс код_служ для сортировки имен в алфавитном порядке и убыванию размеров зарплаты. Оператор создания индекса может иметь вид:
CREATE INDEX код_служ
ON служащие (имя, зарплата DESC).
5. Оператор удаление индекса имеет формат вида:
DROP INDEX <имя индекса>
Этот оператор позволяет удалить созданный ранее индекс с соответствующим именем. Так, например, для уничтожения индекса код_служ к таблице служащие достаточно записать оператор:
DROP INDEX код_служ.
6. Оператор создания представления имеет формат вида:
CREATE VIEW <имя представления>
[(<имя столбца>[,<имя столбца>]…)]
AS <оператор SELECT >
Данный оператор позволяет создать представление. Если имена столбцов в представлении не указываются, то будут использоваться имена столбцов из запроса, описываемого соответствующим оператором SELEC.
Пример 4.Создание представления.
Пусть имеется таблица компании описания производителей товаров с полями: код_комп – идентификатор компании, имя_комп – название организации, адрес_комп – адрес и телефон – телефон, а также таблица товары производимых товаров с полями: тип – вид товара, код_комп – индекс компании, имя – название товараи цена – цена товара. Таблицы связаны между собой по полю код_комп. Требуется создать представление реклама с краткой информацией о товарах и их производителях: вид товара, название производителя, и цена товара. Оператор определения представления может иметь следующий вид:
CREATE VIEW
реклама
AS
SELECT
товары.тип, компании.имя_комп, товары.цена
FROM
товары, компании
WHERE
товары.код_комп = компании.код_комп
7. Оператор удаления представления имеет формат вида:
DROP VIEW <имя представления>
Оператор позволяет удалить созданное ранее представление. При удалении представления таблицы, участвующие в запросе, удалению не подлежат. Удаление представления реклама производится оператором вида:
DROP VIEW реклама.
8 Оператор выборки записей имеет формат вида:
SELECT [ALL|DISTINCT]
<список данных>
FROM <список таблиц>
[WHERE <условие выборки>]
[GROUP BY <имя столбца> [,<имя столбца>]…]
[HAVING <условие поиска>]
[ORDER BY <спецификация>[,<спецификация>]…]
Это наиболее важный оператор из всех операторов языка SQL. Функциональные возможности его огромны, рассмотрим основные из них.
Оператор SELECT позволяет производить выборку и вычисления над данными из одной или нескольких таблиц. Результатом выполнения оператора является ответная таблица, которая может иметь (ALL), или не иметь (DISTING) повторяющиеся строки. По умолчанию в ответную таблицу включаются все строки, в том числе и повторяющиеся. В отборе данных участвуют записи одной или нескольких таблиц, перечисленных в списке операнда FROM.
Список данных может содержать имена столбцов, участвующих в запросе, а также выражения над столбцами. В простейшем случае в выражениях можно записывать имена столбцов, знаки арифметических операций (+, -, *, /), константы и круглые скобки. Если в списке данных записано выражение, то наряду с выборкой данных выполняются вычисления, результаты которого попадают в новый (создаваемый) столбец ответной таблицы.
При использовании в списках данных имен столбцов нескольких таблиц для указания принадлежности столбца некоторой таблице применяют конструкцию вида: <имя таблицы>.<имя столбца>.
Операнд WHERE задает условия, которым должны удовлетворять записи в результирующей таблице. Выражение <условие выборки> является логическим. Его элементами могут быть имена столбцов, операции сравнения, арифметические операции, логические связки (И, ИЛИ, НЕТ), скобки, специальные функции LIKE, NULL, IN и т.д.
Операнд GROUP BY позволяет выделять группы в результирующем множестве записей. Группой являются записи с совпадающими значениями в столбцах, перечисленных за ключевыми словами GROUP BY. Выделение групп требуется для использования в логических выражениях операндов WHERE и HAVING, а также для выполнения операций (вычислений) над группами.
В логических и арифметических выражениях можно использовать следующие групповые операции (функции): AVG (среднее значение в группе), MAX (максимальное значение в группе), MIN (минимальное значение в группе), SUM (сумма значений в группе), COUNT (число значений в группе).
Операнд HAVING действует совместно с операндом GROUP BY и используется для дополнительной селекции записей во время определения групп. Правила записи <условия поиска> аналогичны правилам формирования <условия выборки> операнда WHERE.
Операнд ORDER BY задает порядок сортировки результирующего множества. Обычно каждая <спецификация> аналогична соответствующей конструкции оператора CREAT INDEX и представляет собой пару вида: <имя столбца> [ASC|DESC].
Оператор SELECT может иметь и другие более сложные синтаксические конструкции.
Одной из таких конструкций, например, являются так называемые подзапросы. Они позволяют формулировать вложенные запросы, когда результаты одного оператора SELECT используются в логическом выражении условия выборки операнда WHERE другого оператора SELECT.
Вторым примером более сложной формы оператора SELECT является оператор, в котором отобранные записи в дальнейшем предполагается модифицировать (конструкция FOR UPDATE OF). СУБД после выполнения такого оператора обычно блокирует (защищает) отобранные записи от модификации их другими пользователями.
Еще один случай специфического использования оператора SELECT - выполнение объединений результирующих таблиц при выполнении нескольких операторов SELECT (операнд UNION).
Пример 5.Выбор записей.
Для таблицы сотрудники, имеющей поля: имя (имя), зарплата (зарплата сотрудника), руководитель (руководитель отдела), отдел (отдел), требуется вывести имена сотрудников и размер их зарплаты, увеличенный на 100 единиц. Оператор выбора можно записать следующим образом:
SELECT имя, зарплата+100
FROM сотрудники.
Пример 6.Выбор с условием.
Вывести названия таких отделов таблицы сотрудники, в которых в данный момент отсутствуют руководители. Оператор SELECT для этого запроса можно записать так:
SELECT отдел
FROM сотрудники
WHERE руководитель is NULL.
Пример 7.Выбор с группированием.
Пусть требуется найти минимальную и максимальную зарплаты для каждого из отделов (по таблице сотрудники). Оператор SELECT для этого запроса имеет вид:
SELECT отдел, MIN(зарплата), MAX(зарплата)
FROM сотрудники
GROUP BY отдел.
Пример 8.Пусть требуется из таблицы СОТРУДНИКИ выделить запись о сотруднике с максимальной зарплатой.
SELECT Имя, Зарплата, Руководитель, Отдел
FROM СОТРУДНИКИ
WHERE Зарплата = (SELECT MAX(Зарплата)
FROM СОТРУДНИКИ);
Пример 9.Пусть требуется из таблицы СОТРУДНИКИвывести суммарную зарплату по 1, 3 и 7 отделам.
SELECT СОТРУДНИКИ.отдел, Sum(СОТРУДНИКИ.зарплата) AS [Sum-зарплата]
FROM СОТРУДНИКИ
GROUP BY СОТРУДНИКИ.отдел
HAVING (((СОТРУДНИКИ.отдел) In (1,3,7)));
Предложение HAVING определяет критерии, используемые, чтобы удалить или выбрать определенные группы из вывода. Предложение HAVING должно ссылаться на агрегаты и поля, выбранные GROUP BY.
Предложение WHERE определяет критерии, используемые, чтобы удалить или выбрать индивидуальные строки из вывода.
9. Оператор изменения записей имеет формат вида:
UPDATE <имя таблицы>
SET <имя столбца> = {<выражение>,NULL}
[, SET <имя столбца> = {<выражение>,NULL}…]
[WHERE <условие>]
Выполнение оператора UPDATE состоит в изменении значений в определенных операндом SET столбцах таблицы для тех записей, которые удовлетворяют условию, заданному операндом WHERE.
Новые значения полей в записях могут быть пустыми (NULL), либо вычисляться в соответствии с арифметическим выражением. Правила записи арифметических и логических выражений аналогичны соответствующим правилам оператора SELECT.
Пример 10.Изменение записей.
Пусть необходимо увеличить на 500 единиц зарплату тем служащим, которые получают не более 6000 (по таблице сотрудники). Запрос, сформулированный с помощью оператора SELECT, может выглядеть так:
UPDATE сотрудники
SET зарплата = 6500
WHERE зарплата <= 6000.
10. Оператор вставки новых записей имеет форматы двух видов:
INSERT INTO <имя таблицы>
[(<список столбцов>)]
VALUES (<список значений>)
и
INSERT INTO <имя таблицы>
[(<список столбцов>)]
<предложение SELECT>
В первом формате оператор INSERT предназначен для ввода новых записей с заданными значениями в столбцах. Порядок перечисления имен столбцов должен соответствовать порядку значений, перечисленных в списке операнда VALUES. Если <список столбцов> опущен, то в <списке значений> должны быть перечислены все значения в порядке столбцов структуры таблицы.
Во втором формате оператор INSERT предназначен для ввода в заданную таблицу новых строк, отобранных из другой таблицы с помощью предложения SELECT.
Пример 11.Ввод записей.
Ввести в таблицу сотрудники запись о новом сотруднике. Для этого можно записать оператор вида:
INSERT INTO сотрудники
VALUES («Иванов», 7500, «Сергеев», «Косметика»).
11. Оператор удаления записей имеет формат вида:
DELETE FROM <имя таблицы>
[WHERE <условие>]
Результатом выполнения оператора DELETE является удаление из указанной таблицы строк, которые удовлетворяют условию, определенному операндом WHERE. Если необязательный операнд WHERE опущен, т.е. условие отбора удаляемых записей отсутствует, то удалению подлежат все записи таблицы.
Пример 12.Удаление записей.
В связи с ликвидацией отдела игрушек (Игрушки), требуется удалить из таблицы сотрудники всех сотрудников этого отдела. Оператор DELETE для этой задачи будет выглядеть так:
DELETE FROM сотрудники
WHERE отдел = “игрушки”
В заключение отметим, что, по словам Дейта, язык SQL является гибридом реляционной алгебры и реляционного исчисления. В нем имеются элементы алгебры (оператор объединения UNION) и исчисления (квантор существования EXISTS). Кроме того, язык SQL обладает реляционной полнотой. Операторы языка SQL представлены в табл. 4.4. – 4.8.
Таблица 4.4. Операторы определения данных DDL
Оператор
Название
Назначение
CREATE TABLE
Создать таблицу
Создает новую таблицу в БД
DROP TABLE
Удалить таблицу
Удаляет таблицу из БД
ALTER TABLE
Изменить таблицу
Изменяет структуру существующей таблицы или ограничения целостности, задаваемые для данной таблицы
Создает индекс для некоторой таблицы для обеспечения быстрого доступа по атрибутам, входящим в индекс
DROP INDEX
Удалить индекс
Удаляет ранее созданный индекс
Таблица 4.5. Операторы манипулирования данными Data Manipulation Language (DML)
Оператор
Название
Назначение
DELETE
Удалить строки
Удаляет одну или несколько строк, соответствующих условиям фильтрации, из базовой таблицы. Применение оператора согласуется с принципами поддержки целостности, поэтому этот оператор не всегда может быть выполнен корректно, даже, если синтаксически он записан правильно
INSERT
Вставить строку
Вставляет одну строку в базовую таблицу. Допустимы модификации оператора, при которых сразу несколько строк могут быть перенесены из одной таблицы или запроса в базовую таблицу
UPDATE
Обновить строку
Обновляет значения одного или нескольких столбцов в одной или нескольких строках, соответствующих условиям фильтрации
Таблица 4.6. Язык запросов Data Query Language (DQL)
Оператор
Название
Назначение
SELECT
Выбрать строки
Оператор, заменяющий все операторы реляционной алгебры и позволяющий сформировать результирующее отношение, соответствующее запросу
Таблица 4.7. Средства управления транзакциями
Оператор
Название
Назначение
COMMIT
Завершить транзакцию
Завершить комплексную взаимосвязанную обработку информации, объединенную в транзакцию
ROLLBACK
Вставить строку
Отменить изменения, проведенные в ходе выполнения транзакции
SAVEPOINT
Обновить строку
Сохранить промежуточное состояние БД, пометить его для того, чтобы можно было в дальнейшем к нему вернуться
Таблица 4.8. Средства администрирования данных
Оператор
Название
Назначение
ALTER DATABASE
Изменить БД
Изменить набор основных объектов в БД, ограничений, касающихся всей БД
ALTER DBAREA
Изменить область хранения БД
Изменить ранее созданную область хранения
ALTER PASSWORD
Изменить пароль
Изменить пароль для всей базы данных
CREATE DATABASE
Создать БД
Создать новую базу данных, определив основные параметры для нее
CREAT DBAREA
Создать область хранения
Создать новую область хранения и сделать ее доступной для размещения данных
DROP DATABASE
Удалить БД
Удалить существующую базу данных (только в том случае, когда вы имеете право выполнить это действие)
DROP DBAREA
Удалить область хранения БД
Удалить существующую область хранения (если в ней на настоящий момент не располагаются активные данные)
GRANT
Предоставить права
Предоставить права доступа на ряд действий над некоторым объектом БД
REVOKE
Лишить прав
Лишить прав доступа к некоторому объекту или некоторым действиям над объектом
Таблица 4.9. Программный SQL
Оператор
Название
Назначение
DECLARE
Определяет курсор для запроса
Задает некоторое имя и определяет связанный с ним запрос к БД, который соответствует виртуальному набору данных
OPEN
Открыть курсор
Формирует виртуальный набор данных, соответствующий описанию указанного курсора и текущему состоянию БД
FETCH
Считать строку из множества строк, определенных курсором
Считывает очередную строку, заданную параметром команды из виртуального набора данных, соответствующего открытому курсору
CLOSE
Закрыть курсор
Прекращает доступ к виртуальному набору данных, соответствующему указанному курсору
PREPARE
Подготовить оператор SQL к динамическому выполнению
Сгенерировать план выполнения запроса, соответствующего заданному оператору SQL
EXECUTE
Выполнить оператор SQL, ранее подготовленный к динамическому выполнению