- •Содержание
- •Глава 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 Создание запроса с помощью оператора select
4.3.1 Создание простых запросов
Оператор SELECT является фактически самым важным для пользователя и самым сложным оператором SQL. Он предназначен для выборки данных из таблиц, т.е. он, собственно, и реализует одно их основных назначений БД - предоставлять информацию пользователю.
Оператор SELECT всегда выполняется над некоторыми таблицами, входящими в базу данных. Результатом выполнения оператора SELECT всегда является таблица. Таким образом, по результатам действий оператор SELECT похож на операции реляционной алгебры. Любая операция реляционной алгебры может быть выражена подходящим образом сформулированным оператором SELECT. Сложность оператора SELECT определяется тем, что он содержит в себе все возможности реляционной алгебры, а также дополнительные возможности, которых в реляционной алгебре нет.
Замечание. Каждый оператор интерактивного SQL представляет собой одну команду, которая заканчивается «;». В наших примерах служебные слова SQL будем приводить прописными буквами.
Рассмотрим сначала простые конструкции оператора SELECT, постепенно усложняя его запись:
SELECT <список выбора> FROM <имя таблицы>;
Пример 4.1 Выбрать все данные из таблицы Продавцы:
SELECT snum, sname, city, comm FROM Продавцы;
Результатом работы этой команды будет вывод всей таблицы 4.2 .
Пример 4.2 Выбрать все данные из таблицы:
SELECT * FROM Продавцы;
Здесь «звездочка» (*) служит кратким обозначением всех имен полей в таблице, указанной во фразе FROM. При этом порядок вывода полей соответствует порядку, в котором эти поля определялись при создании.
Пример 4.3 Выбрать некоторые колонки из исходной таблицы (указание списка отбираемых колонок): SELECT sname, comm FROM Продавцы;
Эта команда выведет только два указанных столбца из таблицы.
Пример 4.4 Выбрать некоторые колонки из исходной таблицы (указание списка отбираемых колонок): SELECT odate, snum, onum, amt FROM Порядки;
Столбцы по этой команде будут выведены в заданном порядке.
Пример 4.5 Вывести список номеров продавцов из таблицы Порядки:
SELECT snum FROM Порядки ;
Результатом выполнения этой команды является список номеров из таблицы 4.4, в котором есть повторяющиеся записи. Для исключения дубликатов необходимо дополнить запрос ключевым словом DISTINCT (различный, различные), как показано в следующем примере.
Пример 4.6 Вывести список номеров продавцов из таблицы Порядки без повторений:
SELECT DISTINCT snum FROM Порядки;
В предыдущих примерах в операторах SELECT была реализована операция проекция. Для реализации операции выборка необходимо в конструкцию оператора добавить предложение WHERE: SELECT <список выбора> FROM <имя таблицы> WHERE <предикат>;
В синтаксисе предложения WHERE для отбора нужных строк таблицы можно использовать:
операторы сравнения: = (равно), <> (не равно), < (меньше), <= (меньше или равно), > (больше), > = (больше или равно);
логические операции: OR, NOT, AND;
операторы: IN, BETWEEN …. AND, LIKE, IS NULL.
Пример 4.7 Вывести имена и комиссионные всех продавцов в Лондоне:
SELECT sname, city FROM Продавцы WHERE city = ‘Лондон’;
Пример 4.8 Вывести все данные о заказчиках в Мехико, которые имеют оценку (рейтинг) выше 200: SELECT * FROM Заказчики WHERE city = ‘Мехико' AND rating > 200;
Будет выведена одна строка:
CNUM CNAME CITY RATING SNUM
2008 Киснерос Мехико 300 1007
Сложные логические выражения в предикате формируются с помощью скобок.
Пример 4.9 SELECT * FROM Порядки WHERE NOT ((odate = 10/03/2003 AND snum >1002) OR amt > 2000.00);
В результате выполнения этого запроса будут выведены строки:
ONUM AMT DATE SNUM CNUM
3003 767.19 10/03/2003 2001 1001
3009 1713.23 10/04/2003 2002 1003
3007 75.76 10/04/2003 2004 1002
3009 1309.95 10/06/2003 2004 1002
Сложные логические выражения можно преобразовать, используя аксиомы, называемые законами де Моргана: NOT (a AND b) ≡ NOT a OR NOT b
NOT (a OR b ≡ NOT a AND NOT b ,
где a и b – логические выражения, а символ «≡» означает «эквивалентно».
Оператор IN определяет, включено ли значение левого операнда в набор значений (список) правого операнда. Значение предиката, образованного с помощью оператора IN, равно true в том и только в том случае, когда значение левого операнда совпадает хотя бы с одним значением списка правого операнда.
Пример 4.10 Найти всех продавцов, которые живут в Барселоне или в Лондоне:
SELECT * FROM Продавцы WHERE city = 'Барселона' OR city = 'Лондон';
Имеется и более простой способ получить ту же информацию:
SELECT * FROM Продавцы WHERE city IN ( 'Барселона', 'Лондон' );
С помощью оператора BETWEEN ... AND ... (находится в интервале от ... до ...) можно отобрать строки, в которых значение какого-либо столбца находятся в заданном диапазоне. Результат «x BETWEEN y AND z» тот же самый, что результат «x >= y AND x <= z». Результат «x NOT BETWEEN y AND z» тот же самый, что результат «NOT (x BETWEEN y AND z)».
Пример 4.11 Этот запрос выбирает всех заказчиков, чьи имена попали в определенный
алфавитный диапазон:
SELECT * FROM Заказчики WHERE cname BETWEEN 'Г' AND 'Л';
Вывод для этого запроса:
CNUM CNAME CITY RATING SNUM
2002 Джованни Рим 200 1003
2004 Грасс Берлин 300 1002
2006 Клеменс Лондон 100 1001
2008 Киснерос Мехико 300 1007
Обратите внимание, что Луи отсутствует. Это происходит из-за того, что BETWEEN сравнивает строки неравной длины. Строка 'Л' более короткая, чем строка ‘Луи’, поэтому и не
выбирается. Важно помнить это когда используете оператор BETWEEN для выбора значений из алфавитных диапазонов.
Обычная форма оператора LIKE «имя_столбца» LIKE «текстовая_константа» для столбца текстового типа позволяет отыскать все значения указанного столбца, соответствующие образцу, заданному «текстовой_константой». Символы этой константы интерпретируются следующим образом:
символ _ (подчеркивание) – заменяет любой одиночный символ (для СУБД ACCESS –«?»);
символ % (процент) – заменяет любую последовательность из N символов (где N может быть нулем) (для СУБД ACCESS –«*»);
все другие символы означают просто сами себя.
Для оператора LIKE типы данных столбца левого операнда и образца должны быть типами символьных строк.
Пример 4.12 Найти всех заказчиков, чьи имена начинаются с буквы ‘К’:
SELECT * FROM Заказчики WHERE cname LIKE 'К%';
Наличие неопределенных (NULL) значений повышает гибкость обработки информации, хранящейся в БД (см. п.3.4). В нашем примере можно предположить ситуацию, что появился новый заказчик, которому еще не был назначен продавец. Вы можете ввести строку для заказчика со значением NULL в поле snum и заполнить это поле значением позже, когда продавец будет назначен. Значение « IS NULL» равно true тогда и только тогда, когда значение x не определено. Значение предиката «x NOT IS NULL» равно значению «NOT x IS NULL».
Пример 4.13 Найти все записи в таблице Заказчики с NULL значениями в snum столбце:
SELECT * FROM Заказчики WHERE snum IS NULL;
Здесь не будет никакого вывода, потому что нет значений NULL в наших типовых таблицах.