- •Введение
- •Глава 1. Проектирование баз данных
- •1.1. История развития баз данных и субд
- •1.2. Введение в субд
- •1.2.1. Основные термины, понятия и определения
- •1.2.2. Классификация субд
- •1) Сетевые, корпоративные, распределенные, клиент-серверные, полнофункциональные, масштабируемые, “большие” субд.
- •2) Локальные, персональные, настольные, файл-серверные, “малые” субд.
- •1.3.1. Типы связей между объектами
- •1.3. Модели данных
- •1.3.2. Формы записи инфологической (концептуальной) модели
- •1.3.3. Уровни представления и независимости данных
- •1.3.4. Порядок взаимодействия пользователя, субд и ос
- •1.3.5. Поддержка целостности базы данных
- •1.3.6. Иерархическая модель
- •1.3.7. Сетевая модель
- •1.3.8. Реляционная модель
- •1.3.8.1. Отношения
- •1.3.8.2. Теоретико-множественные операции с отношениями
- •1.3.8.3. Правила Кодда
- •1.3.8.4. Индексирование таблиц
- •1.3.8.5. Связывание таблиц
- •1.3.9. Постреляционная модель
- •1.3.10. Многомерная модель
- •1.3.11. Объектно‑ориентированная модель
- •1.4. Модели использования баз данных в сети
- •1.4.1. Сеть
- •1.4.2. Модели использования баз данных
- •1.4.2.1. Локальная однопользовательская модель
- •1.4.2.2. Файл-серверная модель
- •1.4.2.3. Клиент-серверная модель
- •В моделях «клиент–сервер»
- •1.4.2.4. Модель удаленного доступа (rda)
- •1.4.2.5. Модель сервера данных
- •1.4.2.6. Трехзвенная распределенная модель
- •1.4.2.7. Модели серверов баз данных
- •1.4.2.8. Клиент-Интернет
- •1.4.2.9. ИнтерфейсOdbc
- •1.4.3. Мониторы обработки транзакций (tpm)
- •1.4.4. Децентрализованное управление базами данных
- •1.4.5. Таблицы в локальных сетях
- •1.5. Проектирование баз данных
- •1.5.1. Принципы и этапы проектирования и создания баз данных
- •1.4.Определение доменов атрибутов.
- •1.5. Определение первичных и вторичных ключей.
- •1.6. Определение суперклассов и подклассов для типов сущностей.
- •1.7. Создание er‑диаграмм для отдельных пользователей.
- •2.6. Создание er‑диаграмм для отдельных пользователей.
- •3.4. Создание er‑диаграммы глобальной логической модели.
- •4. Создание глобальной логической модели в среде целевой субд.
- •6. Разработка механизма защиты.
- •1.5.3. Правила формирования взаимосвязанных таблиц
- •1.5.4. Модели жизненного цикла и проектирование баз данных
- •1.5.4.1. Модели жизненного цикла
- •1.5.4.2. Обследование, системный анализ и постановка задачи
- •1.5.4.3. Инфологическое проектирование
- •1.5.4.4. Датологическое проектирование
- •1.5.4.5. Проектирование физической модели
- •1.5.4.6. Реализация, интеграция и внедрение
- •1.5.5. Выбор субд
- •1.5.5.1. Сравнение Visual FoxPro, Access, sql Server, Oracle и Excel
- •1.5.5.2. Методика балловой оценки программных средств
- •1.5.6. Case‑средства автоматизации проектирования
- •1. Ориентация на этапы жизненного цикла
- •2. Функциональная полнота
- •Пользователя в ms sql Server 7.0
- •1.6.2. Резервирование информации
- •1.6.3. Варианты разработки приложений
- •1.7. Стандартизация баз данных
- •1.8. ЯзыкSql
- •1.8.1. Введение вSql
- •1.8.2. Типы данныхSql
- •1.8.3. Оператор выбора данныхSelect
- •1.8.3.1. Назначение и синтаксис оператора
- •1.8.3.2. Объединение таблиц
- •1.8.3.3. Вложенные и коррелированные запросы
- •1.8.3.4. Запросы, использующиеExist, any, all
- •1.8.3.5. Стандартные функции
- •1.8.3.6. Запрос с группировкой
- •1.8.4. Операторы обновления базы
- •1.8.4.1. Оператор корректировки данныхUpdate
- •1.8.4.2. Оператор удаления записейDelete
- •1.8.4.3. Оператор включения записей insert
- •1.8.5. Представления
- •1.9. Транзакции
- •1.9.1. Определение транзакций
- •1.9.2. Организация транзакций
- •1.9.3. Журнал транзакций
- •1.9.4. Журнализация и буферизация
- •1.9.5. Индивидуальный откат транзакций
- •1.9.6. Восстановление после мягкого сбоя
- •1.9.7. Физическая согласованность базы данных
- •1.9.8. Восстановление после жесткого сбоя
- •1.9.9. Параллельное выполнение транзакций
- •1.9.10. Уровни изолированности пользователей
- •1.9.11. Гранулированные синхронизационные захваты
- •1.9.12. Предикатные синхронизационные захваты
- •1.10.1. Особенности встроенногоSql
- •1.9.13. Метод временных меток
- •1.10. ВстроенныйSql
- •1.10.2. Определение курсора
- •1.10.3. Открытие курсора
- •1.10.4. Чтение очередной строки курсора
- •1.10.5. Закрытие курсора
- •1.10.6. Удаление и обновление данных
- •1.10.7. Хранимые процедуры
- •Хранимой процедуры на сервере
- •1.10.8. Триггеры
- •1.10.9. ДинамическийSql
- •1.11. Архитектура субд и оптимизация запросов
- •1.12. Перспективы развития субд
- •Вопросы для самопроверки и контроля
- •1Оглавление
1.8.3. Оператор выбора данныхSelect
1.8.3.1. Назначение и синтаксис оператора
Оператор SELECT реализует все операции реляционной алгебры. В результате его выполнения формируется расчетная таблица, которая может включать данные из других таблиц или представлений (или запросов в СУБД Access) и расчетные поля.
Синтаксис оператора SELECT имеет следующий вид:
SELECT [ALL | DISTINCT] «список полей>|*)
FROM < перечень исходных отношений (таблиц) [<тип связи>]>
[WHERE <условие выборки записей или соединения>]
[GROUP BY <список полей группировки >]
[HAVING < условие выборки групп>]
[ORDER BY <список полей, по которым упорядочить вывод>]
Рассмотрим более детально основные фразы оператора SELECT.
Ключевое слово SELECTсообщает СУБД, что эта команда – запрос. Все запросы начинаются этим словом с последующим пробелом. Затем следует список перечисленных через запятую столбцов, которые выбираются запросом из таблиц, или символ '*' (звездочка) для выбора всей строки или выражения для расчетных полей. Любые столбцы, не перечисленные здесь, не будут включены в результирующее отношение, соответствующее выполнению команды.
Ключевое слово ALL (подразумевается по умолчанию) означает, что в результирующий набор строк включаются все строки, удовлетворяющие условиям запроса.
Ключевое слово DISTINCT означает, что в результирующий набор включаются только различные строки, то есть дубликаты строк результата не включаются в набор.
Символ *. (звездочка) означает, что в результирующий набор включаются все столбцы из исходных таблиц запроса (такой запрос называется динамическим).
В фразе FROMзадаются имена таблиц и представлений (запросов в СУБДAccess), используемых в качестве источника информации. В случае если указано более одного имени таблицы, неявно подразумевается, что над перечисленными таблицами осуществляется операция декартова произведения. Таблицам можно присвоить имена-псевдонимы (алиасы), что бывает полезно для осуществления операции соединения таблицы с самой собою или для доступа из вложенного подзапроса к текущей записи внешнего запроса.
Для связывания таблиц используется фраза JOIN. Тип связи задается словами: LEFT/RIGHT (в запрос входят все записи из таблицы, стоящей в запросе слева/справа), INNER (входят только записи с совпадающими ключами связи).
Пример задания базового запроса (выводит все поля базы) по базе строек.
Select Stroiki.Ns, Stroiki.Ds, Stroiki.Ss, Stroiki.Fs, Stroiki.M, Stroiki.Em, Podrjdhiki.Np, Zakazhiki.Nz FROM “stroiki.DB“ Stroiki
Inner Join “zakazhiki.db“ Zakazhiki ON (Stroiki.Kz = Zakazhiki.Kz)
Inner Join “podrjdhiki.DB“ Podrjdhiki ON (Stroiki.Kp = Podrjdhiki.Kp)
В результате выполнения запроса получается совокупность колонок, в заголовках которых могут находиться имена полей. Если нас не устраивают имена, формируемые по умолчанию, то можно назначить свои (псевдонимы), указав их после слова AS.
В фразе ORDER BY задается список полей упорядочения результата, то есть список полей, который определяет порядок сортировки в результирующем отношении. Например, если первым полем списка будет указана Фамилия, а вторым Номер группы, то в результирующем отношении сначала будут собраны в алфавитном порядке студенты, и если найдутся однофамильцы, то они будут расположены в порядке возрастания номеров групп.
В фразе WHERE задаются условия отбора строк результата или условия соединения кортежей исходных таблиц, подобно операции условного соединения в реляционной алгебре.
В выражении условий фразы WHERE могут быть использованы следующие операции:
Сравнения{ =, <>, >,<, >=,<= }, которые имеют традиционный смысл.
Between A and В– принимает значения между А и В. Предикат истинен, когда сравниваемое значение попадает в заданный диапазон, включая границы диапазона.
Not Between A and В, который истинен тогда, когда сравниваемое значение не попадает в заданный интервал, включая его границы.
IN (множество)– истинен тогда, когда сравниваемое значение входит вмножествозаданных значений. При этом множество значений может быть задано простым перечислением или встроенным подзапросом.
NOT IN (множество), который истинен тогда, когда сравниваемое значение не входит в заданное множество.
LIKE и NOT LIKE. Предикат LIKE требует задания шаблона, с которым сравнивается заданное значение, предикат истинен, если сравниваемое значение соответствует шаблону, и ложен в противном случае. Предикат NOT LIKE имеет противоположный смысл.
В шаблон могут быть включены специальные символы:
символ подчеркивания (_) – для обозначения любого одиночного символа;
символ процента (%) – для обозначения любой произвольной последовательности символов;
[n‑k]% – произвольная последовательность символов в интервале от nдоk;
остальные символы, заданные в шаблоне, обозначают самих себя.
IS NULL – сравнение с неопределенным значением IS NULL.
Неопределенное значение интерпретируется в реляционной модели как значение, неизвестное на данный момент времени. При сравнении неопределенных значений не действуют стандартные правила сравнения: одно неопределенное значение никогда не считается равным другому неопределенному значению. Для выявления равенства значения некоторого атрибута неопределенному применяют специальные стандартные операции:
<имя атрибута>IS NULL и <имя атрибута> IS NOT NULL.
Если в данном в данной строке указанный атрибут имеет неопределенное значение, то условие IS NULL принимает значение «Истина» (TRUE), а предикат IS NOT NULL – «Ложь» (FALSE), в противном случае условие IS NULL принимает значение «Ложь», а предикат IS NOT NULL принимает значение «Истина».
Введение Null-значений вызвало необходимость модификации классической двузначной логики и превращения ее в трехзначную. Все логические операции, производимые с неопределенными значениями, подчиняются этой логике в соответствии с заданной таблицей истинности (Таблица 1.8.3.1).
Таблица 1.8.3.1
Таблица истинности логических операций
|
А |
В |
Not A |
А And В |
A Or B |
|
TRUE |
TRUE |
FALSE |
TRUE |
TRUE |
|
TRUE |
FALSE |
FALSE |
FALSE |
TRUE |
|
TRUE |
Null |
FALSE |
Null |
TRUE |
|
FALSE |
TRUE |
TRUE |
FALSE |
TRUE |
|
FALSE |
FALSE |
TRUE |
FALSE |
FALSE |
|
FALSE |
Null |
TRUE |
FALSE |
Null |
|
Null |
TRUE |
Null |
Null |
TRUE |
|
Null |
FALSE |
Null |
FALSE |
Null |
|
Null |
Null |
Null |
Null |
Null |
В арифметическом выражении поле с неопределенным значением не трактуется как поле с нулевым значением и формируемый результат будет неопределенным!
EXISTи несуществованияNOT EXIST– относятся к встроенным подзапросам.
В фразе GROUP BY <колонка>[,<колонка>...]задаются колонки (поля), по которым производится группирование выходных данных. Все записи таблицы, для которых значения колонок совпадают, отображаются в выборке единственной строкой. Группирование удобно для получения некоторых сводных характеристик (суммы, число записей, среднее) группы.
В выражении могут использоваться собственные агрегатные функции, действующие “по вертикали”: среднее значение в группе (AVG), минимальное (MIN), максимальное (MAX), сумма (SUM), Количество строк или непустых значений полей, которые выбрал запрос (COUNT). Эта функция может иметь в качестве аргумента звездочку (COUNT (*)), что означает подсчет всех записей, попавших в выборку.
Агрегатные функции могут применяться как в выражении вывода результатов строки SELECT, так и в выражении условия обработки сформированных групп HAVING. В этом случае каждая агрегатная функция вычисляется для каждой выделенной группы. Значения, полученные при вычислении агрегатных функций, могут быть использованы для вывода соответствующих результатов или для условия отбора групп.
С функциями SUM и AVG могут использоваться только числовые поля. С функциями COUNT, MAX и MIN могут использоваться как числовые, так и символьные поля. При использовании с символьными полями МАХ и MIN и будут обрабатывать в алфавитном порядке. Нельзя использовать агрегатные функции в предложении WHERE, потому что условия оцениваются в терминах одиночной строки, а агрегатные функции – в терминах групп строк.
В фразе HAVING <условие отбора группы>задаются критерий отбора сформированных в процессе выборки групп.
В условие выборки фразы HAVING, прямо можно использовать только спецификации столбцов, указанных в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк. Аналогично обстоит дело с подзапросами, входящими в предикаты условия выборки раздела HAVING: если в подзапросе используется характеристика текущей группы, то она может задаваться только путем ссылки на столбцы группирования.
Результатом выполнения фразы HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть TRUE. В частности, если раздел HAVING присутствует в табличном выражении, не содержащем GROUP BY, то результатом его выполнения будет либо пустая таблица, либо результат выполнения предыдущих разделов табличного выражения, рассматриваемый как одна группа без столбцов группирования.
Пример. Вывести число сотрудников, максимальную, среднюю, минимальную и итоговую зарплату по подразделениям (поле Podr) по таблице SOTRUDNIKI.
SELECT podr, Count(*),Min(zarpl), Avg(zarpl), Max(zarpl), Sum(zarpl)
From Sotrudniki Group By podr Order By podr
Самый простой запрос SELECT без необязательных частей соответствует просто декартову произведению. Например, выражение
SELECT * FROM Rl, R2
соответствует декартову произведению таблиц R1 и R2. Выражение
SELECT Rl.A, R2.B FROM Rl. R2
соответствует проекции декартова произведения двух таблиц на два столбца А из таблицы R1 и В из таблицы R2, при этом дубликаты всех строк сохранены, в отличие от операции проектирования в реляционной алгебре, где при проектировании по умолчанию все дубликаты кортежей уничтожаются.
В следующих примерах из [18, 19] используются базы данных:
1) «Поставки» с таблицами (ключевые поля подчеркнуты):
S– поставщики (Номер_поставщика, Фамилия, состояние, Город);
Р– детали (Номер_детали, Название, цвет, Вес, Город).;
SP – поставки деталей (Номер_поставщика, Номер_детали, Количество);
J– изделия (Номер_изделия, Название, Город);
SPJпоставка деталей для изделий – (Номер_поставщика, Номер_детали, Номер_изделия, Количество).
2) «Сессия» из [19]:
R1– результаты сессия (ФИО, Дисциплина,Оценка);
R2– список студентов (ФИО, Группа);
R3– список учебных дисциплин по группам (Группы, Дисциплина);
R4– результаты лабораторных работ (ФИО, Дисциплина, Номер_лаб_раб, Оценка).
