- •Базы данных
- •Лекция 1 Хранение данных Данные, информация
- •Системы хранения данных на основе файлов
- •База данных
- •Требования к субд
- •Администратор бд (абд)
- •Лекция 2 Модели данных Независимость данных
- •Модель, схема
- •Лекция 3 Ранние модели Иерархическая модель
- •Сетевая модель
- •Лекция 4 Пример базы данных, построенной на сетевой модели Постановка задачи
- •Диаграмма
- •Описание на яод
- •Лекция 5 Реляционная модель Принципы
- •Уточнения
- •Лекция 6 Методы хранения данных и доступа к ним
- •Последовательный метод
- •Прямой метод
- •Индексные методы
- •Индексно-последовательный метод
- •Индексно-произвольный метод
- •Инвертированные списки
- •Хеширование
- •Лекция 7 Реляционная алгебра: определения, изменение отношений
- •Изменение отношений во времени.
- •Лекция 8 Операции реляционной алгебры
- •Булевы операции
- •Выбор; свойства выбора
- •Проекция; свойства проекции
- •Лекция 9 Операции реляционной алгебры (продолжение) Соединение
- •Свойства соединения
- •Лекция 10 Операции реляционной алгебры (продолжение)
- •Деление
- •Постоянные отношения. Переименование атрибутов
- •Эквисоединение, естественное и -соединение
- •Реляционная алгебра. Полнота ограниченного множества операторов
- •Операторы расщепления и фактора
- •Лекция 11 Язык структурных запросов sql
- •Начальные понятия
- •Стандарт ansi
- •Типы данных
- •Интерактивный и встроенный sql
- •Синтаксис
- •Подразделы sql
- •Простейшие действия
- •Функции агрегирования
- •Группировка
- •Возможности форматирования
- •Лекция 12 Язык структурных запросов sql (продолжение) Соединение
- •Вложенные запросы
- •Связанные запросы
- •Предикаты, определенные на подзапросах
- •Объединение
- •Изменение базы данных
- •Лекция 13 Понятие о нормальных формах
- •1 Нормальная форма (1нф)
- •2 Нормальная форма (2нф)
- •3 Нормальная форма (3нф)
- •Нормальная форма Бойса-Кодда (нфбк)
- •4 Нормальная форма (4нф)
- •5 Нормальная форма (5нф) – проекция/соединение
- •Лекция 13 Проектирование данных Процессы проектирования
- •Концептуальное проектирование
- •Логическое проектирование
- •Средства создания модели
- •Лекция 14 Функциональные зависимости
- •Аксиомы вывода
- •Ориентированный ациклический граф вывода
- •Определение реляционной базы данных
- •Представление множества функциональных зависимостей
- •Лекция 15 Покрытия функциональных зависимостей
- •Лемма об эквивалентности фз
- •Неизбыточные покрытия
- •Посторонние атрибуты
- •Канонические покрытия
- •Структура неизбыточных покрытий
- •Оптимальные покрытия
- •3 Нормальная форма
- •Нормализация через декомпозицию и посредством синтеза
- •Нормальная форма Бойса-Кодда
- •Литература
Типы данных
Типы данных в различных версиях SQL могут заметно различаться, что связано с набором типов данных, принятом в конкретной СУБД. В стандарте ANSI рекомендуется использовать символьные (например, CHAR, VARCHAR) и числовые (INT, DEC) типы данных. В СУБД FoxPro используется широкий спектр типов данных (различные формы символьных числовых типов, типы даты и времени и т.п.). Все они отражены в соответствующей реализации SQL.
Интерактивный и встроенный sql
В стандарте предусмотрено существование двух форм языка: интерактивной и встроенной. Первая форма предполагает работу непосредственно в среде SQL и не требует наличия какой-либо другой программной среды. Считается, что запросы формулируются в режиме диалога и выполняются интерпретатором языка. Во втором случае язык каким-то способом встраивается в другую языковую систему и общается с пользователем через нее. То есть, интерфейс обеспечивает среда другого языка, а SQL выполняет запросы, поступающие из программы. В чистом виде это реализовано, например, в среде Delphi, а FoxPro даже включает операторы SQL в базовый язык.
Синтаксис
Кратко и неформально структуру языка можно представить следующим образом. Язык состоит из команд, оканчивающихся точкой с запятой. Команды состоят из последовательности фраз, разделенных пробелами. Фразы состоят из ключевого слова, за которым через пробелы следуют аргументы.
Текст ::= команда; ... команда;
Команда ::= фраза ... фраза
Фраза ::= Ключевое_слово аргумент аргумент ... аргумент
Подразделы sql
Согласно рекомендации ANSI, SQL состоит из следующих разделов: Язык Определения Данных (ЯОД или DDL), Язык Манипулирования Данными (ЯМД или DML), Язык Управления Данными (ЯМД или DCL). Последний раздел может включаться в ЯМД. Первый раздел служит для определения схем данных (таблиц), второй – для манипуляций данными, которые выполняются через запросы к базе данных.
Простейшие действия
Определение таблиц – это разовая работа, изменение структуры – эпизодическая, а манипулирование данными – деятельность постоянная. И если изменение содержания базы данных большой сложности не представляет, то выборка необходимой информации может быть довольно замысловатой. Именно на запросы расходуется наибольшее время работы с БД. Поэтому основу языка SQL составляют запросы к базе данных. Запросы определяются командой Select.
Простейшие запросы – отображение содержимого всей таблицы, проекция, перестановка атрибутов, выбор. Команда для них имеет следующий формат:
Select [Distinct] <список атрибутов> From <таблица> [Where <условие>];
Здесь <список атрибутов> – схема (перечень атрибутов) отношения, которое будет результатом выполнения команды. В список может включаться символ «*», который обозначает всю схему исходной таблицы с именем <таблица>. В результирующую выборку попадают атрибуты лишь из тех строк, для которых <условие> истинно. Фраза Where не обязательная, если она отсутствует, в выборку попадают атрибуты из всех строк. Заметим, что в результирующей выборке могут возникнуть повторяющиеся строки, если список атрибутов не содержит ключ. Для удаления дублирующихся строк служит вариант Distinct.
Пример
Выбрать содержимое всей таблицы продавцов (представлены два варианта):
Select * From Продавцы;
Select ном_прод, имя_прод, город, комиссия From Продавцы;
Получить проекцию таблицы продавцов на атрибуты имя_прод, город с удалением возможных дублирующихся строк:
Select Distinct имя_прод, город From Продавцы;
Получить проекцию таблицы заказов на подсхему (дата, ном_пок, ном_зак), с другим, по сравнению с исходной схемой, порядком атрибутов:
Select дата, ном_пок, ном_зак From Заказы;
Выбрать продавцов из Москвы:
Select имя_прод, город From Продавцы Where город=’Москва’;
Конец примера
Предикат, определяющий условия выбора, может содержать обычные операции отношения (<, <=, =, <>, >=, >), операцию between … and (истина, когда первый операнд не меньше второго и не больше третьего) и логические операции (and, or, not). Для задания множества служат круглые скобки, ограничивающие его определение. Множество может определяться как простым перечислением элементов, так и запросом. Последний вариант будет рассматриваться позже. Для определения принадлежности элемента множеству служит операция in. Для символьных значений допускается выбор по маске. Символ «%» маскирует любую цепочку в искомой строке, символ «_» – лишь один символ, фраза like определяет маску.
Пример
Выбрать продавцов из Москвы, у которых комиссионные меньше 0,1:
Select Имя_прод, Комиссия From Продавцы
Where Город=’Москва’ and Комиссия<0,1;
Выбрать продавцов как из Москвы, так и из Тулы (два варианта):
Select * From Продавцы
Where Город=’Москва’ or Город=’Тула’;
Select * From Продавцы
Where Город in (’Москва’, ’Тула’);
Выбрать продавцов, у которых комиссионные в интервале от 0,1 до 0,12, причем, в первом случае интервалы включаются, во втором – нет:
Select * From Продавцы
Where Комиссия between 0.1 and 0.12;
Select * From Продавцы
Where Комиссия between 0.1 and 0.12 and not Комиссия in (0.1, 0.12);
Выбрать продавцов, у которых первая или вторая буква фамилии – «М»:
Select * From Продавцы
Where Имя_прод like ‘М%’ or Имя_прод like ‘_м%’;
Конец примера
Согласно требованиям к реляционным базам данных, атрибуты должны иметь возможность принимать пустое значение. В SQL оно обозначается как null. Пустое значение может принимать поле любого типа. Для проверки атрибута на пустоту служит операция is null. Сравнение с пустым значением неопределенно (unknown): a=null. Неопределенное значение возникает и в результате проверки предиката принадлежности: a in (null). Обычно неопределенное значение интерпретируется как ложь, но не всегда: not ложь – истина, а not unknown – unknown.
Использование not в SQL более свободно, чем в обычных языках программирования: допустимо и (not a is null), и (a is not null), и (not a in (…)), и (a not in (…)).