- •Выборка данных из нескольких таблиц.
- •1. Выборка данных из нескольких таблиц.
- •2. Виды соединений.
- •2.1 Соединение таблиц с помощью sql:1999
- •2.2 Создание натуральных соединений (natural join).
- •2.3 Создание соединений с использованием предложения using.
- •2.4 Использование псевдонимов таблиц.
- •2.5 Различение столбцов с одинаковыми именами.
- •2.6 Создание соединений с помощью предложения on.
- •Пример 3.
- •2.7 Создание трёхсторонних соединений при помощи предложения on.
- •2.8 Не-эквисоединение.
- •2.9 Внешние соединения.
- •2.9.1 Левое внешнее соединение.
- •2.9.2 Правое внешнее соединение.
- •2.9.3 Полное внешнее соединение.
- •2.10 Перекрестные соединения.
Выборка данных из нескольких таблиц.
Цели: После освоение материала данной лекции, студенты должны быть в состоянии выполнить следующие действия:
Составлять SQLзапросы для выбора данных из нескольких таблиц, используя эквисоединения и соединения других видов;
Использовать соединение таблицы с собой;
Использовать внешние соединения для просмотра данных, не удовлетворяющих обычным условиям соединения;
Создавать декартово произведение всех строк из двух или более таблиц.
1. Выборка данных из нескольких таблиц.
Иногда требуются данные из более, чем одной таблицы. Отчёт в приведённом ниже примере содержит данные из двух разных таблиц:EMPLOYEESиDEPARTMENTS.
EMPLOYEE_ID |
LAST_NAME |
DEPARTMENT_ID |
|
DEPARTMENT_ID |
DEPARTMENT_NAME |
LOCATION_ID |
100 |
King |
90 |
|
10 |
Administration |
1700 |
101 |
Kochhar |
90 |
|
20 |
Marketing |
1800 |
. . . |
|
|
|
50 |
Shipping |
1500 |
202 |
Fay |
20 |
|
60 |
IT |
1400 |
205 |
Higgins |
110 |
|
80 |
Sales |
2500 |
206 |
Gietz |
110 |
|
90 |
Executive |
1700 |
|
|
|
|
110 |
Accounting |
1700 |
|
|
|
|
190 |
Contracting |
1700 |
Результат:
|
|
EMPLOYEE_ID |
DEPARTMENT_ID |
DEPARTMENT_NAME |
|
|
|
|
100 |
90 |
Executive |
|
|
|
|
101 |
90 |
Executive |
|
|
|
|
. . . |
|
|
|
|
|
|
202 |
20 |
Marketing |
|
|
|
|
205 |
110 |
Accounting |
|
|
|
|
206 |
110 |
Accounting |
|
|
|
|
. . . |
|
|
|
|
2. Виды соединений.
СУБД Oracle, начиная с версии 9i, позволяет использовать синтаксис стандарта SQL:1999 и поддерживает следующие типы соединений:
Перекрестные соединения;
Натуральные соединения;
Опция USING;
Полное (или двухстороннее) внешнее соединение;
Произвольные условия соединения для внешнего соединения.
2.1 Соединение таблиц с помощью sql:1999
SELECT table1.column, table2.column
FROM table1
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
ON (table1.column_name = table2.column_name)]|
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)]|
[CROSS JOIN table2];
Для выборки данных из нескольких таблиц требуется условие соединения. Строки одной таблицы соединяются со строками другой с помощью общих значений в соответствующих столбцах – обычно в столбцах первичных и внешних ключей.
Указание 1.
Для соединения Nтаблиц требуется, по крайней мере, (N-1) условий соединения. Это правило не распространяется на таблицы с составным первичным ключом. В этом случае для однозначной идентификации строки требуется более одного столбца.
2.2 Создание натуральных соединений (natural join).
Правила:
Предложение NATURAL JOINосновывается на всех столбцах двух таблиц, имеющих одинаковые имена;
Выбираются строки из двух таблиц, которые имеют одинаковые значения во всех соответствующих столбцах;
Если столбцы с одинаковыми именами имеют разные типы данных, возвращается сообщение об ошибке.
Пример 1.
SELECT department_id, department_name, location_id, city
FROM departments
NATURAL JOIN locations ;
Пример 2.
SELECT department_id, department_name, location_id, city
FROM departments
NATURAL JOIN locations
WHERE department_id in (20, 50) ;
Пример 3.
SELECT departments.department_id,
departments.department_name,
locations.location_id,
locations.city
FROM departments, locations
WHERE departments.location_id = locations.location_id ;
Примечание.
В основе натурального соединения лежит эквисоединение(equi-join) всех столбцов с одинаковыми именами.