Выбрать главу

Обратите внимание, что кроме названий столбцов снова указаны названия

таблиц.

Соберем все вместе в законченный запрос:

□ SELECT products.name, products_types.name

FROM products, product_types

WHERE products.product_type_id = product_types.product_type_id

AND products.product_id = 3;

NAME NAME

Supernova Video _ „

Отлично! Это именно то, что мы хотели: название товара и название

типа товара. Следующий запрос выводит все товары и сортирует их по

столбцу products, name:

□ SELECT products.name, products_types.name

FROM products, product_types

WHERE products.product_type_id = product_types.product_type_id

ORDER BY products.name;

NAME NAME

2412: The Return Video

Chemistry Book

C la s s i c a l Music CD

Cre a t iv e Y e l l CD

From Another Planet DVD

Modern Science Book

Pop 3 CD

Space Force 9 DVD

Supernova Video

Tank War Video

Z F i le s Video

Обратите внимание, что в полученную распечатку не вошел один из товаров:

My Front Line. Дело в том, что столбец product_type_id для этого

товара имеет значение null и условие соединения не возвращает эту строку.

О том, как можно включить в выходные данные такие строки, см. далее

в разделе “Внешние соединения”.

Синтаксис соединения, представленный в этом разделе, использует

для соединений синтаксис Oracle, основанный на стандарте SQL/86 Национального

института стандартизации США (ANSI). После появления

Выборка информации из таблиц базы данных 51

Oracle9i в базе данных реализован и синтаксис соединений, основанный

на стандартах ANSI SQL/92 (см. ниже в разделе “Выполнение соединений

с использованием синтаксиса SQL/92” ). При работе с OracIe9i или более

поздними версиями следует использовать в запросах стандарт SQL/92, и

только при работе с Oracle8i и более ранними версиями - запросы на базе

SQL/86.

Псевдонимы таблиц

В примере из предыдущего раздела был использован следующий запрос:

□ SELECT products.name, products_type.name

FROM products, product_types

WHERE products.product_type_id = product_types.product_type_id

ORDER BY products.name;

Обратите внимание, что имена таблиц products и product_types используются

во фразах SELECT и WHERE. Повторение имен таблиц - это дополнительная

и избыточная работа. Удобнее придумать для таблицы псевдоним,

упомянуть его во фразе FROM, а затем использовать его при всех упоминаниях

в запросе имени таблицы. Например, можно использовать псевдоним р

для таблицы products и pt для таблицы product_types. Тогда запрос принимает

следующий вид:

□ SELECT p.name, pt.name

FROM products p, product_types pt

WHERE p.product_type_id = pt .produc t_type_id

ORDER BY p.name;

Совет Псевдонимы таблиц делают запросы более удобочитаемыми, особенно длинные

запросы, в которых участвует много таблиц.

Лекартовы произведения

Если пропущено условие соединения, будут отобраны все строки одной

таблицы, соединенные со всеми строками другой таблицы; эта ситуация

известна как «декартово произведение». Когда происходит нечто подобное,

можно оказаться в ситуации, когда будет показано огромное количество

строк. Предположим, например, что одна из таблиц содержит 50 строк,

а вторая - 100 строк. Если выбирать столбцы из этих таблиц без соединения,

то будет возвращено 5000 строк. Это связано с тем, что каждая строка

из первой таблицы будет соединена с каждой строкой из второй таблицы,

так что в итоге мы получаем 50 х 100, или 5000 строк.

В следующем примере вы можете видеть небольшое подмножество

строк декартова произведения двух таблиц - products и product_types:

□ SELECT pt.product_type_id, p.product_id FROM

product_type pt, products p;

52 Глава 2

PRODUCT_TYPE_ID PRODUCT_ID

1

23

4

5

55555

89

10

11

12

60 rows selec ted.

Всего будет отобрано 60 строк, так как таблицы product_types и products

содержат 5 и 12 строк соответственно, что даёт 5 *1 2 = 60.

Выполнение операторов SELECT, использующих более

двух таблиц

Можно соединять любое число таблиц. Для определения числа соединений,

необходимых в вашей фразе WHERE, можно использовать следующую

формулу:

Число соединений = Общее число таблиц, используемых в запросе, минус 1.

Например, следующий запрос использует две таблицы и одно соединение:

□ SELECT p.name, pt.name

FROM products p, product_types pt

WHERE p.product_type_id = pt.produc t_type_id

ORDER BY p.name;

Рассмотрим теперь более сложный пример, включающий четыре таблицы,

для которого по нашей формуле будет необходимо иметь три соединения.

Например, мы хотели бы увидеть следующую информацию.

■ Покупки, сделанные каждым покупателем (таблица purchases),

■ Имя и фамилия покупателя (таблица customers),

■ Названия купленных им товаров (таблица products),

■ Название типа продукта (таблица product_types).