
- •Введение
- •Общая схема банка данных в системе
- •Основные понятия
- •Базы данных
- •Банк данных как система управления основные понятия
- •Банк данных как автоматизированная система
- •Субд с включающим языком
- •Информационные системы
- •Документальные аис основные понятия дескриптор
- •Фактографические аис
- •Основные понятия
- •Основные данные
- •Уровни моделей
- •Классификация моделей
- •Роль подсхемы
- •Этапы проектирования базы данных
- •Архитектура банка данных
- •Последовательность действий при чтении записи
- •Инфологическое проектирование базы данных
- •Модели данных и подъязыки данных
- •Иерархическая модель данных
- •Сетевая модель данных
- •Реляционная модель данных
- •Реляционные базы данных
- •Алгебра отношений
- •Преимущества реляционных бд
- •Отношения
- •Нормализация отношений
- •Функциональная зависимость
- •Полная функциональная зависимость.
- •Проектирование баз данных.
- •Специальные операции над отношениями
- •Операции над отношениями.
- •Централизация и децентрализация процессов обработки данных.
- •Традиционный набор операций
- •Нормализация отношений
- •Исчисление отношений
- •Вторая и третья нормальные формы.
- •26. Язык запросов sql
- •1 Основы sql
- •Многотабличные запросы на чтение (объединения)
- •Сортировка результатов запроса (предложение order by)
- •Объединение результатов нескольких запросов (union)*
- •Запрос на объединение и сортировка *
- •Многотабличные запросы на чтение (объединения)
- •Простое объединение таблиц (объединение по равенству)
- •Запросы с использованием отношения предок/потомок
- •Объединения с условием для отбора строк
- •Несколько связанных столбцов
- •Запросы на чтение к трем и более таблицам
- •Чтение всех столбцов
- •Самообъединения
- •Псевдонимы таблиц
- •Правила выполнения многотабличных запросов
- •Внешнее объединение таблиц *
- •Итоговые запросы на чтение
- •Агрегатные функции
- •Агрегатные функции в списке возвращаемых столбцов
- •Запросы с группировкой (предложение group by)
- •Несколько столбцов группировки
- •Ограничения на запросы с группировкой
- •Вложенные запросы на чтение
- •Внешние ссылки
- •Вложенные запросы и объединения
- •Связанные вложенные запросы
- •Однострочный оператор insert
- •В интерактивном режиме удобно не включать в оператор insert список столбцов, так как это уменьшает длину оператора. В случае программного
- •Многострочный оператор insert
- •Удаление существующих данных
- •Удаление всех строк
- •Оператор delete с вложенным запросом *
- •Обновление существующих данных
Чтение всех столбцов
Оператор select * используется для чтения всех столбцов таблицы, указанной в предложении from. В многотабличном запросе звездочка означает выбор всех столбцов из всех таблиц, указанных в предложении from. Например, таблица результатов следующего запроса состоит из пятнадцати столбцов (девять столбцов из таблицы salesreps и следом за ними шесть столбцов из таблицы offices):
Очевидно, что оператор select * становится гораздо менее практичным, когда в предложении from указаны две, три или более таблицы.
Многие диалекты SQL трактуют звездочку как особый вид универсального имени столбца, которое распространяется на все столбцы. В этих диалектах звездочка наряду с именем таблицы используется вместо списка полных имен столбцов. В следующем запросе имя salesreps . * означает список имен всех столбцов таблицы salesreps:
Таблица результатов запроса будет иметь одиннадцать столбцов — девять столбцов таблицы salesreps и следом за ними два столбца таблицы offices, указанных явно. Хотя такой тип "полных имен всех столбцов" поддерживается многими СУБД, он не допускается стандартом ANSI/ISO.
-
Самообъединения
Некоторые многотабличные запросы используют отношения, существующие внутри одной из таблиц. Предположим, например, что требуется вывести список имен всех служащих и их руководителей. Каждому служащему соответствует одна строка в таблице salesreps, а столбец manager содержит идентификатор служащего, являющегося руководителем. Столбцу manager следовало бы быть внешним ключом для таблицы, в которой хранятся данные о руководителях. И он им, фактически, является — это внешний ключ для самой таблицы salesreps!
Если бы вы попытались создать этот запрос как любой другой запрос к двум таблицам с отношением "первичный ключ — внешний ключ", то он выглядел бы так:
Этот оператор select является неправильным из-за двойной ссылки на таблицу salesreps в предложении from. Вы могли бы попробовать убрать вторую ссылку на таблицу salesreps:
Такой запрос будет правильным, но он не сделает того, что вам нужно. Это однотабличный запрос, поэтому SQL поочередно просматривает все строки таблицы salesreps, чтобы найти те, которые удовлетворяют условию поиска:
MANAGER = EMPL NUM
Этому условию удовлетворяют строки, в которых два столбца имеют одинаковые значения — т.е. служащий является своим руководителем. Таких строк нет, поэтому запрос не дает никакого результата.
Чтобы понять, как в SQL решается эта проблема, представим себе, что имеются две идентичные копии таблицы salesreps. Одна копия называется emps и содержит список служащих, а другая называется mgrs и содержит список руководителей (см. рис. 7.9). Столбец manager таблицы emps является внешним ключом для таблицы mgrs, и следующий запрос будет работать:
Так как столбцы в двух таблицах имеют идентичные имена, все ссылки на столбцы являются полными. Иначе говоря, этот запрос выглядит как обычный запрос к двум таблицам.
Для объединения таблицы с самой собой в SQL применяется именно такой подход: использование "воображаемой копии". Вместо того чтобы на самом деле сделать копию таблицы, SQL просто позволяет вам сослаться на нее, используя другое имя, которое называется псевдонимом таблицы. Вот тот
Этому условию удовлетворяют строки, в которых два столбца имеют одинаковые значения — т.е. служащий является своим руководителем. Таких строк нет, поэтому запрос не дает никакого результата.
Чтобы понять, как в SQL решается эта проблема, представим себе, что имеются две идентичные копии таблицы salesreps. Одна копия называется emps и содержит список служащих, а другая называется mgrs и содержит список руководителей (см. рис. 7.9). Столбец manager таблицы emps является внешним ключом для таблицы mgrs, и следующий запрос будет работать:
Так как столбцы в двух таблицах имеют идентичные имена, все ссылки на столбцы являются полными. Иначе говоря, этот запрос выглядит как обычный запрос к двум таблицам.
Для объединения таблицы с самой собой в SQL применяется именно такой подход: использование "воображаемой копии". Вместо того чтобы на самом деле сделать копию таблицы, SQL просто позволяет вам сослаться на нее, используя другое имя, которое называется псевдонимом таблицы. Вот тот же самый запрос, записанный с использованием псевдонимов emps и mgrs для таблицы salesreps;
В предложении from для каждой "копии" таблицы salesreps назначается псевдоним. Это осуществляется следующим образом: псевдоним ставится непосредственно после действительного имени таблицы. Как видно из примера, если в предложений from содержится псевдоним таблицы, то в полной ссылке на столбец должен использоваться псевдоним, а не действительное имя таблицы. Конечно, на самом деле в этом запросе необходимо применять псевдоним только для одной из двух "копий" таблицы. Запрос вполне можно записать так:
Здесь псевдоним mgrs присваивается только одной "копии" таблицы, а для другой используется собственное имя таблицы. Вот еще два примера самообъединения: