- •Серверы баз данных Курс лекций
- •Предисловие
- •Серверы баз данных. Основные понятия
- •История развития субд
- •Перспективы развития субд
- •Трехуровневая архитектура бд. Ее назначение
- •Модели клиент- сервер в технологии бд
- •Пользователи бд
- •Разработчики и администраторы приложений.
- •Контрольные вопросы
- •Двухуровневые модели
- •Модель удаленного доступа к данным
- •Удаленная презентация (Модель сервера бд)
- •Модель распределенной бд
- •Модель сервера приложений
- •Проектирование баз данных
- •Этапы разработки базы данных
- •Критерии оценки качества логической модели данных
- •Алгоритм нормализации (приведение к 3нф)
- •Элементы модели "сущность-связь"
- •Основные понятия er-диаграмм
- •Пример разработки er-модели
- •Описание предметной области
- •Описание сущностей и типов связей
- •П ереход к реляционной модели
- •Концептуальные и физические er-модели
- •Контрольные вопросы
- •Языки бд. Язык определения данных
- •Создание бд. Способы создания бд
- •Создание таблиц базы данных
- •Декларативные ограничения при создании таблиц
- •Задание ограничений ссылочной целостности
- •Изменение таблиц
- •Создание индексов в системе sql-сервер
- •Кластеризованный индекс
- •Контрольные вопросы
- •Языки бд. Язык управления данными
- •Выборка данных
- •Сортировка результатов запроса
- •Вложение запросов
- •Создание таблицы из набора результатов
- •Использование оператора union
- •Запросы на модификацию данных
- •Запросы на удаление
- •Запросы на добавление
- •Вставка записей из другой таблицы
- •Добавление данных в указанные поля
- •Values(‘31.03.03’,’согласен’,3000,4)
- •Запросы на обновление
- •Контрольные вопросы
- •Создание представлений
- •Создание, удаление и обновление представлений
- •Модифицируемые и немодифицируемые представления
- •Контрольные вопросы
- •Хранимые процедуры
- •Элементы Transact sql
- •Оператор условия
- •Циклическое выполнение операций
- •Функции
- •Создание хранимых процедур
- •Выполнение хранимой процедуры.
- •Контрольные вопросы
- •Триггеры
- •Назначение триггеров
- •Создание триггеров
- •Принцип работы триггеров
- •Включение и отключение триггера. Удаление триггера, Просмотр информации о триггерах
- •Контрольные вопросы
- •Транзакции и блокировки
- •Понятие транзакции
- •Свойства транзакций. Способы завершения транзакций
- •Операторы Transact sql для работы с транзакциями
- •Журнал транзакций.
- •Блокировки.
- •Сериалиация транзакций
- •Переопределение блокировок на уровне запроса. Типы блокировок
- •Контрольные вопросы
- •Безопасность данных и привилегии
- •Принципы защиты баз данных от несанкционированного доступа
- •Защита данных в системе ms sql Server
- •Контрольные вопросы
- •Организация доступа к бд из прикладных программ
- •Понятие курсора
- •Интерфейс прикладного программирования
- •Архитектура odbc
- •Архитектура odbc
- •Контрольные вопросы
- •Файловые структуры, используемые для хранения информации в бд.
- •Файлы прямого и последовательного доступа
- •Индексные файлы
- •Файлы с плотным индексом
- •Файлы с неплотным индексом
- •Моделирование отношений 1:м на файловых структурах
- •Моделирование отношений 1:м с использованием однонаправленных указателей
- •Структура записи подчиненного файла.
- •Алгоритм удаление записи из цепочки подчиненного файла.
- •Инвертированные списки
- •К Рисунок 14 онтрольные вопросы
- •Содержание
- •Литература
Кластеризованный индекс
Использование опции Clustered index позволяет произвести так называемое кластерное индексирование, в результате чего будут отсортированы данные в самой таблице согласно порядку этого индекса, и вся добавляемая информация будет приводить к изменению физического порядка данных. При этом нужно учитывать, что в таблице может быть определён только один кластерный индекс.
Контрольные вопросы
Перечислите основные функции языка определения данных.
Назовите основные операторы языка DDL.
Перечислите основные функции языка управления данными.
Назовите основные операторы языка DML.
Каким образом задаются декларативные ограничения целостности при создании таблиц?
Каким образом задаются ограничения ссылочной целостности при создании таблиц?
Возможно ли изменение или удаление значений первичного ключа в главной таблице, если в подчиненной таблице имеются связанные записи?
Как добавить в существующую таблицу новое ограничение?
Какая команда служит для создания индекса?
Что понимают под кластеризованным индексом?
Языки бд. Язык управления данными
Выборка данных
Для отбора строк и столбцов таблиц базы данных используется инструкция SELECT.
Синтаксис:
SELECT [ALL|DISTINCT] набор_атрибутов
FROM набор_отношений
[WHERE условие_отбора_строк]
[GROUP BY спецификация_группировки]
[HAVING спецификация_выбора_групп]
[ORDER BY спецификация_сортировки]
Ключевое слово ALL означает, что в результирующий набор строк включаются все строки, удовлетворяющие условиям запроса, в том числе и строки-дубликаты. Ключевое слово DISTINCT означает, что в результирующий запрос включаются только различные строки.
В разделе SELECT атрибуты могут указываться с помощью (*). Например X.* обозначает совокупность всех атрибутов отношения Х, а изолированная * – совокупность всех атрибутов всех отношений, фигурирующих в разделе FROM для создания запроса.
Таблицам могут быть присвоены имена – псевдонимы, что бывает полезно при соединении таблицы с самой собою или для доступа из вложенного подзапроса к текущей записи внешнего запроса. Псевдонимы задаются с помощью ключевого слова AS, которое может быть опущено.
Раздел FROM определяет таблицы или запросы, служащие источником данных. В случае если указано более одного имени таблицы, по умолчанию предполагается, что над перечисленными таблицами будет выполнена операция декартова произведения. Например, запрос
SELECT *
FROM А, В
соответствует декартову произведению отношений А и В. Для задания типа соединения таблиц в единый набор записей, из которого будет выбираться необходимая информация, в разделе FROM используются ключевые слова JOIN и ON. Ключевое слово JOIN и его параметры указывают соединяемые таблицы и методы соединения. Ключевое слово ON указывает общие для таблиц поля.
При внутреннем соединении таблиц (INNER JOIN или JOIN) сравниваются значения общих полей этих таблиц. В окончательный набор возвращаются только те записи, которые отвечают условиям соединения. Операция LEFT JOIN возвращает все строки из первой таблицы, соединенные с теми строками второй, для которых выполняется условие соединения.
Если во второй таблице таких строк нет, возвращаются NULL значения в строках второй таблицы. Аналогично, операция RIGHT JOIN возвращает все строки второй таблицы, соединенные с теми строками первой, для которых выполняется условие объединения.
Операции LEFT JOIN или RIGHT JOIN могут быть вложены в операцию INNER JOIN, но операция INNER JOIN не может быть вложена в операцию LEFT JOIN или RIGHT JOIN.
Раздел WHERE задает условия отбора строк. Имена атрибутов, входящие в предложение WHERE могут не входить в набор атрибутов, перечисленных в предложении SELECT.
В выражении условий раздела WHERE могут быть использованы следующие предикаты:
Предикаты сравнения {=, >, <, >=, <=, <>. }.
Предикат BETWEEN A AND B. Предикат истинен, когда сравниваемое значение попадает в заданный диапазон, включая границы диапазона.
Предикат вхождения во множество IN (множество) истинен тогда, когда сравниваемое значение входит во множество заданных значений. При этом множество может быть задано простым перечислением или встроенным подзапросом. Одновременно существует противоположный предикат NOT IN (множество).
Предикаты сравнения с образцом LIKE и NOT LIKE. Предикат LIKE требует задания шаблона, с которым сравнивается заданное значение.
Предикат сравнения с неопределенным значением IS NULL. Неопределенное значение интерпретируется в реляционной модели как значение, неизвестное в данный момент времени. Это значение при появлении некоторой дополнительной информации в любой момент времени может быть заменено некоторым конкретным значением.
Предикаты существования EXISTS и не существования NOT EXISTS.
Когда запрос включает предложение WHERE, СУБД просматривает всю таблицу по одной записи, чтобы определить является ли предикат истинным. Предикат может включать неограниченное число условий, содержащих булевы операторы. Стандартными булевыми операторами в SQL являются AND, OR и NOT.
Например, создать запросы для вывода:
перечня адресов трёхкомнатных квартир, предлагаемых для продажи в ’Витебске’ (примеры запросов относятся к базе данных, структура которой приведена на Error: Reference source not found);
SELECT Property_no, Street, House, Flat
FROM PROPERTY
WHERE City= ’Витебске’ AND Rooms=3;
списка отделений компании, которые предлагают трехкомнатные квартиры c телефонами;
SELECT BRANCH.Branch_no
FROM BRANCH INNER JOIN PROPERTY ON BRANCH.Branch_no=PROPERTY.Branch_no
WHERE (PROPERTY.Rooms=3) AND (PROPERTY.Ptel=’T’);
списка шифров владельцев собственности (Owner_no), предлагающих несколько трехкомнатных квартир для продажи;
SELECT DISTINCT a.Owner_no
FROM PROPERTY a, PROPERTY b
WHERE a.Owner_no=b.Owner_no AND
a.Property_no<>b.Property_no AND
a.Rooms=3 AND b.Rooms=3;
В запросе используются псевдонимы a и b таблицы PROPERTY, так как для выполнения запроса необходимо оценить равенство поля Owner_no в двух экземплярах одной и той же таблицы.
Раздел GROUP BY используется для создания итоговых запросов. Итоговые запросы имеют одно общее свойство: в предложении SELECT таких запросов используется, по крайней мере, одна агрегатная функция (AVG, COUNT (количество непустых значений в данном столбце), SUM, MIN, MAX, FIRST (значение столбца из первой строки результирующего набора записей), LAST(значение столбца из последней строки результирующего набора записей) и др.). Агрегатные функции используются подобно именам полей в операторе SELECT, но с одним исключением: они берут имя поля как аргумент. С функциями SUM и AVG могут использоваться только числовые поля. С функциями COUNT, MAX и MIN могут использоваться как числовые, так и символьные поля.
Синтаксис: GROUP BY < имя_столбца>
Имя столбца – имя любого столбца из любой из упомянутой в разделе FROM таблицы.
Если GROUP BY расположено после WHERE создаются группы из строк, выбранных после применения раздела WHERE.
При включении раздела GROUP BY в инструкцию SELECT список полей должен состоять из итоговых функций SQL (AVG,COUNT, MAX,MIN,SUM и др.) и из имен столбцов, указанных в разделе GROUP BY. В раздел GROUP BY должны быть включены все атрибуты, входящие в раздел SELECT.
В предложение GROUP BY могут быть указаны одновременно несколько столбцов. Группы при этом определяются слева направо. Предложение GROUP BY автоматически устанавливает сортировку по возрастанию (если надо по убыванию – задать в ORDER BY).
Создать итоговые запросы:
Вычисления средней зарплаты сотрудников по каждому из отделений компании;
SELECT STAFF.Branch_no, Avg(STAFF.Salary) AS Средняя_зарплата
FROM STAFF
GROUP BY Branch_no;
Подсчёта количества трехкомнатных квартир, предлагаемых в Витебске и Полоцке.
SELECT City, COUNT(*) AS Количество_квартир
FROM PROPERTY
WHERE (Rooms=3) AND ((City=’Витебск’) OR (City=’Полоцк’))
GROUP BY City;
Раздел HAVING задает условие отбора групп строк, которые включаются в таблицу, определяемую инструкцией SELECT.
Условия отбора применяется к столбцам, указанным в разделе GROUP BY, к столбцам итоговых функций или к выражениям, содержащим итоговые функции. Если некоторая группа не удовлетворяет условию отбора, она не попадает в набор записей.
Синтаксис: HAVING < условие_отбора>
Разница между HAVING и WHERE заключается в том, что условие отбора, заданное в разделе WHERE применяется к отдельным записям, перед их группировкой, а условие отбора раздела HAVING применяется к группам строк.
Если раздел GROUP BY находится перед HAVING, условие отбора применяется к каждой из групп, сформированных на основе совпадения значений в заданных столбцах. В случае отсутствия раздела GROUP BY условие отбора применяется ко всей таблице определенной инструкцией SELECT. Агрегатные функции могут применяться как в выражении вывода результатов строки SELECT, так и в выражении обработки сформированных групп HAVING.
Например, вывести список и номера телефонов отделений, которые предлагают более одной трехкомнатной квартиры.
SELECT PROPERTY.Branch_no, BRANCH. Btel_no
FROM BRANCH, PROPERTY
WHERE PROPERTY.Branch_no=BRANCH.Branch_no AND PROPERTY.Rooms=3
GROUP BY PROPERTY.Branch_no
HAVING COUNT(*)>1;
