Выборка данных из нескольких таблиц.
Если требуются получить данные из более, чем одной таблицы базы данных, используется операция соединения, определенная в реляционной алгебре. Строки одной таблицы соединяются со строками другой согласно общим значениям в соответствующих столбцах – столбцах первичных и внешних ключей.
СУБД Oracle7 поддерживает следующие способы соединения:
Отношения между таблицами.
При соединении нескольких таблиц возможен случай, когда в качестве результата запроса можно получить Декартово произведение, которое образуется, если:
Во избежание получения декартова произведения в предложение WHERE всегда необходимо включать допустимое условие соединения.
Простой запрос с соединением.
Синтаксис
|
где:
таблица.столбец |
таблица и столбец, из которых производится выборка данных. |
таблица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.
Внешние соединения.
Внешнее соединение используется для выборки строк, не удовлетворяющих обычным условиям соединения. Оператором внешнего соединения является знак плюс, заключенный в скобки (+). Этот оператор указывается с той стороны, где нет значения, по которому можно было бы произвести соединение.
Синтаксис
|
где:
таблица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. |