Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Структурированный язык запросов SQL



 

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

Для подготовки запросов с помощью различных СУБД чаще всего используются два основных языка описания запросов:

· QBE (Query By Example) – язык запросов по образцу;

· SQL (Structured Query Language) – структурированный язык запросов.

По возможностям манипулирования данными при описании запросов указанные языки практически эквивалентны. Отличаются языки способом формирования запросов: язык QBE предполагает ручное или визуальное формирование запроса, в то время как использование SQL означает программирование запроса.

Язык SQL имеет несколько стандартов, наиболее распространенными из которых являются SQL-89 и SQL-92. Язык предназначен для выполнения операций над таблицами (создание, удаление, изменение структуры) и над данными таблиц (выборка, изменение, добавление и удаление), а также некоторых сопутствующих операций. SQL является непроцедурным языком и не содержит операторов управления, организации подпрограмм, ввода-вывода и т.п. В связи с этим SQL автономно не используется, обычно он погружен в среду встроенного языка программирования СУБД (например, FoxPro СУБД Visual FoxPro, ObjectPAL СУБД Paradox, Visual Basic for Applications СУБД Access).

Операторы языка SQL можно условно разделить на два подъязыка: язык определения данных (Data Definition LanguageDDL) и язык манипулирования данными (Data Manipulation LanguageDML). Основные операторы языка SQL представлены в табл. 4.1.

Таблица 4.1

Операторы языка SQL

Вид Название Назначение
DDL CREATE TABLE Создание таблицы
DROP TABLE Удаление таблицы
ALTER TABLE Изменение структуры таблицы
CREATE INDEX Создание индекса
DROP INDEX Удаление индекса
DML SELECT Выборка записей
UPDATE Изменение записей
INSERT Вставка новых записей
DELETE Удаление записей

 

Рассмотрим основные операторы языка SQL, реализованного в Access.

Инструкция CREATE TABLE.

Назначение: создание новой таблицы.

Синтаксис:

CREATE [TEMPORARY] TABLE таблица (поле_1 тип [(размер)] [NOT NULL]

[индекс_1] [, поле_2 тип [(размер)] [NOT NULL] [индекс_2] [, ...]]

[, составной_индекс [, ...]])

Аргументы инструкции CREATE TABLE:

таблица - имя создаваемой таблицы;

поле_1, поле_2 - имена одного или нескольких полей, создаваемых в новой таблице. Таблица должна содержать хотя бы одно поле;

тип - тип данных поля в новой таблице;

размер - размер поля в знаках (только для текстовых и двоичных полей);

индекс_1, индекс_2 - предложение CONSTRAINT, предназначенное для создания простого индекса;

составной_индекс - предложение CONSTRAINT, предназначенное для создания составного индекса.

Дополнительные сведения:

· Если для поля добавлено ограничение NOT NULL, то при добавлении новых записей это поле должно содержать допустимые данные.

· Предложение CONSTRAINT устанавливает различные ограничения на поле и может быть использовано для определения ключа. Кроме того, для создания ключа или дополнительного индекса для существующей таблицы можно использовать инструкцию CREATE INDEX.

· Создаваемая временная (TEMPORARY) таблица будет доступна только в том сеансе, котором эта таблица была создана. По завершении данного сеанса она автоматически удаляется.

Например, инструкция

TABLE Разделы (Код_раздела INTEGER NOT NULL, Название TEXT(30) NOT NULL);

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

Предложение CONSTRAINT.

Назначение: создание или удаление индексов в инструкциях CREATE TABLE и ALTER TABLE.

Существуют два типа предложений CONSTRAINT: одно для создания простого индекса (по одному полю), а второе для создания составного индекса (по нескольким полям).

Синтаксис предложения CONSTRAINT для создания простого индекса:

CONSTRAINT имя {PRIMARY KEY | UNIQUE | NOT NULL |

REFERENCES внешняя таблица [(внешнее_поле_1, внешнее_поле_2)]

[ON UPDATE CASCADE | SET NULL]

[ON DELETE CASCADE | SET NULL]}

Синтаксис предложения CONSTRAINT для создания составного индекса:

CONSTRAINT имя

{PRIMARY KEY (ключевое_1[, ключевое_2 [, ...]]) |

UNIQUE (уникальное_1[, уникальное_2 [, ...]]) |

NOT NULL (непустое_1[, непустое_2 [, ...]]) |

FOREIGN KEY [NO INDEX] (ссылка_1[, ссылка_2 [, ...]])

REFERENCES внешняя таблица [(внешнее_поле_1 [, внешнее_поле_2 [, ...]])]

[ON UPDATE CASCADE | SET NULL]

[ON DELETE CASCADE | SET NULL]}

Аргументы предложения CONSTRAINT:

имя - имя создаваемого индекса;

ключевое_1, ключевое_2 - имена одного или нескольких полей, которые следует обозначить как ключевые;

уникальное_1, уникальное_2 - имена одного или нескольких полей, которые следует включить в уникальный индекс;

непустое_1, непустое_2 - имена одного или нескольких полей, в которых запрещаются значения Null;

ссылка_1, ссылка_2 - имена одного или нескольких полей, включенных во внешний ключ, которые содержат ссылки на поля в другой таблице;

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

внешнее_поле_1, внешнее_поле_2 - имена одного или нескольких полей внешней таблицы, указанные с помощью ссылки_1 и ссылки_2. Если адресуемое поле является ключом внешней таблицы, данное предложение можно опустить.

Предложение CONSTRAINT позволяет создавать для поля индекс одного из описанных ниже типов:

· Для создания уникального индекса используется зарезервированное слово UNIQUE. Это означает, что в таблице не может быть двух записей, имеющих одно и то же значение в этом поле. Уникальный индекс создается для любого поля или любой группы полей. Если в таблице определен составной уникальный индекс, то комбинация значений включенных в него полей должна быть уникальной для каждой записи таблицы, хотя отдельные поля и могут иметь совпадающие значения.

· Для создания ключа таблицы, состоящего из одного или нескольких полей, используется зарезервированные слова PRIMARY KEY. Все значения ключа таблицы должны быть уникальными и отличаться от значения Null. Кроме того, в таблице может быть только один ключ.

Примечание. Зарезервированные слова PRIMARY KEY нельзя использовать при создании индекса в таблице, в которой уже определен ключ; в противном случае возникнет ошибка.

· Для создания внешнего ключа используются зарезервированные слова FOREIGN KEY. Если ключ внешней таблицы состоит из нескольких полей, необходимо использовать предложение CONSTRAINT, предназначенное для создания составного индекса. При этом следует перечислить все поля, содержащие ссылки на поля во внешней таблице, а также указать имя внешней таблицы и имена полей внешней таблицы, на которые ссылаются поля, перечисленные выше, причем в том же порядке. Если адресуемые поля являются ключами внешней таблицы, указывать эти поля не следует. Ограничения для внешних ключей определяют конкретные действия, выполняемые в случае изменения значения соответствующего ключа:

Например, инструкция

CREATE TABLE Книги (Код_книги TEXT(7) NOT NULL CONSTRAINT ключ2 PRIMARY KEY, Раздел TEXT(5) NOT NULL, Автор TEXT(40) NOT NULL, Название TEXT(50) NOT NULL);

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

Инструкция

CREATE TABLE Выдача_возврат (Код_книги TEXT(7) NOT NULL, Код_читателя TEXT(5) NOT NULL, Дата_выдачи DATETIME NOT NULL, Дата_возврата DATETIME, CONSTRAINT Ключ4 PRIMARY KEY (Код_книги, Дата_выдачи));

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

Инструкция ALTER TABLE.

Назначение: изменение структуры таблицы, созданной с помощью инструкции CREATE TABLE.

Синтаксис:

ALTER TABLE таблица {ADD {COLUMN поле тип [(размер)] [NOT NULL]

[CONSTRAINT индекс] | ALTER COLUMN тип поля[(размер)] |

CONSTRAINT составной_индекс} |

DROP {COLUMN поле | CONSTRAINT имя_индекса} }

Аргументы инструкции ALTER TABLE:

таблица - имя изменяемой таблицы;

поле - имя поля, добавляемого в таблицу или заменяемого в таблице или удаляемого из нее;

тип - тип данных поля;

размер - размер поля в знаках (только для текстовых и двоичных полей);

индекс - индекс для поля;

составной_индекс - описание составного индекса, добавляемого к таблице;

имя_индекса - имя составного индекса, который следует удалить.

С помощью инструкции ALTER TABLE существующую таблицу можно изменить несколькими способами:

· Добавить новое поле в таблицу с помощью зарезервированных слов ADD COLUMN. В этом случае необходимо указать имя поля, его тип и (для текстовых и двоичных полей) необязательный размер. Например, инструкция

ALTER TABLE Книги ADD COLUMN Год INTEGER NOT NULL;

добавит в таблицу Книги целочисленное поле Год.

· Изменить тип существующего поля с помощью зарезервированных слов ALTER COLUMN. В этом случае необходимо указать имя поля, его тип и (для текстовых и двоичных полей) необязательный размер. Например, инструкция ALTER TABLE Разделы ALTER COLUMN Код_раздела TEXT(5);

позволит в таблице Разделы изменить тип поля Код (первоначально определенный как INTEGER), переопределив это поле как текстовое.

· Добавить составной индекс с помощью зарезервированных слов ADD CONSTRAINT.

· Удалить поле с помощью зарезервированных слов DROP COLUMN. В этом случае необходимо указать только имя поля. Например, инструкция

ALTER TABLE Книги DROP COLUMN Год;

удалит из таблицы Книги поле Год.

· Удалить составной индекс с помощью зарезервированных слов DROP CONSTRAINT. В этом случае необходимо указать только имя составного индекса, следующее за зарезервированным словом CONSTRAINT.

Инструкция CREATEINDEX.

Назначение: создание нового индекса для существующей таблицы.

Синтаксис:

CREATE [ UNIQUE ] INDEX индекс

ON таблица (поле [ASC|DESC][, поле [ASC|DESC], ...])

[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]

Аргументы:

индекс - имя создаваемого индекса;

таблица - имя существующей таблицы, для которой создается индекс;

поле - имена одного или нескольких полей, включаемых в индекс. Для создания простого индекса (состоящего из одного поля) имя поля в круглых скобках вводится сразу после имени таблицы. Для создания составного индекса (состоящего из нескольких полей) перечисляются имена всех этих полей. Для расположения элементов индекса в убывающем порядке используется зарезервированное слово DESC; в противном случае будет принят порядок по возрастанию.

 


Дополнительные сведения:

· Зарезервированное слово UNIQUE используется для запрета совпадения значений индексированных полей в разных записях.

· Необязательное предложение WITH позволяет задать условия на значения. Например:

o С помощью параметра DISALLOW NULL запретить значения Null в индексированных полях новых записей.

o С помощью параметра IGNORE NULL запретить включение в индекс записей, имеющих значения Null в индексированных полях.

o С помощью зарезервированного слова PRIMARY назначить индексированные поля ключом. Такой индекс по умолчанию является уникальным, следовательно, зарезервированное слово UNIQUE можно опустить. Зарезервированное слово PRIMARY нельзя использовать при создании нового индекса в таблице, в которой уже определен ключ; в противном случае возникнет ошибка.

Например, инструкция

CREATE INDEX Ключ1 ON Разделы(Код_раздела) WITH PRIMARY;

определит в таблице Разделы поле Код_раздела как ключевое.

Инструкция

CREATE INDEX Индекс ON Книги(Автор);

создаст в таблице Книги индекс по полю Автор.

Инструкция DROP.

Назначение: удаление таблицы, процедуры, представления из базы данных или удаление индекса из таблицы.

Синтаксис:

DROP {TABLE таблица | INDEX индекс ON таблица | PROCEDURE процедура | VIEW представление}

Аргументы:

таблица - имя таблицы, которую следует удалить или из которой следует удалить индекс;

процедура - имя удаляемой процедуры;

представление - имя удаляемого представления;

индекс - имя индекса, удаляемого из таблицы.

Например, инструкция

DROP INDEX Индекс ON Книги;

удалит из таблицы Книги индекс по полю Автор.

Инструкция

DROP TABLE Книги;

удалит из базы данных таблицу Книги.

Инструкция SELECT.

Назначение: возвращение данных из базы данных в виде набора записей.

Синтаксис:

SELECT [предикат] {* | таблица.* | [таблица.]поле_1

[AS псевдоним_1] [, [таблица.]поле_2 [AS псевдоним_2] [, ...]]}

FROM выражение [, ...] [IN внешняя_база_данных]

[WHERE... ]

[GROUP BY... ]

[HAVING... ]

[ORDER BY... ]

[WITH OWNERACCESS OPTION]

Аргументы:

предикат - один из следующих предикатов отбора: ALL, DISTINCT, DISTINCTROW или TOP. Предикаты используются для ограничения числа возвращаемых записей. По умолчанию используется предикат ALL;

* - указывает, что выбраны все поля заданной таблицы или таблиц;

таблица - имя таблицы, из которой должны быть отобраны записи;

поле_1, поле_2 - имена полей, из которых должны быть отобраны данные. Если включить несколько полей, они будут извлекаться в указанном порядке;

псевдоним_1, псевдоним_2 - имена, которые станут заголовками столбцов вместо исходных названий столбцов в таблице;

выражение - имена одной или нескольких таблиц, которые содержат отбираемые данные;

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

Минимальный синтаксис инструкции SELECT:

SELECT поля FROM таблица.

Например, инструкция

SELECT * FROM Книги;

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

Инструкция

SELECT Книги.Код_книги, Книги.Автор, Книги.Название FROM Книги;

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

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

Например, инструкция

SELECT Книги.Автор, Книги.Название

FROM Книги

WHERE (Книги.Автор=”Конан Дойл”);

отберет из таблицы Книги все книги Конан Дойла.

С помощью инструкции

SELECT Выдача_возврат.Код_книги

FROM Выдача_возврат

WHERE (Выдача_возврат.Дата_возврата IS NULL);

можно найти все коды книг, которые находятся на руках (выданы).

Предложение ORDER BY сортирует записи, полученные в результате запроса, в порядке возрастания (ASC) или убывания (DESC) на основе значений указанного поля или полей.

Синтаксис:

ORDER BY поле_1 [ASC | DESC] [, поле_2 [ASC | DESC]][, ...].

Если предложение ORDER BY содержит несколько полей, то сначала записи сортируются по первому полю. Затем записи, имеющие совпадающие значения в первом поле, сортируются по второму полю и т. д. По умолчанию используется порядок сортировки по возрастанию (от «A» до «Я» и от 0 до 9). Предложение ORDER BY не является обязательным.

Например, инструкция

SELECT Выдача_возврат.Код_книги

FROM Выдача_возврат

WHERE (Выдача_возврат.Дата_возврата IS NULL)

ORDER BY Выдача_возврат.Код_книги;

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

Предложение GROUP BY объединяет записи с одинаковыми значениями в указанном списке полей в одну запись. Если инструкция SELECT содержит статистическую функцию SQL, например Sum или Count, то для каждой записи будет вычислено итоговое значение.

Синтаксис:

GROUP BY группируемыеПоля.

При использовании предложения GROUP BY все поля в списке полей инструкции SELECT должны быть либо включены в предложение GROUP BY, либо использоваться в качестве аргументов статистической функции SQL. Значения NULL которые находятся в полях, заданных в предложении GROUP BY, группируются и не опускаются. Однако статистические функции SQL не обрабатывают значения NULL. Предложение GROUP BY не является обязательным.

Например, инструкция

SELECT Книги.Раздел, Count(Книги.Раздел) AS [Количество книг]

FROM Книги

GROUP BY Книги.Раздел;

позволит подсчитать количество книг из каждого раздела.

А с помощью инструкции

SELECT Выдача_возврат.Код_книги, Count(Выдача_возврат.Код_книги) AS [Сколько раз брали книгу]

FROM Выдача_возврат

GROUP BY Выдача_возврат.Код_книги;

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

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

Синтаксис:

HAVING условиеГруппировки.

Например, инструкция

SELECT Выдача_возврат.Код_книги, Count(Выдача_возврат.Код_книги) AS [Сколько раз брали книгу]

FROM Выдача_возврат

GROUP BY Выдача_возврат.Код_книги

HAVING Count(Выдача_возврат.Код_книги)> 5;

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

Нередко для построения запроса необходимы данные не из одной, а из нескольких таблиц. Для этого используется какая-либо операция SQL: INNER JOIN, LEFT JOIN или RIGHT JOIN.

Операция INNER JOIN объединяет только те записи из двух таблиц, в которых связываемые поля обеих таблиц содержат одинаковые значения. LEFT JOIN используется для создания левого объединения, при котором все записи из первой (левой) таблицы включаются в результат выборки, даже если во второй таблице нет соответствующих им записей. RIGHT JOIN используется для создания правого объединения, при котором все записи из второй (правой) таблицы включаются в результат выборки, даже если в первой таблице нет соответствующих им записей.

Синтаксис:

FROM таблица_1 INNER JOIN | LEFT JOIN | RIGHT JOIN таблица_2 ON таблица_1.поле_1 оператор таблица_2.поле_2,

где оператор – любой оператор сравнения.

Например, инструкция

SELECT Книги.Код_книги, Книги.Раздел, Книги.Автор, Книги.Название

FROM Книги LEFT JOIN Книги_на_руках ON Книги.Код_книги = Книги_на_руках.Код_книги

WHERE (Книги_на_руках.Код_книги IS NULL);

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

Инструкция UPDATE.

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

Синтаксис:

UPDATE таблица

SET новое_значение

WHERE условие_отбора;

Аргументы инструкции UPDATE:

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

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

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

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

Например, инструкция

UPDATE Выдача_возврат SET Выдача_возврат.Дата_возврата = DATE()

WHERE (Выдача_возврат.Код_книги=”Д1”);

изменит значение NULL поля Дата_возврата для книги с кодом Д1 на значение текущей даты.

Инструкция INSERTINTO.

Назначение: добавление записи или записей в таблицу.

Синтаксис запроса на добавление нескольких записей:

INSERT INTO назначение [(поле_1[, поле_2[, ...]])] [IN внешняя_база_данных]

SELECT [источник.]поле_1[, поле_2[, ...]]

FROM выражение

Синтаксис запроса на добавление одной записи:

INSERT INTO назначение [(поле_1[, поле_2[, ...]])]

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

Аргументы инструкции INSERT INTO:

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

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

внешняя_база данных - путь к внешней базе данных;

источник - имя таблицы или запроса, откуда копируются записи;

выражение - имена таблицы или таблиц, откуда вставляются данные. Это выражение может быть именем отдельной таблицы или результатом операции INNER JOIN, LEFT JOIN или RIGHT JOIN а также сохраненным запросом;

значение_1, значение_2 - значения, добавляемые в указанные поля новой записи. Каждое значение будет вставлено в поле, занимающее то же положение в списке: значение_1 вставляется в поле_1 новой записи, значение_2 - в поле_2 и т. д. Каждое значение текстового поля следует заключать в кавычки.

Например, инструкция

INSERT INTO Утерянные_книги (Код_книги)

SELECT Книги.Код_книги

FROM Книги

WHERE (Книги.Название=" Мудрость отца Брауна" );

добавит в таблицу Утерянные_книги код соответствующей книги.

Инструкция

NSERT INTO Книги (Код_книги, Раздел, Автор, Название)

VALUES (" Д5", " Д", " Неизвестный", " Интересная" );

добавит в таблицу Книги информацию по новой книге.

Инструкция DELETE.

Назначение: удаление записей из одной или нескольких таблиц, перечисленных в предложении FROM, которые удовлетворяют предложению WHERE.

Синтаксис:

DELETE [таблица.*]

FROM таблица

WHERE условие_отбора

Аргументы инструкции DELETE:

таблица - необязательное имя таблицы, из которой удаляются записи;

таблица - имя таблицы, из которой удаляются записи;

условие_отбора - выражение, определяющее удаляемые записи.

Дополнительные сведения:

· Инструкция DELETE особенно удобна для удаления большого количества записей.

· Инструкцию DELETE можно использовать для удаления записей из таблиц, связанных отношением «один ко многим» с другими таблицами. Операции каскадного удаления приводят к удалению записей из таблиц, находящихся на стороне отношения «многие», когда в запросе удаляется соответствующая им запись на стороне «один». Например, в отношении между таблицами Книги и Выдача_возврат, таблица Книги расположена на стороне «один», а таблица Выдача_возврат - на стороне «многие». Если разрешить каскадное удаление, то удаление записи из таблицы Книги приведет к удалению соответствующих записей из таблицы Выдача_возврат.

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

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

Например, инструкция

DELETE Выдача_возврат.*

FROM Выдача_возврат

WHERE ((Выдача_возврат.Дата_выдачи < #31/12/2000#) AND (Выдача_возврат.Дата_возврата IS NOT NULL));

удалит из таблицы Выдача_возврат все записи по книгам, выданным до 31 декабря 2000 года и возвращенным в библиотеку.

В заключение отметим, что, по словам Дейта, язык SQL является гибридом реляционной алгебры и реляционного исчисления. В нем есть и элементы алгебры, и элементы исчисления. Кроме того, язык SQL обладает реляционной полнотой.

 

Тесты для самоконтроля

 

 


1. Отношением называют:

а) набор значений элементов данных одного типа;

б) множество кортежей;

в) некоторое подмножество декартова произведения доменов.

2. Набор значений элементов данных одного типа, отвечающий поставленным условиям, называется:

а) отношением;

б) доменом;

в) декартовым произведением k доменов.

3. В результате разности двух отношений получится отношение, содержащее записи, принадлежащие:

а) первому отношению;

б) одновременно двум отношениям;

в) либо первому отношению, либо второму, либо им обоим.

4. К числу операций, применяемых к отношениям с одной и той же схемой, относится операция:

а) объединения;

б) деления;

в) пересечения.

5. Соединяемые столбцы повторяются:

а) при естественном соединении;

б) при эквисоединении;

в) при тета – соединении.

6. Отношения могут комбинироваться только по одноименным столбцам:

а) при тета – соединении;

б) при естественном соединении;

в) при эквисоединении.

7. К одному отношению применяются следующие операции:

а) выборка, проекция;

б) объединение, разность, пересечение;

в) произведение, деление.

 

Задания для самостоятельного выполнения

 

1. Даны отношения: r, содержащее информацию о женщинах – читательницах библиотеки, и s, содержащее информацию о читателях – должниках.

r

Код ФИО Адрес Телефон
Ж1 Петрова В. Гамарника 1-1  
Ж2 Иванова М. Интернациональный 1-1 34-56-78
Ж3 Петрова М. Ленина 1-2  

s

Код ФИО Адрес Телефон
М1 Иванов П.. Пирогова 1-1 2-34-56
М3 Петров П. Ленина 1-2  
Ж1 Петрова В. Гамарника 1-1  

Найти женщин – должников библиотеки.

2. Даны отношения: Выдача, содержащее информацию по всем книгам, выданным в определенный период времени, и Книги, содержащее коды нескольких пользующихся спросом книг.

Выдача Книги

Читатель Код книги Дата выдачи   Код книги
Иванов А. Д1 01.09.02   Д1
Петров Б. П1 01.09.02   П2
Сидоров В. Д1 08.09.02    
Макаров Г. П2 09.09.02    
Иванов А. П1 08.09.02    
Сидоров В. П2 15.09.02    
Петров Б. Д2 15.09.02    

Найти читателей, которые брали все указанные книги.

3. Используя инструкции SQL,

а) создать таблицу Читатели с пятью полями: целочисленным полем Код и текстовыми полями определенного размера: Пол, Фамилия, Адрес, Телефон. Для всех полей, кроме последнего, определить обязательный ввод данных;

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

в) определить в таблице Читатели поле Код как ключевое;

г) создать индекс по полю Пол;

д) найти всех читателей, имеющих телефон;

е) подсчитать количество женщин и мужчин – читателей библиотеки;

ж) изменить фамилию какой-либо читательницы библиотеки;

з) добавить в таблицу информацию о новом читателе библиотеки;

и) удалить из таблицы информацию обо всех мужчинах – читателях библиотеки;

к) удалить из таблицы индекс по полю Пол;

л) удалить таблицу Читатели.

 


НОРМАЛИЗАЦИЯ ОТНОШЕНИЙ

 

Сущность нормализации

 

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

Нормализованным отношением называют отношение, каждый домен которого содержит только атомарные значения.

Отношение, даже если оно нормализовано, может обладать нежелательными свойствами - нормальная форма не обеспечивает сохранность набора отношений в процессе удаления, включения и обновления данных, ввиду существующей зависимости между последними, которая называется функциональной зависимостью (F-зависимостью).

Рассмотрим БД для консультанта университета, состоящую из одной таблицы Консультант со следующими полями: № студента, ФИО студента, № комнаты, № телефона, № курса, Семестр1, Оценка:

 

 

№ сту­дента ФИО студента № комнаты № телефона № курса Семестр Оценка
Васильев О.И. ТВПС
Васильев О.И. МСиС
Васильев О.И. БД
Васильев О.И. ТВПС
Воловик В.А. ТВПС
Воловик В.А. БД
Воловик В.А. ООП
Борисов И.Ю. ВМ
Борисов И.Ю. ПиП
Борисов И.Ю. ОС
Гатаулин А.Е. ООП

 

 

Проблема включения. Когда у консультанта появляется новый консультируемый им студент, для него необходимо включить в БД кортеж с пустыми ячейками атрибутов: Семестр, Оценка, что повлечет за собой аномалии при поиске и редактировании данных (например, в результате запроса «Выдать список фамилий и номеров студентов, получивших хотя бы одну оценку ниже 3» в число таких студентов попадут такие, которые не закончили ни одного курса).

Проблема обновления. В отношении Консультант большое число избыточных данных. Избыточность (дублирование) данных всегда свидетельствует о возможности модификации только части требуемых данных с помощью операции обновления. Отношение характеризуется как явной, так и неявной избыточностью.

Явная избыточность: фамилия студента, его номер комнаты и номер телефона появляются в отношении не один раз. Например, если студент Васильев О.И. обратится к консультанту и сообщит ему об изменении номера своей комнаты, то консультант будет вынужден проследить изменение этого номера во всех четырех кортежах во избежание противоречивости данных.

Неявная избыточность: один и тот же номер телефона имеют все студенты, живущие в одной комнате. Допустим, Васильев О.И. извещает консультанта о том, что его номер телефона изменен на 7777, забыв при этом сообщить о друге по комнате, консультант меняет телефонный номер в кортежах для Васильева О.И. – в результате правильный номер телефона будет фактически утерян.

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

Рассмотрим отношение СлужащийНачальник:

 

№ служащего Начальник
Джонс
Смит
Смит
Джонс

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

 

 

№ служащего Начальник
Джонс
Смит
 
 

Дублированные фамилии удалены – и невозможно узнать фамилии начальников для служащих с номерами 195 и 200.

 

Теперь рассмотрим отношение СлужащийНачальникТелефон (предполагаем, что каждый начальник имеет только один телефонный номер):

 

№ служащего Начальник № телефона
Джонс
Смит
Смит
Джонс

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

 

Для исключения избыточности телефонных номеров данное отношение разбивается на следующие два:

СлужащийНачальник НачальникТелефон

№_служащего Начальник   Начальник Телефон
Джонс   Джонс
Смит   Смит
Смит      
Джонс      

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

 

Проблема удаления. В экземпляре1 отношения Консультант имеется только один кортеж для студента с фамилией Гатаулин. Предположим, консультант узнает, что этот студент не закончил курс ООП, как это отмечено, и удаляет соответствующий кортеж, что приведет к потере из БД информации об этом студенте.

Дадим определение функциональнойзависимости между данными.

Пусть имеется отношение r(A1, A2, …, An). Атрибут А2 отношения r функционально зависит от атрибута A1 того же отношения, если в каждый момент времени каждому значению атрибута А1 соответствует не более, чем одно значение атрибута А2 (то есть функциональная зависимость А2 от А1 означает, что если в любой момент времени известно значение А1, то можно однозначно получить и значение А2). Обозначается:

А1 ® А2.

Рассмотрим отношение Студент (№ зачетной книжки, № группы, ФИО).

Функционально зависимы следующие атрибуты:

№ зачетной книжки ® № группы;

№ зачетной книжки ® ФИО.

Если предположить, что имеются полные однофамильцы, то:

ФИО№ зачетной книжки;

ФИО№ группы.

Атрибут может функционально зависеть не от какого-то одного атрибута, а от целой группы атрибутов, то есть А1 и А2 могут быть составными.

В связи с этим дадим определение полной функциональной зависимости.

Если в отношении r для множеств атрибутов А1 и А2 имеет место А1 ® А2 и при этом ↛ А2, где – подмножество А1 ( ), то говорят, что множество атрибутов А2 функционально полно зависит от всего множества А1, но не зависит ни от какого подмножества А1.

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

В качестве примера обратимся к атрибутам отношения Консультант. Функционально зависимы следующие атрибуты:

№ студента ® ФИО студента;

№ студента ® № комнаты;

№ студента ® № телефона;

№ комнаты ® № телефона;

№ телефона ® № комнаты;


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-07-13; Просмотров: 944; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.187 с.)
Главная | Случайная страница | Обратная связь