является разрядом этого сотрудника. Например, зарплата сотрудника
Fred Hobbs равна $150,000; это значение находится между $1 и $250,000
Выборка информации из таблиц базы данных 55
в таблице salary_grades для salary_grade_id, равному 1; следовательно разряд
для Fred Hobbs равен 1. Аналогично, зарплата Susan Jones равна
$500,000; это значение находится между $250,001 и $500,000 в таблице
salary_grades для salary_grade_id, равному 2; следовательно разряд для
Susan Jones равен 2. Ronjohnson и James Smith имеют соответственно разряды
3 и 4.
Внешние соединения
Внешнее соединение возвращает строку даже в том случае, если один из
столбцов соединения содержит пустое значение. Для выполнения внешнего
соединения необходимо в условии соединения поместить оператор
внешнего соединения; оператор внешнего соединения Oracle представляет
заключенный в скобки знак плюс (+).
Рассмотрим пример. В одном из приведенных выше запросов не была
показана строка для товара My Front Line, потому что для этого товара
столбец product_type_id содержал пустое значение. Чтобы получить эту
строку, можно использовать внешнее соединение; при этом следует заметить,
что оператор внешнего соединения (+) размещен на противоположной
стороне столбца product_type_id в таблице products (это тот столбец,
в котором содержится пустое значение):
□ SELECT p.name, pt.name
FROM products p, product_types pt
WHERE p.product_type_id = pt.product_type_id (+)
ORDER BY p.name;
NAME NAME
2412: The Return Video
Chemistry Book
C la s s i c a l Music CD
Cre a tive Y e l l CD
From Another Planet DVD
Modern Science Book
My Front Line
Pop 3 CD
Space Force 9 DVD
Supernova Video
Tank War Video
Z F i le s Video
Обратите внимание, что товар My Front Line - товар с пустым (null)
значением в столбце product_type_id - теперь появился в списке.
Примечание Можно поместить оператор внешнего соединения на любой стороне оператора
соединения, но он всегда должен быть помещен с другой стороны от того столбца, в котором
содержатся пустые значения.
Следующий запрос возвращает те же самые результаты, что и предыдущий,
но обратите внимание, что столбец со значением null (pt.product_
56 Глава 2
type_id) и оператор внешнего соединения Oracle расположены слева от
знака равенства в условии соединения:
□ SELECT p.name, pt.name
FROM products p, product_types pt
WHERE pt .produc t_type_id (+) = p.product_type_id
ORDER BY p.name;
Л евое и правое внешние соединения
Внешние соединения могут быть разделены на два типа:
■ левые внешние соединения,
■ правые внешние соединения.
Чтобы понять, в чем состоит различие между этими типами внешних
соединений, нужно рассмотреть следующий синтаксис:
П SELECT . . .
FROM t a b l e l , table2
Предположим, что таблицы соединяются по столбцам t a b l e l . columnl и
table2. column2. Предположим также, что t a b le l содержит строку с пустым
значением в столбце columnl. Чтобы выполнить левое внешнее соединение,
фраза WHERE должна иметь следующий вид:
□ WHERE t a b l e l . columnl = table2.column2 (+);
Примечание В левом внешнем соединении оператор внешнего соединения на самом деле
помещается справа от оператора равенства.
Теперь предположим, что table2 содержит строку с пустым значением
в столбце column2. Чтобы выполнить правое внешнее соединение, нужно
перенести оператор внешнего соединения налево от оператора равенства,
и фраза WHERE принимает следующий вид:
□ WHERE t a b l e l . columnl (+) = table2.column2;
Примечание Как вы увидите, если таблицы t a b le l и table2 обе содержат строки с пустыми
значениями, результаты получаются разными в зависимости от того, какое внешнее соединение
используется: правое или левое.
Ниже приведены некоторые конкретные примеры, призванные сделать
более ясными правые и левые внешние соединения.
Пример левого внешнего соединения Следующий запрос показывает
применение левого внешнего соединения; оператор внешнего соединения
появляется справа от оператора равенства:
□ SELECT p.name, pt.name
FROM products р, product_types pt
WHERE p.product_type_id = pt.product_type_id (+)
ORDER BY p.name;
Выборка информации из таблиц базы данных 57
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
My Front Line
Pop 3 CD
Space Force 9 DVD
Supernova Video
Tank War Video
Z F i le s Video
Следует обратить внимание на то, что в этом примере показаны все
строки таблицы products, в том числе и для товара My Front Line, у которого
в столбце product_type_id содержится пустое значение.
П р и м е р п р а в о г о в н еш н е г о с о е д и н е н и я В таблице product_types есть
тип товара, ссылки на который в таблице products отсутствуют, а именно,