Учебники

Получить данные из нескольких таблиц

Связанные таблицы большой базы данных связаны посредством использования внешних и первичных ключей или того, что часто называют общими столбцами. Возможность объединения таблиц позволит вам добавить больше смысла к создаваемой таблице результатов. Для объединения n-числовых таблиц в запросе необходимы минимальные (n-1) условия объединения. На основе условий соединения Oracle объединяет совпадающую пару строк и отображает ту, которая удовлетворяет условию соединения.

Объединения классифицируются как ниже

  • Естественное объединение (также известное как equijoin или простое объединение). Создает объединение с использованием обычно именуемого и определенного столбца.

  • Соединение неравенства — объединяет таблицы, когда в таблицах нет эквивалентных строк, например, для сопоставления значений в одном столбце таблицы с диапазоном значений в другой таблице.

  • Self-join — присоединяет таблицу к себе.

  • Внешнее соединение — включает записи таблицы в вывод, когда в другой таблице нет соответствующих записей.

  • Декартово объединение (также известное как декартово произведение или перекрестное объединение) — реплицирует каждую строку из первой таблицы на каждую строку из второй таблицы. Создает объединение между таблицами путем отображения каждой возможной комбинации записей.

Естественное объединение (также известное как equijoin или простое объединение). Создает объединение с использованием обычно именуемого и определенного столбца.

Соединение неравенства — объединяет таблицы, когда в таблицах нет эквивалентных строк, например, для сопоставления значений в одном столбце таблицы с диапазоном значений в другой таблице.

Self-join — присоединяет таблицу к себе.

Внешнее соединение — включает записи таблицы в вывод, когда в другой таблице нет соответствующих записей.

Декартово объединение (также известное как декартово произведение или перекрестное объединение) — реплицирует каждую строку из первой таблицы на каждую строку из второй таблицы. Создает объединение между таблицами путем отображения каждой возможной комбинации записей.

Natural Join

Ключевое слово NATURAL может упростить синтаксис equijoin. NATURAL JOIN возможен, когда две (или более) таблицы имеют столбцы с одинаковыми именами, а столбцы совместимы по объединению, т. Е. Столбцы имеют общий домен значений. Соединение Операция объединяет строки из таблиц, которые имеют одинаковые значения столбцов для одинаковых именованных столбцов.

Рассмотрим отношение «один ко многим» между таблицами DEPARTMENTS и EMPLOYEES. Каждая таблица имеет столбец с именем DEPARTMENT_ID. Этот столбец является первичным ключом таблицы DEPARTMENTS и внешним ключом таблицы EMPLOYEES.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E NATURAL JOIN departments D;

FIRST_NAME DNAME
---------- ------
MILLER     DEPT 1
JOHN       DEPT 1
MARTIN     DEPT 2
EDWIN      DEPT 2

Приведенный ниже запрос SELECT объединяет две таблицы, явно указывая условие соединения с ключевым словом ON.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
ON (E.department_id = D.department_id);

Существуют некоторые ограничения, касающиеся NATURAL JOIN. Вы не можете указать столбец больших объектов с NATURAL JOIN. Также столбцы, участвующие в объединении, не могут быть определены по имени таблицы или псевдониму.

УСЛОВИЯ ИСПОЛЬЗОВАНИЯ

Используя естественные объединения, Oracle неявно идентифицирует столбцы для формирования основы объединения. Многие ситуации требуют явного объявления условий соединения. В таких случаях мы используем предложение USING для указания критериев присоединения. Поскольку предложение USING объединяет таблицы на основе равенства столбцов, оно также называется Equijoin. Они также известны как Внутренние соединения или простые соединения.

Синтаксис:

SELECT <column list>
FROM   TABLE1   JOIN   TABLE2	
USING (column name)

Рассмотрим приведенный ниже запрос SELECT, таблицу EMPLOYEES и таблицу DEPARTMENTS объединяют с использованием общего столбца DEPARTMENT_ID.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
USING (department_id);

Самостоятельное присоединение

Операция SELF-JOIN создает таблицу результатов, когда интересующие отношения существуют между строками, которые хранятся в одной таблице. Другими словами, когда таблица присоединяется к себе, это соединение называется Self Join.

Рассмотрим таблицу EMPLOYEES, которая содержит сотрудников и их менеджеров по отчетам. Чтобы найти имя менеджера для сотрудника, потребуется соединение с самой таблицей EMP. Это типичный кандидат на самостоятельное присоединение.

SELECT e1.FirstName Manager,e2.FirstName Employee
FROM employees e1 JOIN employees e2
ON (e1.employee_id = e2.manager_id)
ORDER BY e2.manager_id DESC;

Non Equijoins

Соединение неравенства используется, когда связанные столбцы не могут быть объединены знаком равенства, что означает, что в таблицах нет одинаковых строк для объединения. Соединение неравенства позволяет хранить минимальное значение диапазона в одном столбце. записи и максимальное значение в другом столбце. Таким образом, вместо поиска соответствия столбец-столбец, вы можете использовать соединение неравенства, чтобы определить, попадает ли отправляемый элемент между минимальным и максимальным диапазонами в столбцах. Если соединение находит соответствующий диапазон для элемента, соответствующую отгрузку плата может быть возвращена в результатах. Как и в случае традиционного метода объединений на равенство, в выражении WHERE может быть выполнено соединение на неравенство. Кроме того, ключевое слово JOIN можно использовать с предложением ON, чтобы указать соответствующие столбцы для объединения.

SELECT E.first_name,
            J.job_hisal,
            J.job_losal,
            E.salary
     FROM employees E JOIN job_sal J
     ON (E.salary BETWEEN J.job_losal AND J.job_losal);

Мы можем использовать все параметры сравнения, рассмотренные ранее, такие как операторы равенства и неравенства, МЕЖДУ, НУЛЕВОЙ, НЕ НУЛЬНОЙ и ОТНОСИТЕЛЬНОЙ.

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

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

Существует три типа внешних соединений: левое, правое и полное внешнее соединение. Все они начинаются с ВНУТРЕННЕГО СОЕДИНЕНИЯ, а затем добавляют обратно некоторые строки, которые были удалены. LEFT OUTER JOIN добавляет обратно все строки, которые были отброшены из первой (левой) таблицы в условии соединения, а выходные столбцы из второй (правой) таблицы установлены в NULL. RIGHT OUTER JOIN добавляет все строки, которые были отброшены из второй (правой) таблицы в условии соединения, а выходные столбцы из первой (левой) таблицы установлены в NULL. FULL OUTER JOIN добавляет все строки, которые были удалены из обеих таблиц.

Правое внешнее соединение

RIGHT OUTER JOIN добавляет все строки, которые были отброшены из второй (правой) таблицы в условии соединения, а выходные столбцы из первой (левой) таблицы установлены в NULL. Обратите внимание на приведенный ниже запрос со списком сотрудников и их соответствующих отделов. Также ни один сотрудник не был назначен в отдел 30.

SELECT E.first_name, E.salary, D.department_id          
FROM employees E, departments D
WHERE E.DEPARTMENT_ID (+) = D.DEPARTMENT_ID;

FIRST_NAME SALARY     DEPARTMENT_ID
---------- ---------- ----------
JOHN       6000       10
EDWIN      2000       20
MILLER     2500       10
MARTIN     4000       20
                      30

Левое внешнее соединение

LEFT OUTER JOIN добавляет обратно все строки, которые были отброшены из первой (левой) таблицы в условии соединения, а выходные столбцы из второй (правой) таблицы установлены в NULL. Показанный выше запрос может быть использован для демонстрации левого внешнего соединения путем замены позиции знака (+).

SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE   D.DEPARTMENT_ID = E.DEPARTMENT_ID (+);

FIRST_NAME SALARY     DEPARTMENT_ID
---------- ---------- ----------
JOHN       6000       10
EDWIN      2000       20
MILLER     2500       10
MARTIN     4000       20
                      30

Полное внешнее соединение

FULL OUTER JOIN добавляет все строки, которые были удалены из обеих таблиц. Ниже запрос показывает списки сотрудников и их отделов. Обратите внимание, что сотруднику «MAN» до сих пор не назначен какой-либо отдел (это NULL), а отдел 30 не назначен ни одному сотруднику.

SELECT  nvl (e.first_name,'-') first_name, nvl (to_char (d.department_id),'-') department_id
FROM employee e FULL OUTER JOIN department d
ON e. depARTMENT_ID = d. depARTMENT_ID;

FIRST_NAME DEPARTMENT_ID
---------- --------------------
MAN        -
JOHN       10
EDWIN      20
MILLER     10
MARTIN     20
-          30

6 rows selected.

Декартово произведение или взаимное соединение

Для двух сущностей A и B A * B называется декартовым произведением. Декартово произведение состоит из всех возможных комбинаций строк из каждой таблицы. Поэтому, когда таблица с 10 строками соединяется с таблицей с 20 строками, декартово произведение равно 200 строкам (10 * 20 = 200). Например, объединение таблицы сотрудника с восемью строками и таблицы отдела с тремя строками приведет к таблица декартовых произведений из 24 строк (8 * 3 = 24).

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

Таблица результатов декартовых произведений обычно не очень полезна. Фактически, такая таблица результатов может быть ужасно вводящей в заблуждение. Если вы выполните приведенный ниже запрос для таблиц EMPLOYEES и DEPARTMENTS, таблица результатов подразумевает, что у каждого сотрудника есть связь с каждым отделом, и мы знаем, что это просто не так!