- •2. Реляционная модель данных
- •2.1. Определения и понятия
- •2.2. Первичные ключи и индексы
- •2.3. Реляционные отношения между таблицами
- •2.3.1. Отношение один-ко-многим
- •2.3.2. Отношение один-к-одному
- •2.3.3. Отношение многие-ко-многим
- •2.3.4. Связи между записями одной таблицы
- •2.4. Ссылочная целостность
- •2.5. Индексы
- •Упражнения и задачи
- •3. Нормализация отношений
- •3.1. Первая нормальная форма
- •3.2. Функциональные зависимости и детерминанты
- •3.3. Вторая нормальная форма
- •3.4. Третья нормальная форма
- •3.5. Нормальная форма Бойса-Кодда (нфбк)
- •3.6. Нормализация за и против
- •Контрольные вопросы
- •Упражнения и задачи
- •4. Операции с данными в реляционной модели
- •4.1. Объединение
- •4.2. Пересечение
- •4.3. Вычитание
- •4.4. Декартово произведение
- •4.5. Выбор
- •4.6. Проекция
- •4.7. Соединение
- •4.8. Деление
- •Упражнения и задачи
- •5. Запросы к бд
- •5.1. Простые запросы
- •5.2. Многотабличные запросы
- •5.3. Подзапросы
- •6. Сетевая модель данных
- •6.1. Исторический контекст
- •6.2. Основные понятия и определения
- •Торговый-агент
- •Строка-элемент
- •6.3. Преимущества и недостатки сетевых моделей
- •Упражнения и задачи
- •7. Иерархическая модель данных
- •7.1. Основные понятия и определения
- •7.2. Преимущества и недостатки иерархических моделей
- •Упражнения и задачи
- •Часть 2. Управление окружением базы данных
- •1. Администрирование баз данных
- •1.1. Функции абд
- •1.1.1. Работа с пользователями
- •1.1.2. Установление стандартов и процедур
- •1.2. Задачи абд
- •2. Защита базы данных
- •2.1. Идентификация пользователя
- •2.2. Проверка полномочий и представления данных
- •2.3. Шифровка
- •Метод поалфавитной подстановки
- •2.4. Секретность данных
- •4. Целостность данных
- •4.1. Контроль типов
- •4.2. Контроль изменений
- •4.3. Целостность на уровне ссылок
- •5. Параллельная работа с бд
- •5.1. Обработка транзакций
- •5.2. Параллельная работа с бд
- •Литература
4.8. Деление
Деление – операция выполняется над двумя таблицами R1, R2, которые имеют разную структуру и некоторые одинаковые атрибуты. В результате операции образуется новая таблица, структура которой получается исключением из множества атрибутов таблицы R1 множество атрибутов таблицы R2. Результирующие строки не должны содержать дубликаты.
Пример. Рассмотрим таблицу R1 «Товар» (табл.4.18) и таблицу R2 «Агент» (табл.4.19). Предположим, что у нас есть такой запрос: перечислить торговых агентов с указанием проданных товаров. Результатом этого запроса будет таблица R3 (табл.4.20).
Таблица 4.18 R1
-
№ товара
1035
2241
2249
2518
Таблица 4.19 R2
-
№ агента
№ товара
10
2241
23
2518
23
1035
39
2518
37
2518
10
2249
23
2249
23
2241
Таблица 4.20 R3
-
№ агента
23
Рассмотренные выше операции в той или иной мере реализуются в средствах СУБД, которые обеспечивают обработку реляционных таблиц. К таким средствам относятся средства запросов и другие языковые конструкции.
Развитие реляционного подхода привело к созданию реляционных языков. Например, язык SQL, реализованный в большинстве СУБД. Он включает в себя, помимо операций реляционной алгебры, полный набор операторов над строками - «включить», «удалить», «обновить», а также реализует арифметические операции и операции сравнения.
Упражнения и задачи
Для реляционной БД, построенной в предыдущем упражнении, сформулируйте задачи, которые решаются при помощи операций реляционной алгебры.
5. Запросы к бд
5.1. Простые запросы
Простой запрос - запрос, который обращается только к одной таблице базы данных. Ниже приведены примеры простых запросов.
Работник
№ рабо- Фамилия Недельная Спец-ть № Менеджер тника зарплата 1235 И. Петров 12.50 электрик 1311 1412 К. Иванов 13.75 штукатур 1520 2920 Р. Смирнов 10.00 кровельщик 2920 1520 Г. Сидоров 11.75 штукатур 1412 1311 Х. Васильев 15.50 электрик 1311
Работа
№ рабо- № здания Дата_начала Число_дней тника 1235 312 10.10 5 2920 460 05.10 18 1235 435 17.10 22 3231 111 10.10 8 1412 435 15.10 15 1311 460 23.10 24
Здание
№ здания Адрес Тип 312 ул. Вязов, 123 офис 435 ул. Кленов, 456 склад 515 ул. Березовая, 12 магазин 210 ул. Нахимова, 4 склад |
Рис. 5.1. База данных строительной компании «Премьер»
Запрос:Вывести фамилии штукатуров?
SELECT Фамилия
FROM Работник
WHERE Специальность = 'Штукатур'
Результат:
Фамилия
К. Иванов
Г. Сидоров
Этот запрос иллюстрирует три наиболее часто встречающиеся фразы SQL: SELECT, FROM и WHERE. В данном примере мы поместили их на разные строки, они все могут стоять в одной строке. Они также могут помещаться с разными отступами, а слова внутри фраз могут разделяться произвольным числом пробелов. Рассмотрим характеристики каждой фразы:
Select. Фраза SELECT перечисляет столбцы, которые должны войти в результирующую таблицу. В данном примере результирующая таблица состоит из одного столбца (Фамилия), но в общем случае она может содержать несколько столбцов; она также может содержать вычисленные значения или константы. Если результирующая таблица должна содержать более одного столбца, то все нужные столбцы перечисляются после команды SELECT через запятую. Например, фразаSELECT № работника, Фамилия выдает в результате таблицу, состоящую из столбцов «№ работника» и «Фамилия».
From. Фраза FROM задает одну или более таблиц, к которым обращается запрос. Все столбцы, перечисленные во фразах SELECT и WHERE, должны существовать в одной из таблиц, перечисленных в команде FROM.
Where. Фраза WHERE содержит условие, на основании которого выбираются строки таблицы (таблиц). В данном примере условие состоит в том, что столбецСпециальность должен содержать константу ‘Штукатур’, заключенную в апострофы. Фраза WHERE - наиболее изменчивая команда SQL; она может содержать множество разнообразных условий.
Приведенный выше запрос SQL обрабатывается системой в следующем порядке: FROM, WHERE, SELECT. В данном примере из каждой такой строки выбирается Фамилия,и все выбранные значения выводятся в качестве результатов запроса.
Запрос:Вывести все данные о зданиях офисов.
SELECT *
FROM Здание
WHERE тип = 'Склад'
Результат:
Здание
№ зданияАдресТип |
435 ул. Кленов 456 склад |
210 ул. Нахимова 4 склад |
Звездочка (*) в команде SELECT означает «строка целиком».
Запрос:Вывести недельную зарплату каждого электрика.
SELECT Фамилия,'Недельная зарплата = ', 40* Недельная зарплата
FROM Работник
WHERE Специальность = 'Электрик'
ORDER BY Фамилия
Результат:
Фамилия
М. Петров Недельная зарплата = 500.00
Х. Васильев Недельная зарплата = 620.00
Этот запрос иллюстрирует употребление символьных константи вычислений в команде SELECT. Внутри команды SELECT можно производить вычисления, в которых используются числовые столбцы и числовые константы, а также стандартные арифметические операторы (+,-,*, /), сгруппированные по мере необходимости с помощью скобок. Команда ORDER BY сортирует результат запроса в возрастающем алфавитно-числовом порядке по указанному столбцу. Если вы хотите упорядочить результаты по убыванию, то к команде нужно добавить DESC. Фраза ORDER BY можетсортировать результаты по нескольким столбцам, по одним –в порядке возрастания, по другим – в порядке убывания. Первым указывается столбец первичного ключа сортировки.
Запрос:Вывести фамилии работников, у которых почасовая ставка от 10 до 12 рублей.
SELECT *
FROM Работник
WHERE Недельная зарплата > = 10 AND Недельная зарплата < = 12
Результат:
№ рабо- Фамилия Недельная Специальность
тниказарплата
2920 Р. Смирнов 10.00 кровельщик
520 Г. Сидоров 11.75 штукатур
Этот запрос иллюстрирует некоторые дополнительные возможности команды WHERE: операторы сравнения и булеву операцию AND (И). Для сравнения столбцов с другими столбцами или с константами могут использоваться шесть операторов сравнения(=,<> (не равно),<, >, <=, >=). Для отрицания условий могут использоватьсябулевы операцииAND(И), OR(ИЛИ), NOT(НЕТ). Для группировки условий могут использоваться скобки.
Для формулировки этого запроса также можно было использовать оператор BETWEEN (между):
SELECT *
FROM Работник
WHERE Недельная зарплата BETWEEN 10 AND 12
BETWEEN может использоваться для сравнения некоторой величины с двумя другими величинами, первая из которых меньше второй. Сравнимая величина может быть равна каждой из данных величин или любому значению между ними.
Запрос:Вывести фамилии штукатуров, кровельщиков.
SELECT *
FROM Работник
WHERE Специальность IN ('штукатур', 'кровельщик')
Результат:
№ рабо- Фамилия Недельная Специальность
тника зарплата
1412 К. Иванов 13.75 штукатур
2920 Р. Смирнов 10.00 кровельщик
1520 Г. Сидоров 11.75 штукатур
Этот запрос поясняет использование оператора сравнения IN (В). Условие WHERE считается истинным, если тип специальности строки расположен внутри множества, указанного в скобках, то есть если тип специальности – штукатур, кровельщик
Предположим, что мы не можем точно вспомнить написание специальности: «электрик» или «электронщик» или еще как-то. Символы шаблона, которые замещают неопределенные строки символов, облегчают поиск неточного написания в запросе.
Запрос:Вывести фамилии работников, чей тип специальности начинается с «элек».
SELECT *
FROM Работник
WHERE Специальность LIKE ('элек%')
Результат:
№ рабо- Фамилия Недельная Специальность
тника зарплата
1235 И. Петров 12.50 электрик
1311 Х. Васильев 15.50 электрик
В SQL есть два символа шаблона: % (процент) и _ (подчеркивание). Подчеркивание замещает ровно один неопределенный символ. Процент замещает произвольное число символов, начиная с нуля. Когда используются символы шаблона, для сравнения символьных переменных с константами требуется оператор LIKE (как).