Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

db / Лекции / 6 семестр / Языки запросов

.pdf
Скачиваний:
66
Добавлен:
23.03.2015
Размер:
1.14 Mб
Скачать

Описание таблицы FACULTY может быть представлено в следующем ви-

де:

Запрос.

CREATE TABLE FACULTY (

FacPK INTEGER.

Name VARCHAR(300),

Dean VARCHAR(20),

Building CHAR(5),

Fund NUMBER(7, 2));

В результате создается пустая таблица FACULTY.

Когда вы вставляете строку в таблицу без указания в ней значений для столбца, SQL должен знать, что именно необходимо вставить вместо отсут-

ствующего значения. Это так называемое значение по умолчанию. Общеприня-

тым значением по умолчанию является NULL. Это – значение по умолчанию для любого столбца, которому не было дано ограничение NOT NULL.

Значение по умолчанию указывается фразой DEFAULT с использованием следующего синтаксиса:

имя_столбца тип_данных DEFAULT значение_по_умолчанию

где значение по умолчанию представляет собой константу, соответствую-

щую типу данных определяемого столбца. Например, если мы хотим, чтобы значение по умолчанию при задании фонда факультета было равно 0, тогда определение этого столбца с учетом использования домена будет иметь следу-

ющий вид:

Fund NUMBER(7, 2) DEFAULT 0

1.8.3 Изменение таблицы

1.8.3.1 Возможности изменения таблиц

SQL предоставляет возможность изменить определение таблицы. Это де-

лается командой ALTER TABLE. Стандарт SQL позволяет производить следу-

ющие изменения в определении таблицы (об изменениях, связанных с описани-

ем ограничений целостности см. следующие лекции):

61

добавлять в таблицу определение нового столбца;

изменять значение по умолчанию;

удалять столбец из таблицы.

Многие СУБД расширяют функции этого предложения, вводя, например,

следующие возможности:

изменение имени таблицы;

изменение типа столбца. 1.8.3.2 Добавление столбца

Для добавления столбца существует следующий синтаксис:

ALTER TABLE имя_таблицы ADD (

определение_столбца[,

определение столбца]…);

Пример:

ALTER TABLE FACULTY ADD

DEPUTY_DEAN varchar(20) DEFAULT ‘’

1.8.3.3 Изменение определения столбца

Стандарт SQL позволяет добавлять и удалять значения столбцов по умол-

чанию. Это делается с использованием следующих предложений ALTER:

ALTER TABLE имя_таблицы ALTER [COLUMN]

SET DAFAULT значение

или

ALTER TABLE имя_таблицы ALTER [COLUMN]

DROP DEFAULT

Многие СУБД расширяют возможности по изменению определения столб-

цов, допуская дополнительно изменение их типов и/или размеров. Как правило,

если таблица пустая, СУБД позволяет производить любые переопределения столбцов таблицы. Однако имеются существенные ограничения на изменения описания столбцов, например, если это относится к замене типов данных в том случае, когда таблица уже содержит строки данных. Каждая СУБД поддержи-

вает свои правила допустимости преобразований типов данных, и они исполь-

зуются в том случае, когда такие изменения предполагаются командой ALTER TABLE по отношению к непустой таблице.

62

В Oracle синтаксис предложения для изменения определения столбцов следующий:

ALTER TABLE имя_таблицы MODIFY (

имя_столбца [тип_данных] [DEFAULT значение][,

имя_столбца [тип_данных] [DEFAULT значение]]...);

Приведем пример переопределения столбцов, в котором для столбца

Deputy_Dean изменяется максимально допустимый его размер и вводится зна-

чение по умолчанию, а для столбца Floor меняется тип, длина и значение по умолчанию.

ALTER TABLE FACULTY MODIFY

(Deputy_Dean varchar(30) DEFAULT 'ЗНАЧЕНИЕ ОТСУТСТВУЕТ',

Floor varchar(3) DEFAULT '000');

1.8.3.4 Удаление столбца

С помощью предложения ALTER TABLE можно удалить один или не-

сколько столбцов, если в них больше нет необходимости. Синтаксис этого ва-

рианта ALTER TABLE в стандарте SQL следующий:

ALTER TABLE имя_таблицы DROP

имя_столбца {CASCADE | RESTRICT}

Удаляемый столбец может использоваться в описаниях ограничений це-

лостности (о них см. в одной из следующих лекций). Наличие фразы CASCADE

указывает, что такие ограничения также должны быть удалены. Фраза

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

Удаление столбца предполагает его физическое удаление из таблицы. При больших размерах таблиц эта процедура может оказаться довольно продолжи-

тельной. В этом случае некоторые СУБД предоставляют возможность выпол-

нить этот процесс в два этапа. Сначала выполняется логическое удаление столбца, при котором он физически не удаляется из таблицы, но становится не-

видимым и недоступным для использования. Затем в более удобное время можно произвести его физическое удаление.

63

1.8.3.5 Переименование таблицы

Стандарт SQL не допускает изменения имени таблицы, но во многих СУБД такая возможность предусматривается. Например, в Oracle имя таблицы изменяется предложением ALTER TABLE, имеющим следующий синтаксис:

ALTER TABLE имя_таблицы RENAME TO новое_имя_таблицы;

Например, можно следующим образом переименовать таблицу FACULTY:

ALTER TABLE FACULTY RENAME TO NEWJACULTY;

1.8.4 Удаление таблицы

С течением времени структура базы данных изменяется. Могут появляться новые таблицы и удаляться существующие. Удаление таблицы подразумевает удаление ее описания и всех содержащихся строк. Удаление таблиц базы дан-

ных производится командой DROP TABLE, которая имеет следующий синтак-

сис:

DROP TABLE имя_таблицы {CASCADE | RESTRICT};

Фразы CASCADE и RESTRICT имеют тот же смысл, что и при удалении столбца. Если какой-нибудь из столбцов удаляемой таблицы используется для описания целостности в другой таблице, попытка удаления будет отклонена при наличии фразы RESTRICT. При использовании фразы CASCADE таблица удаляется вместе со всеми ограничениями, определенными в других таблицах и ссылающимися на столбцы удаляемой таблицы.

Например, для удаления таблицы LECTURE следует выполнить следующую команду:

DROP TABLE LECTURE;

1.8.5 Определение индексов

Индекс – это специальная таблица, построенная по значениям заданного столбца или группы столбцов заданной таблицы. В ней размещается перечень уникальных значений указанного столбца таблицы со ссылками на те строки основной таблицы, где встречаются эти значения. Структура индекса напоми-

нает предметный указатель книги.

64

Решение о том, использовать или не использовать какой-либо индекс при обработке некоторого конкретного запроса, принимается оптимизатором СУБД, который учитывает множество фактором – размер таблиц, тип исполь-

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

дексы, их нужно определить. Индексы используются для следующих целей:

поддержка фраз UNIQUE и PRIMARY KEY;

поддержка логической упорядоченности данных согласно значениям одного или нескольких столбцов;

оптимизация выполнения запросов.

На практике большинство СУБД предоставляют возможность создавать индекс. Формы описания индексов отличаются, но их суть в различных СУБД одна и та же. Для построения индекса в Oracle существует предложение

CREATE INDEX, имеющее следующий синтаксис:

CREATE [UNIQUE] INDEX имя_индекса ON имя_таблицы (

имя_столбца [ASC | DESC][,

имя_столбца [ASC | DESC]...);

Если необходимость в ранее созданном индексе отпала, его можно удалить командой DROP INDEX, которая имеет следующий синтаксис:

DROP INDEX имя_индекса;

Удаление индекса не оказывает воздействия на содержимое столбцов.

При использовании индексов следует руководствоваться следующими правилами.

Для небольших таблиц индексы практически не приводят к повышению производительности.

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

Индексы существенно оптимизируют выполнение запросов, которые выдают небольшое количество строк.

Индексы повышают скорость поиска данных, однако замедляют процесс их обновления. Помните об этом, когда необходимо произвести одновременно

65

обновление большого количества строк с индексами. Не индексируйте столб-

цы, которые регулярно подвергаются интенсивному обновлению.

Помните, что индексы занимают определенное место в базе данных.

Всегда индексируйте столбцы, которые используются для соединения таблиц. Это существенно увеличивает скорость соединения таблиц.

В больших таблицах поиск индексированных значений выполняется на порядок быстрее, чем поиск неиндексированных, а в очень больших таблицах –

на два-три порядка.

1.8.6 Представления

Представление с точки зрения определения – это именованный запрос, ко-

торый сохраняется, как и другие объекты базы данных, а с точки зрения ис-

пользования – это обычная таблица.

Представления можно использовать в запросах и операторах ЯМД точно так же, как и базовые таблицы, но они не содержат никаких собственных дан-

ных. Представления подобны окнам, через которые вы просматриваете инфор-

мацию, фактически хранящуюся в базовых таблицах. Представление – это за-

прос, который выполняется всякий раз, когда к нему производится обращение.

Таблица, получающаяся в результате выполнения запроса, становится содержа-

нием представления. Базовые таблицы, которые участвуют в формировании представления, называются исходными.

Представление создается предложением CREATE VIEW. Нельзя опреде-

лить никаких свойств столбцов представления, кроме их имен. Синтаксис со-

здания представления следующий:

CREATE VIEW имя_представления [(список_имен_столбцов)] AS

предложенne_SELECT

Запрос. Простое представление:

CREATE VIEW FACULTY_COPY AS

SELECT * FROM FACULTY;

Запрос. Создать представление, содержащее данные только о профессорах.

CREATE VIEW PROFESSORS AS

SELECT * FROM TEACHER

WHERE LOWER(Post) = 'профессор';

66

Представление может быть удалено в любое время. Для этого используется предложение DROP VIEW, которое имеет следующий формат:

DROP VIEW имя_представления

Перечислим ниже основные варианты использования представлений:

Обеспечение логической независимости. Одна из основных задач, кото-

рую позволяют решать представления, – обеспечение логической независимо-

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

няются запросы в определениях соответствующих представлений. При этом никаких изменений в программы, работающие с такими представлениями, вно-

сить не нужно.

Прикладной взгляд на данные. Представления дают возможность раз-

личным пользователям по-разному видеть одни и те же данные, возможно, да-

же в одно и то же время. Это особенно ценно при работе различных категорий пользователей с единой интегрированной базой данных. Пользователям предо-

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

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

Защита данных. Представления предоставляют дополнительный уровень защиты данных в таблицах. От определенных пользователей могут быть скры-

ты некоторые данные, невидимые через предложенное им представление. Та-

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

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

67

вать библиотеку сложных запросов, которые пользователи могут впоследствии выполнять многократно.

1.8.7 Итоги лекции

Усвоив материал этой лекции, студенты научились:

определять таблицы базы данных;

изменять определение таблицы;

удалять определение таблицы;

создавать индексы;

удалять индексы;

определять представления;

удалять представления.

1.9 Манипулирование данными (15-16)

1.9.1 Аннотация к лекции

В предыдущих уроках мы изучили возможности SQL по описанию струк-

тур таблиц базы данных. В этой лекции мы рассмотрим, каким образом осу-

ществляется ведение данных в базе. Под ведением, или манипулированием,

подразумевается ввод данных в базу данных, их редактирование и удаление. В

теории баз данных эта составляющая называется языком манипулирования дан-

ными – ЯМД. В SQL имеются четыре предложения манипулирования данными:

INSERT – вставка данных;

UPDATE – обновление существующих данных;

MERGE – вставка или обновление данных таблицы на основе строк,

отобранных из другой таблицы;

DELETE – удаление строк из таблиц.

Использование этих предложений по отношению к базовым таблицам яв-

ляется предметом данной лекции.

1.9.2 Добавление новых строк

1.9.2.1 Варианты добавления строк

Предложение INSERT вставляет строки в таблицу базы данных. Есть три разновидности этой команды:

68

INSERT VALUES

INSERT SELECT

INSERT DEFAULT VALUES

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

1.9.2.2 Вставка отдельных строк

Предложение INSERT... VALUES выполняет вставку в таблицу одной строки. Его удобно использовать для небольших операций, когда в таблицу нужно вставить несколько строк. Синтаксис этого предложения следующий:

INSERT INTO имя_таблицы [(имя_столбца[, имя_столбца]...)]

VALUES (значение[, значение]...);

Этот формат предполагает указания имени таблицы, в которую произво-

дится вставка, списка имен столбцов, в которые будут вставляться значения, и

списка собственно вставляемых в строку значений. При этом следует придер-

живаться следующих правил:

вставляемые данные должны согласовываться с типами данных указан-

ных столбцов;

размеры данных должны соответствовать размерам столбцов;

порядок данных во фразе VALUES должен соответствовать порядку пе-

речисления столбцов.

Ниже приводится пример вставки одной строки в таблицу FACULTY:

INSERT INTO FACULTY (FacPK, Name, Dean, Building, Fund)

VALUES (1, 'информатика', 'Сидоров'. '6', 25000);

В этом примере мы перечислили столбцы в том порядке, в каком они были определены при создании таблицы, однако это не обязательно. При желании порядок перечисления имен столбцов в команде INSERT можно изменить.

Список имен столбцов может быть не полным. Можно указывать только те из них, значения которых известны для вставляемой строки, Столбцы, отсут-

ствующие в списке, будут принимать значения по умолчанию (или NULL) для вводимой строки.

69

В качестве вставляемых значений могут использоваться выражения.

Например, можно ввести следующую строку в таблицу TEACHER:

INSERT INTO TEACHER (TchPK, DepFK, Name, Salary, Rise, HireDate)

VALUES (77, NULL, 'Коробов', 1271, 1271 / 3, GETDATE());

Здесь мы указали, что надбавка равна третьей части ставки (1271 / 3), а да-

та приема на работу – текущая дата.

Если в списке VALUES присутствуют значения всех столбцов таблицы и в том порядке, в котором они были определены, список имен столбцов может от-

сутствовать. Приведем пример:

INSERT INTO FACULTY

VALUES (33. 'Карпов1, 'лингвистика'. 27660. '3/7');

1.9.2.3 Использование запроса при вставке строк Вы можете вставлять не только явно задаваемые значения, но и те, кото-

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

ных. Запрос может формировать множество строк, и все они вставляются при выполнении одной команды INSERT. Синтаксис этого варианта предложения следующий:

INSERT INTO имя_таблицы [(имя__столбца[, имя_столбца]...)] (запрос); 1.9.2.4 Вставка значений по умолчанию

Стандарт SQL допускает вставку целой строки, содержащей только значе-

ния по умолчанию, определенные для столбцов таблицы. Делается это с ис-

пользованием следующего формата команды INSERT:

INSERT INTO имя_таблицы DEFAULT VALUES

1.9.3 Обновление существующих данных

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

Упрощенный синтаксис предложения следующий: UPDATE имя_таблицы

SET имя_столбца = выражение[, имя_столбца = выражение]...

[WHERE условие];

70