Обратите внимание, что кроме названий столбцов снова указаны названия
таблиц.
Соберем все вместе в законченный запрос:
□ 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).