Назад    Оглавление    Далее

Выборка данных из нескольких таблиц.

Если требуются получить данные из более, чем одной таблицы базы данных, используется операция соединения, определенная в реляционной алгебре. Строки одной таблицы соединяются со строками другой согласно общим значениям в соответствующих столбцах – столбцах первичных и внешних ключей.

СУБД Oracle7 поддерживает следующие способы соединения:

Отношения между таблицами.

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

Во избежание получения декартова произведения в предложение WHERE всегда необходимо включать допустимое условие соединения.

Простой запрос с соединением.

Синтаксис

SELECT

таблица.столбец, таблица.столбец

FROM

таблица1, таблица2

WHERE

таблица1.столбец1 = таблица2.столбец2;

где:

таблица.столбец

таблица и столбец, из которых производится выборка данных.

таблица1.столбец1=таблица2.столбец2

условие, соединяющее таблицы (или задающее их связь).

В предложении WHERE указывается допустимое для этого вида соединения логическое условие. Указывать имя таблицы в предложении SELECT необязательно, однако читать предложение легче, если каждому имени столбца предшествует имя таблицы. Если столбцы с одинаковыми именами имеются более, чем в одной таблице, имя таблицы перед именем столбца обязательно.

Эквисоединение.

Этот вид соединения возникает, когда в качестве условия для соединения указывается точное равенство значений одного столбца значениям другого. Часто эти столбцы являются компонентами первичного и внешнего ключа.

Пример: Соединение таблиц служащих и отделов для вывода фамилии служащего, номера и названия отдела.

LAST_NAME
-----------------
DEPT_ID
--------------
NAME
---------------------------------
Velasquez 50 Administration
Ngao 41

Operations

Nagayama 31 Sales
Quick-To-See 10 Finance
Ropeburn 50 Administration
Urquhart 41 Operations
Menchu 42 Operations
Biri 43 Operations
Catchpole 44 Operations
Havel 45 Operations
Magee 31 Sales
Giljum 32 Sales
Sebeghi 33 Sales

Строки двух таблиц комбинируются и в результат включаются лишь те строки, у которых значения S_EMP.DEPT_ID и S_DEPT.ID равны.

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

Для различения одноименных столбцов из разных таблиц используются префиксы в виде имен таблиц. Использование префиксов в виде имен таблиц увеличивает производительность запроса. Одноименные столбцы из разных таблиц можно различать по их псевдонимам. Однако как быть в том случае, когда имена таблиц громоздки или совпадают?

Для разрешения такой ситуации используют псевдонимы таблиц. При этом необходимо следовать следующим правилам:

Пример: Вывод наименования клиента, номера региона и названия региона для всех клиентов. Используются псевдонимы столбцов, а для упрощения ссылок на таблицы – псевдонимы таблиц.

Псевдонимы таблиц могут содержать до тридцати символов, но чем они короче, тем лучше. Действие псевдонима таблицы распространяется лишь на текущую команду SELECT. Использование псевдонимов таблиц позволяет уменьшить объем кода SQL, что сокращает расход памяти.

Дополнительные условия поиска.

Помимо соединения в предложении WHERE можно задавать и другие критерии для ограничения получаемых в запросе строк. Поскольку соединение необходимо для подбора соответствий, дополнительное условие добавляется с помощью оператора AND.

Пример: Вывод фамилии, номера отдела и названия отдела сотрудника "Menchu".

LAST_NAME
----------------
DEPT_ID
----------------
NAME
----------------
Menchu 42 Operations

Пример: Вывод фамилии, названия региона и процента комиссионных всех служащих, получающих комиссионные.

LAST_NAME
-----------------
NAME
---------------------
COMMISSION_PCT
------------------------
Magee North America 10
Giljum Couth America 12.5
Sedeghi Africa / Middle East 10
Nguyen Asia 15
Dumas Europe 17.5
. . .    

Не-эквисоединения.

Не-эквисоединение возникает в случае, если ни один столбец одной таблицы не соответствует точно столбцу другой таблицы. Условие соединения содержит оператор, не являющийся оператором равенства (=).

Пример: Создание не-эквисоединения для вычисления категории служащего по заработной плате. Заработная плата должна быть между любой парой нижнего и верхнего значения диапазона зарплат.

E.LAST_NAME
-----------------
E.TITLE
--------------
E.SALARY
------------
S.GRADE
-----------
SMITH CLERK 800.00 1
ADAMS CLERK 1,100.00 1
JAMES CLERK 950.00 1
WARD SALESMAN 1,250.00 2
MARTIN SALESMAN 1,250.00 2
MILLER CLERK 1,300.00 2
ALLEN SALESMAN 1,600.00 3
TURNER SALESMAN 1,500.00 3
JONES MANAGER 2,975.00 4
BLAKE MANAGER 2,850.00 4
CLARK MANAGER 2,450.00 4
SCOTT ANALYST 3,000.00 4
FORD ANALYST 3,000.00 4
KING PRESIDENT 5,000.00 5
14 rows selected

Могут использоваться и другие операторы, (например, <= и >=), но самый простой оператор – это BETWEEN.

Внешние соединения.

Внешнее соединение используется для выборки строк, не удовлетворяющих обычным условиям соединения. Оператором внешнего соединения является знак плюс, заключенный в скобки (+). Этот оператор указывается с той стороны, где нет значения, по которому можно было бы произвести соединение.

Синтаксис

SELECT таблица.столбец, таблица.столбец
FROM таблица1, таблица2
WHERE таблица1.столбец1 = таблица2.столбец2(+);

где:

таблица1.столбец1 = таблица2.столбец2

условие, соединяющее таблицы (или задающее их отношение)

(+)

Символ внешнего соединения; может использоваться на любой стороне условия в предложении WHERE. (+) указывается после имени таблицы, в которой нет соответствующих строк

Оператор внешнего соединения может использоваться только на одной стороне выражения, там, где не достаточно информации. Он возвращает строки таблицы, для которых в другой таблице нет соответствующей строки.

Условие, предполагающее внешнее соединение, не может использовать оператор IN и быть связанным с другими условиями с помощью оператора OR.

Пример: Вывод для каждого клиента его наименования, а также фамилии и идентификационного номера торгового представителя. В список включаются наименования даже тех клиентов, которые не имеют торгового представителя.

E.LAST_NAME
----------------------
E.ID
------------------
C.NAME
-------------------------------
Magee 11 Womansport
Magee 11 Beisbol Si!
Magee 11 Ojibway Retail
Magee 11 Big John’s Sports Emporium
Giljum 12 Unisports
Giljum 12 Futbol Sonora
Sedeghi 13 Hanada Sport
Nguyen 14 Smms Atheletics
Nguyen 14 Delhi Sports
Dumas 15 Kam’s Sporting Goods
Dumas 15 Sportique
Dumas 15 Muench Sports
Dumas 15 Sporta Russia
Dumas 15 Kuhn’s Sports
    Sweet Rock Sports

15 rows selected

Соединение таблицы с собой.

Рекурсивное соединение возникает в том случае, когда строки таблицы соединяются со строками этой же самой таблицы. При этом в предложении FROM наличие двух таблиц имитируется путем использования двух различных псевдонимов таблицы.

Пример: Вывод имен сотрудников и их менеджеров.

WORKER.LAST_NAME || ‘works for’ || MANAGER.LAST_NAME
---------------------------------------------------------------------------------
Ngao works for Velasquez
Nagayama works for Velasquez
Quick-To-See works for Velasquez
Ropeburn works for Velasquez
Urguhart works for Ngao
Menchu works for Ngao
Biri works for Ngao
Catchpole works for Ngao
Havel works for Ngao
Magee works for Nagayama
Sedeghi works for Nagayama
...
24 rows selected.

Для закрепления материала рекомендуется выполнить Практическое задание 5.


Назад    Оглавление    Далее