Особенности многотабличных запросов.
Псевдонимы таблиц.
Полные имена столбцов.
Многотабличные запросы
Примерный порядок выполнения простых однотабличных запросов
Таблица результатов простого однотабличного запроса генерируется следующим образом:
1. Взять таблицу, указанную в предложении FROM.
2. Если имеется предложение WHERE, применить заданное в нем условие отбора к каждой строке таблицы и оставить только те строки, для которых это условие выполняется (TRUE), остальные строки отбросить.
3. Для каждой из оставшихся строк вычислить значение каждого элемента в списке возвращаемых столбцов (предложение SELECT) и создать одну строку таблицы результатов запроса.
4. Если указано ключевое слово DISTINCT, удалить из таблицы результатов запроса все повторяющиеся строки.
5. Если имеется предложение ORDER BY, отсортировать результаты запроса.
Рассмотренные до настоящего момента запросы выбирали данные из одной таблицы. Поскольку информация в базе данных хранится в нескольких таблицах, на практике очень часто требуется использовать запросы, использующие данные из нескольких таблиц. Такие запросы называют многотабличными.
Поскольку в различных таблицах столбцы могут называться одинаково, возникает необходимость «разъяснения» СУБД, из какой таблицы должен выбираться тот или иной столбец. Для этой цели используются полные имена столбцов, которые имеют вид:
<Имя_таблицы>.<Имя_столбца>
Такая запись позволяет СУБД однозначно идентифицировать каждый столбец, указанный в запросе. В случае если столбец задан не полным именем, и столбец с таким именем присутствует в нескольких таблицах многотабличного запроса, СУБД выдаст сообщение об ошибке, в котором будет сказано, что в запросе присутствует неоднозначная ссылка на столбец.
Нетрудно заметить, что полные имена столбцов существенно увеличивают текст запроса и делают его трудночитаемым. Поэтому в полных именах столбцов часто используют псевдонимы таблиц, которые задаются в предложении FROM через пробел после имени таблицы:
FROM <Имя таблицы1> <Псевдоним_табл1>, <Имя таблицы2> <Псевдоним_табл2>, …
Псевдонимы делают как можно более короткими, в идеале – состоящими из одной буквы.
При наличии псевдонима таблицы в запросе полные имена столбцов будут иметь вид:
<Псевдоним_табл>.<Имя_столбца>
Псевдонимы таблиц действуют только внутри самого запроса, они никак не влияют на структуру базы данных и реальные имена таблиц.
В сложных запросах рекомендуется использовать псевдонимы для всех используемых таблиц и полные имена столбцов.
Если в запросе используются данные из нескольких таблиц, то все требуемые таблицы необходимо перечислить в предложении FROM. Однако нужно понимать, что сначала СУБД из всех исходных таблиц получает одну результирующую таблицу посредством операции умножения.
Умножение (декартово произведение) двух таблиц представляет собой таблицу (называемую таблицей произведения), состоящую из всех возможных комбинаций строк двух исходных таблиц. Столбцами таблицы произведения являются все столбцы первой таблицы, за которыми следуют все столбцы второй таблицы.
Пример. Пусть имеется база данных, в которой хранится информация о домашних животных и их владельцах.
Схема данных имеет следующий вид:
Содержимое таблицы OWNERS (владельцы):
Содержимое таблицы ANIMALS (животные):