- •1 Основные понятия и определения
- •1.1Информационные системы и банки данных
- •1.2Назначение и основные компоненты банка данных
- •1.3Трех уровневая архитектура абстракций базы данных.
- •1.4Физическая и логическая независимость данных
- •1.5Администратор базы данных
- •1.6Системы управления базами данных
- •1.7Схема обмена данными при работе с базой данных
- •1.8Локальные информационные системы
- •1.9Информационные системы в сетях
- •2Модели данных концептуального уровня
- •2.1Иерархическая модель данных
- •2.2Сетевая модель
- •2.3Реляционная модель
- •2.4Постреляционная модель
- •2.5Многомерная модель
- •2.6Объектно-ориентированная модель
- •3Физические модели баз данных
- •3.1Файловые структуры, используемые в базах данных
- •3.2 Хешированные файлы
- •3.2.1Стратегия разрешения коллизий с областью переполнения
- •3.2.2Организация стратегии свободного замещения
- •3.3Индексные файлы
- •3.3.1Файлы с плотным индексом, или индексно-прямые файлы
- •3.3.2Файлы с неплотным индексом, или индексно-последовательные файлы
- •3.3.3Организация индексов в виде b-tree (в-деревьев)
- •3.4Моделирование отношений «один-ко-многим» на файловых структурах
- •3.5Инвертированные списки
- •3.6Модели бесфайловой организации данных
- •4Реляционная модель данных
- •4.1Основные определения
- •4.2Соглашения об отношениях в реляционных системах
- •4.3Классы отношений
- •4.3.1Классы отношений с точки зрения способов создания и хранения
- •4.3.2Классификация отношений с точки зрения их содержания
- •4.4Операции реляционной алгебры
- •4.4.1Основные понятия
- •4.4.2Базовые теоретико-множественные операции
- •4.4.3Специальные операции реляционной алгебры
- •4.4.4Связи между отношениями (таблицами)
- •4.5Реляционное исчисление
- •4.6Язык запросов по образцу qbe
- •4.7Структурированный язык запросов sql
- •4.7.1История развития sql
- •4.7.2Общая характеристика языка
- •4.7.3Структура sql
- •4.7.4Оператор выбора select
- •4.7.5Применение агрегатных функций и группировки
- •4.7.6Раздел order by и ключевое слово top
- •4.7.7Вложенные запросы
- •4.7.8Внутренние и внешние объединения
- •4.7.9Перекрестные запросы
- •4.7.10Операторы манипулирования данными
- •4.7.11Запросы на создание таблиц
- •4.7.12Использование языка определения данных
- •4.8Правила Кодда (требования к реляционным бд)
- •5Проектирование баз данных
- •5.1Этапы проектирования бд
- •5.2Проблемы проектирования реляционных баз данных
- •5.3Нормализация отношений
- •5.4Метод сущность-связь
- •5.5Средства автоматизации проектирования
- •5.5.1Основные определения
- •5.5.2Модели жизненного цикла
- •5.5.3Модели структурного проектирования
- •5.5.4Объектно-ориентированные модели
- •5.5.5 Классификация case-средств
- •6Защита информации в базах данных
- •6.1Общие подходы к обеспечению безопасности данных
- •6.2Назначение и проверка полномочий, проверка подлинности
- •6.3Средства защиты базы данных
- •7Базы данных в сетях
- •7.1Организация базы данных в локальной сети
- •7.2Модели архитектуры клиент-сервер
- •7.3Управление распределенными данными
- •8История развития баз данных
4.7.3Структура sql
В отличие от реляционной алгебры, где были представлены только операции запросов к БД, SQL является полным языком. Операторы языка SQL можно условно разделить на два подъязыка: язык определения данных (Data Definition Language – DDL) и язык манипулирования данными (Data Manipulation Language – DML). Основные операторы языка SQL представлены в табл.3.1. Кроме того, язык содержит операторы управления транзакциями, администрирования данных и управления курсором.
Таблица 3.1
Операторы языка SQL
Вид |
Оператор |
Назначение |
Действие |
DDL |
CREATE TABLE |
Создание таблицы |
Создание новой таблицы в БД |
DROP TABLE |
Удаление таблицы |
Удаление таблицы из БД |
|
|
ALTER TABLE |
Изменение структуры таблицы |
Изменение структуры существующей таблицы или ограничений целостности, задаваемые для данной таблицы |
|
CREATE VIEW |
Создание представления |
Создание виртуальной таблицы, соответствующей некоторому SQL-запросу |
DROP VIEW |
Удаление представления |
Удаление ранее созданного представления |
|
ALTER VIEW |
Изменение представления |
Изменение ранее созданного представления |
|
|
CREATE INDEX |
Создание индекса |
Создание индекса для некоторой таблицы для обеспечения быстрого доступа по атрибутам, входящим в индекс |
DROP INDEX |
Удаление индекса |
Удаление ранее созданного индекса |
|
DML |
SELECT |
Выборка записей |
Формирование результирующего отношения, соответствующего запросу (оператор, заменяющий все операторы реляционной алгебры) |
UPDATE |
Изменение записей |
Обновление значения одного или нескольких столбцов в одной или нескольких строках, соответствующих условиям фильтрации |
|
|
INSERT |
Вставка новых записей |
Вставка одной строки в базовую таблицу. Допустимы модификации оператора, при которых сразу несколько строк могут быть перенесены из одной таблицы или запроса в базовую таблицу |
|
DELETE |
Удаление записей |
Удаление одной или нескольких строк, соответствующих условиям фильтрации, из базовой таблицы. Применение оператора согласуется с принципами поддержки целостности, поэтому этот оператор не всегда может быть выполнен корректно, даже если синтаксически он записан правильно |
4.7.4Оператор выбора select
Язык запросов в SQL состоит из единственного оператора SELECT.
Синтаксис оператора SELECT имеет следующий вид:
SELECT [ ALL| DISTINCT] <Список полей>|*
FROM <Список таблиц>
[WHERE <Предикат-условие выборки
или соединения>]
[GROUP BY <Список полей результата>]
[HAVING <Предикат-условие для группы>]
[ORDER BY <Список полей, по которым
упорядочить вывод>];
SELECT – ключевое слово, которое сообщает СУБД, что эта команда – запрос. Все запросы начинаются этим словом с последующим пробелом. За ним может следовать способ выборки.
Здесь ключевое слово ALL означает, что в результирующий набор строк включаются все строки, удовлетворяющие условиям запроса. Значит в результирующий набор могут попасть одинаковые строки. Это нарушение принципов теории отношений (в отличие от реляционной алгебры, где по умолчанию предполагается отсутствие дубликатов в каждом результирующем отношении).
Ключевое слово DISTINCT означает, что в результирующий набор включаются только различные строки, то есть дубликаты строк результата не включаются в набор.
Список полей – это список перечисленных через запятую столбцов, которые выбираются запросом из таблиц.
Символ * (звездочка) означает, что в результирующий набор включаются все столбцы из исходных таблиц запроса.
В разделе FROM задается перечень исходных отношений (таблиц) запроса. В случае, если указано более одного имени таблицы, неявно подразумевается, что над перечисленными таблицами осуществляется операция декартова произведения.
Разделы SELECT и FROM являются обязательными, все другие разделы являются необязательными.
Примеры.
Выражение
SELECT * FROM СТУДЕНТЫ ;
означает выбор всех полей из таблицы СТУДЕНТЫ.
Выражение
SELECT NOM_ZACH, FIO FROM СТУДЕНТЫ ;
означает выбор двух полей из таблицы СТУДЕНТЫ.
Выражение
SELECT * FROM СТУДЕНТЫ, ЭКЗАМЕН;
соответствует декартову произведению таблиц СТУДЕНТЫ и ЭКЗАМЕН.
Выражение
SELECT
СТУДЕНТЫ.NOM_ZACH, ЭКЗАМЕН.OCENKA
FROM СТУДЕНТЫ, ЭКЗАМЕН;
соответствует проекции декартова произведения двух таблиц на два столбца NOM_ZACH из таблицы СТУДЕНТЫ и OCENKA из таблицы ЭКЗАМЕН, при этом дубликаты всех строк сохранены, в отличие от данной операции в реляционной алгебре, где по умолчанию все дубликаты кортежей уничтожаются.
В разделе WHERE задаются условия отбора строк результата или условия соединения кортежей исходных таблиц, подобно операции условного соединения в реляционной алгебре.
В выражении условий раздела WHERE могут быть использованы следующие предикаты:
Предикаты сравнения (=, <>, >, >=, <, <=), которые имеют традиционный смысл.
Пример 1. Выбрать из таблицы Продажа все поля для записей, где поле Количество больше 10:
Select * from Продажа where Количество > 10;
Пример 2. Выбрать из таблицы Экзамен все поля для записей, где оценка 5:
Select * from Экзамен where Оценка = 5;
Предикат Between A and B – принимает значения между А и В. Предикат истинен, когда сравниваемое значение попадает в заданный диапазон, включая границы диапазона. Одновременно в стандарте задан и противоположный предикат Not Between A and B, который истинен тогда, когда сравниваемое значение не попадает в заданный интервал, включая его границы.
Пример 1. Выбрать из таблицы Продажа все поля для записей, где поле Количество попадает в интервал от 10 до 50:
Select * from Продажа where Количество between 10 and 50;
Пример 2. Выбрать из таблицы Продажа все поля для записей, где поле Дата продажи попадает в интервал от 1.01.06 до 31.01.06:
Select * from Продажа where [Дата продажи] between #01/01/06# and #31/01/06#;
Предикат вхождения в множество IN (множество) истинен тогда, когда сравниваемое значение входит в множество заданных значений. При этом множество значений может быть задано простым перечислением или встроенным подзапросом. Одновременно существует противоположный предикат NOT IN (множество), который истинен тогда, когда сравниваемое значение не входит в заданное множество.
Пример 1. Выбрать из таблицы Группы все поля для записей, где поле Шифр группы имеет значения АИ51, АИ52, АИ53:
Select * from Группы where [Шифр группы] in (“АИ51”, “АИ52”, “АИ53”);
Пример 2. Выбрать из таблицы Экзамен все поля для записей, где поле Оценка принимает значения 4 или 5:
Select * from Экзамен where Оценка in (4, 5);
Предикаты сравнения с образцом LIKE и NOT LIKE. Предикат LIKE требует задания шаблона, с которым сравнивается заданное значение, предикат истинен, если сравниваемое значение соответствует шаблону, и ложен в противном случае. Предикат NOT LIKE имеет противоположный смысл. Шаблон может содержать % (* для Access) для обозначения любого числа любых символов; _ (? для Access) для обозначения любого одного символа.
Пример. Выбрать из таблицы Студенты все поля для записей, где поле Фамилия начинается с буквы «С» или «М»:
Для СУБД Access
Select * from Студенты
Where Фамилия = like “С*” or Фамилия = like “М*”;
Для других СУБД
Select * from Студенты
Where Фамилия = like “С%” or Фамилия = like “М%”;
Предикат сравнения с неопределенным значением IS NULL. Для выявления равенства значения некоторого атрибута неопределенному значению применяют специальные стандартные предикаты:
<имя атрибута> IS NULL и <имя атрибута> IS NOT NULL
Пример. Выбрать из таблицы Сотрудники все поля для записей, где поле Домашний телефон не пусто:
Select * from Сотрудники where [Домашний телефон] is not null;
Предикат существования EXIST и не существования NOT EXIST. Применяется во вложенных запросах для определения непустого или пустого множества, являющегося результатом выборки.
В условиях поиска могут быть использованы все рассмотренные предикаты.
Рассмотрим базу данных, которая моделирует сдачу сессии в некотором учебном заведении. Пусть она состоит из трех отношений R1, R2, R3, представленных таблицами R1, R2, R3 соответственно.
R1 = (ФИО, Дисциплина, Оценка);
R2 = (ФИО, Группа);
R3 = (Группа, Дисциплина).
R1 |
||
ФИО |
Дисциплина |
Оценка |
Петров Ф.И. |
Базы данных |
5 |
Сидоров К.А. |
Базы данных |
4 |
Миронов А.В. |
Базы данных |
2 |
Петров Ф.И. |
Моделирование |
5 |
Сидоров К.А. |
Моделирование |
4 |
Миронов А.В. |
Моделирование |
Null |
Трофимов П.А. |
Сети ЭВМ |
4 |
Иванова Е.А. |
Сети ЭВМ |
5 |
Уткина Н.В. |
Сети ЭВМ |
5 |
R2 |
|
ФИО |
Группа |
Петров Ф.И. |
АИ21 |
Сидоров К.А. |
АИ21 |
Миронов А.В. |
АИ21 |
Трофимов П.А. |
АИ22 |
Иванова Е.А. |
АИ22 |
Уткина Н.В. |
АИ22 |
R3 |
|
Группа |
Дисциплина |
АИ21 |
Базы данных |
АИ21 |
Моделирование |
АИ22 |
Сети ЭВМ |
Приведем несколько примеров использования оператора SELECT.
Вывести список всех групп (без повторений), где должны пройти экзамены.
SELECT DISTINCT Группа FROM R3;
Результат:
Группа |
АИ21 |
АИ22 |
Вывести список студентов, которые сдали экзамен по дисциплине «Базы данных» на «отлично».
SELECT ФИО FROM R1
WHERE Дисциплина = «Базы данных» AND Оценка = 5;
Результат:
ФИО |
Петров Ф.И. |
Найти студентов, пришедших на экзамен, но не сдавших его с указанием названия дисциплины. Оператор SELECT будет выглядеть следующим образом:
SELECT ФИО, Дисциплина
FROM R1
WHERE Оценка IS NULL;
Результат:
ФИО |
Дисциплина |
Миронов А.В. |
Моделирование |
Вывести список всех студентов, которым надо сдавать экзамены с указанием названий дисциплин, по которым должны проводиться эти экзамены.
SELECT ФИО, Дисциплина
FROM R2, R3
WHERE R2.Группа = R3.Группа;
Здесь WHERE задает условие соединения отношений R2 и R3, при отсутствии условий соединения результат будет эквивалентен декартову произведению, и в этом случае каждому студенту были бы приписаны все дисциплины из отношения R3, а не те, которые должна сдавать каждая группа.
Результат:
ФИО |
Дисциплина |
Петров Ф.И. |
Базы данных |
Сидоров К.А. |
Базы данных |
Миронов А.В. |
Базы данных |
Петров Ф.И. |
Моделирование |
Сидоров К.А. |
Моделирование |
Миронов А.В. |
Моделирование |
Трофимов П.А. |
Сети ЭВМ |
Иванова Е.А. |
Сети ЭВМ |
Уткина Н.В. |
Сети ЭВМ |
Оператор Select может содержать вычисляемые поля. Для вычисляемого поля можно задать имя после AS.
Пример 1. Вывести все поля из таблицы Продажа и добавить вычисляемое поле Стоимость покупки:
Select *, [Цена за единицу] * [Количество] as [Стоимость покупки] from Продажа;
Пример 2. Даны две таблицы Товары (Код, Название, Розничная цена), Продажа (Чек, Код, Дата продажи, Количество). Выбрать поля Название и Розничная цена из таблицы Товары и поля Чек, Дата продажи и Количество из таблицы Продажа. Добавить вычисляемое поле Стоимость покупки.
Select Товары.Название, Товары.[Розничная цена], Продажа.Чек, Продажа.[Дата продажи], Продажа.Количество, Товары.[Розничная цена] * Продажа.Количество as [Стоимость покупки]
from Товары, Продажа
where Товары.Код = Продажа.Код;
При выборе полей из разных таблиц необходимо:
указывать имя таблицы, затем ставить точку и указывать имя поля;
в where указывать условие соединения двух таблиц (в примере – это равенство полей Код из двух таблиц).
Пример 3. Даны две таблицы Knigi (Shifr, Avtor, Nazv, Cena) и Postavka (Nomer_posr, Shifr, Data_post, Kol). Выбрать все поля из двух таблиц и добавить вычисляемое поле Stoim_post (стоимость поставки).
Select K.*, P.*, K.Cena * P.Kol as Stoim_post
From Knigi K, Postavka P
Where K.Shifr = P.Shifr;
В данном примере К и Р – это алиасные (вторые) имена таблиц Knigi и Postavka соответственно.
В разделе GROUP BY задается список полей группировки. GROUP BY группирует записи данных и объединяет в одну запись все записи данных, которые содержат идентичные значения в указанном поле (или полях). WHERE определяет, какие записи должны участвовать в группировании, т.е. фильтрует до группирования.
В разделе HAVING задаются предикаты-условия, накладываемые на каждую группу. HAVING используется для фильтрации записей, полученных в результате группировки. WHERE определяет, какие записи должны участвовать в группировании, т.е. фильтрует до группирования. HAVING определяет, какие из получившихся в результате группировки записей будут включены в результирующую выборку, т.е. фильтрует записи после группирования.
В части ORDER BY задается список полей упорядочения результата, то есть список полей, который определяет порядок сортировки в результирующем отношении. Например, если первым полем списка будет указан Шифр группы, а вторым Фамилия, то в результирующем отношении записи сначала будут расположены в порядке возрастания шифра группы, а затем в рамках одной группы записи будут отсортированы по фамилии в алфавитном порядке.
