- •Содержание
- •Глава 1 Концепция баз данных 6
- •Глава 2 Модели данных 12
- •Глава 3 Реляционная модель данных 24
- •Глава 4 Элементы языка sql 42
- •Глава 5 Проектирование баз данных 66
- •Глава 6 Функции субд и системы обработки транзакций 81
- •Глава 7 Технологии, модели и архитектура систем обработки данных 88
- •Глава 1 Концепция баз данных
- •1.1 Данные и эвм
- •1.2 Поколения субд и направления исследований
- •1.3 Терминология в субд
- •1.4 Вопросы для самоконтроля к главе 1
- •Глава 2 Модели данных
- •2.1. Классификация моделей данных
- •2.2 Основные особенности систем, основанных на инвертированных списках
- •2.2.1 Структуры данных
- •2.2.2 Манипулирование данными
- •2.2.3 Ограничения целостности
- •2.3 Иерархические модели
- •2.3.1. Иерархические структуры данных
- •2.3.2 Манипулирование данными
- •2.3.3 Ограничения целостности
- •2.4 Сетевые модели
- •2.4.1 Сетевые структуры данных
- •2.4.2 Манипулирование данными
- •2.4.3 Ограничения целостности
- •2.5 Физические модели организации баз данных
- •Файловые структуры, используемые для хранения данных в бд
- •Модели страничной организации данных в современных бд
- •Этапы доступа к бд
- •Вопросы и упражнения для самоконтроля к главе 2
- •Глава 3 Реляционная модель данных
- •3.1 Базовые понятия реляционных баз данных
- •3.1.1. Тип данных
- •3.1.2. Домен
- •3.1.3 Схема отношения, схема базы данных
- •3.1.4 Кортеж, отношение, ключи
- •3.1.5 Связи в реляционных базах данных
- •3.2 Фундаментальные свойства отношений
- •3.2.1 Отсутствие кортежей-дубликатов
- •3.2.2 Отсутствие упорядоченности кортежей
- •3.2.3 Отсутствие упорядоченности атрибутов
- •3.2.4 Атомарность значений атрибутов
- •3.3. Характеристика реляционной модели данных
- •3.4 Трехзначная логика (3vl)
- •3.5 Реляционная алгебра
- •Эквисоединение. Наиболее важным частным случаем -соединения является случай, когда есть просто равенство. Синтаксис эквисоединения:
- •3.6 Особенности операций реляционной алгебры
- •Реляционное исчисление
- •Вопросы и упражнения для самоконтроля к главе 3
- •Глава 4 Элементы языка sql
- •4.1 История языка sql
- •4.2 Структура языка sql
- •Ddl (Data Definition Language) - операторы определения объектов базы данных:
- •Dml (Data Manipulation Language) - операторы манипулирования данными:
- •Dcl (Data Control Language) - операторы контроля данных, защиты и управления данными:
- •4.3 Создание запроса с помощью оператора select
- •4.3.1 Создание простых запросов
- •4.3.2. Агрегирование данных в запросах
- •4.3.3 Формирование запросов на основе соединения таблиц
- •4.3.4 Формирование структур вложенных запросов
- •Простые подзапросы
- •4.3.4.2 Соотнесенные (коррелированные) подзапросы
- •Запросы с использованием кванторов
- •4.3.5 Объединение нескольких запросов в один
- •4.3.6 Синтаксис оператора select
- •4.4 Операторы манипулирования данных
- •4.4.1 Оператор удаления данных delete
- •4.4.2 Оператор вставки данных insert
- •4.4.3 Оператор обновления данных update
- •Операторы определения объектов базы данных
- •4.5.1 Операторы определения таблицы
- •4.5.2 Оператор определения представлений create view
- •Операторы контроля данных, защиты и управления данными
- •4.6.1 Операторы управления привилегиями
- •4.6.2 Операторы управления транзакциями
- •4.6.3 Проблемы параллельной работы транзакций
- •Вопросы и упражнения для самоконтроля к главе 4
- •Глава 5 Проектирование баз данных
- •5.1 Проектирование реляционных бд с использованием принципов нормализации
- •Проектирование реляционных бд с использованием семантических моделей
- •5.2.1 Применение семантических моделей при проектировании
- •5.2.2. Основные понятия модели Entity-Relationship
- •5.2.3 Пример разработки простой er-модели
- •Практические рекомендации по проектированию бд
- •Вопросы и упражнения для самоконтроля к главе 5
- •Глава 6 Функции субд и системы обработки транзакций
- •6.1 Основные функции субд
- •1.Непосредственное управление данными во внешней памяти
- •2. Управление буферами оперативной памяти
- •3. Управление транзакциями
- •4. Журнализация
- •5. Поддержка языков бд
- •Системы обработки транзакций
- •6.2.1 Oltp-системы
- •6.2.2 Olap -системы
- •6.2.3 Мониторы транзакций
- •Архитектура субд
- •6.4 Пользователи бд
- •6.4 Вопросы и упражнения для самоконтроля по главе 6
- •Глава 7 Технологии, модели и архитектура систем обработки данных
- •7.1 Технологии и модели архитектуры «клиент-сервер»
- •7.2 Распределенная обработка данных
- •Аспекты сетевого взаимодействия
- •Технология распределенной бд (технология star)
- •Технология тиражирования данных
- •7.3 Концепция активного сервера в модели dbs
- •7.4 Вопросы и упражнения для самоконтроля к главе 7
- •Литература
4.3.2. Агрегирование данных в запросах
В SQL существует ряд специальных стандартных функций (SQL-функций). Кроме специального случая COUNT(*) каждая из этих функций оперирует совокупностью значений столбца некоторой таблицы и создает единственное значение, определяемое так:
COUNT - число значений в столбце;
SUM - сумма значений в столбце;
AVG - среднее значение в столбце;
MAX - самое большое значение в столбце;
MIN - самое малое значение в столбце.
Для функций SUM и AVG рассматриваемый столбец должен содержать числовые значения.
Замечание. Следует отметить, что здесь «столбец» - это столбец виртуальной таблицы (например, представления), в которой могут содержаться данные не только из столбца базовой таблицы, но и данные, полученные путем функционального преобразования и (или) связывания символами арифметических операций значений из одного или нескольких столбцов. При этом выражение, определяющее столбец такой таблицы, может быть сколь угодно сложным, но не должно содержать SQL-функций (вложенность SQL-функций не допускается). Однако из SQL-функций можно составлять любые выражения.
Аргументу всех функций, кроме COUNT(*), может предшествовать ключевое слово DISTINCT (различный), указывающее, что избыточные дублирующие значения должны быть исключены перед тем, как будет применяться функция. Специальная же функция COUNT(*) служит для подсчета всех без исключения строк в таблице (включая дубликаты).
Пример 4.14 Чтобы найти сумму всех покупок, необходимо ввести следующий запрос:
SELECT SUM(amt) FROM Порядки;
В результате будет выведено значение 26658.4 без подписи поля.
Пример 4.15 Подсчитать число строк в таблице Заказчики:
SELECT COUNT (*) FROM Заказчики;
В результате будет выведено значение 7.
Фраза GROUP BY (группировать по …) инициирует перекомпоновку указанной в предложении FROM таблицы по группам, каждая из которых имеет одинаковые значения в столбце, заданном в столбце GROUP BY, затем к каждой группе применяется заданная функция и оператор SELECT выводит значения для каждой группы.
Пример 4.16 Найти наибольшую сумму приобретений, полученную каждым продавцом:
SELECT snum, MAX (amt) FROM Порядки GROUP BY snum;
Вывод для этого запроса:
snum
------ --------
1001 767.19
1002 1713.23
1003 75.75
1014 1309.95
1007 1098.16
Замечание. В список отбираемых полей оператора SELECT, содержащего раздел GROUP BY, можно включать только агрегатные функции и поля, которые входят в условие группировки. Поэтому команда SELECT onum, snum, MAX (amt) FROM Порядки GROUP BY snum; не будет выполнена и появится сообщение о синтаксической ошибке. Причина ошибки в том, что в список отбираемых полей включено поле onum, которое не входит в раздел GROUP BY.
Можно также использовать GROUP BY с несколькими полями, задавая уровни группировки.
Пример 4.17 Вывести наибольшую сумму приобретений, получаемую каждым продавцом каж-
дый день: SELECT snum, odate, MAX (amt) FROM Порядки GROUP BY snum, odate;
Вывод для этого запроса:
snum odate
------ ---------- --------
1001 10/03/2003 767.19
1001 10/05/2003 4723.00
1001 10/06/2003 9891.88
1002 10/03/2003 5160.45
1002 10/04/2003 75.75
1002 10/06/2003 1309.95
1003 10/04/2003 1713.23
1014 10/03/2003 1900.10
1007 10/03/2003 1098.16
Фраза HAVING играет такую же роль для групп, что и фраза WHERE для строк: она используется для исключения групп, точно так же, как WHERE используется для исключения строк. Эта фраза включается в предложение лишь при наличии предложения GROUP BY, а выражение в предложении HAVING должно принимать единственное значение для группы, т.е. использоваться агрегатная функция.
Пример 4.18 Предположим, что в предыдущем примере, необходимо увидеть только максимальные суммы приобретений, значение которых выше $3000.00:
SELECT snum, odate, MAX (amt) FROM Порядки GROUP BY snum, odate
HAVING MAX (amt) > 3000.00;
Замечание. В одном запросе могут встретиться как условия отбора строк в разделе WHERE, так и условия отбора групп в разделе HAVING. Условия отбора групп нельзя перенести из раздела HAVING в раздел WHERE. Аналогично и условия отбора строк нельзя перенести из раздела WHERE в раздел HAVING, за исключением условий, включающих поля из списка группировки GROUP BY. Добавим в запрос предыдущего примера раздел WHERE:
SELECT snum, MAX (amt) FROM Порядки WHERE snum IN (1002,1007) GROUP BY snum HAVING MAX (amt) > 3000.00;
Эта команда будет выполняться в следующей последовательности:
отбираются строки, удовлетворяющие предикату в предложении WHERE;
выявляются группы, заданные предложением GROUP BY;
внутри каждой группы вычисляется значение функции (MAX (amt) );
исключаются из вывода группы, не удовлетворяющие условию, указанному в предложении HAVING.
В список вывода оператора SELECT можно добавить любые строковые константы и вычисляемые выражения.
Пример 4.19 Представить комиссионные продавцов в процентном отношении (а не в виде десятичных чисел): SELECT snum, sname, city, comm * 100, ' % ' FROM Продавцы;
Таблицы - это неупорядоченные наборы данных, и выводимые данные по запросу не обязательно появляются в какой-то определенной последовательности. SQL использует предложение ORDER BY, чтобы упорядочивать вывод. Многочисленные столбцы упорядочиваются один внутри другого, также как с GROUP BY, и можно определять сортировку по возрастанию (ASC) или убыванию (DESC ) для каждого столбца. По умолчанию установлена сортировка по возрастанию.
Пример 4.20 Вывести таблицу Порядки, отсортированную по номеру заказчика в порядке убывания: SELECT * FROM Порядки ORDER BY cnum DESC;
Предложение ORDER BY может использоваться совместно с GROUP BY для упорядочивания групп. Структура запроса в этом случае имеет вид:
SELECT <список выбора> FROM <имя таблицы> [WHERE <предикат>] [GROUP BY <выражение>] [HAVING <предикат>] [ORDER BY <поля>] ;
Пример 4.21
SELECT snum, odate, MAX (amt) FROM Порядки GROUP BY snum, odate ORDER BY snum ;