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

является разрядом этого сотрудника. Например, зарплата сотрудника

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 отсутствуют, а именно,