Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМП-БД.doc
Скачиваний:
17
Добавлен:
05.12.2018
Размер:
1.26 Mб
Скачать

Чтение всех столбцов

Оператор select * используется для чтения всех столбцов таблицы, указанной в предложении from. В многотабличном запросе звездочка означает выбор всех столбцов из всех таблиц, указанных в предложении from. Например, таблица результатов следующего запроса состоит из пятнадцати столбцов (девять столбцов из таблицы salesreps и следом за ними шесть столбцов из таблицы offices):

Очевидно, что оператор select * становится гораздо менее практичным, когда в предложении from указаны две, три или более таблицы.

Многие диалекты SQL трактуют звездочку как особый вид универсального имени столбца, которое распространяется на все столбцы. В этих диалектах звездочка наряду с именем таблицы используется вместо списка полных имен столбцов. В следующем запросе имя salesreps . * означает список имен всех столбцов таблицы salesreps:

Таблица результатов запроса будет иметь одиннадцать столбцов — девять столбцов таблицы salesreps и следом за ними два столбца таблицы offices, указанных явно. Хотя такой тип "полных имен всех столбцов" поддерживается многими СУБД, он не допускается стандартом ANSI/ISO.

  1. Самообъединения

Некоторые многотабличные запросы используют отношения, существующие внутри одной из таблиц. Предположим, например, что требуется вывести список имен всех служащих и их руководителей. Каждому служащему соответствует одна строка в таблице 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 присваивается только одной "копии" таблицы, а для другой используется собственное имя таблицы. Вот еще два примера самообъединения: