- •Выборка данных из нескольких таблиц.
- •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 Перекрестные соединения.
2.3 Создание соединений с использованием предложения using.
Правила:
Если в натуральном соединении используются все столбцы с согласованными именами и типами данных, то в предложении USINGмогут быть указаны только те столбцы, которые следует использовать в соединении.
Столбцы, на которые делаются ссылки в предложении USING, не должны включать квалификаторы (имя таблицы или ее псевдоним), которые применяются в любом другом месте команды SQL.
Пример 1.
SELECT employees.employee_id,
employees.last_name,
departments.location_id,
department_id
FROM employees JOIN departments
USING (department_id) ;
Пример 2.
SELECT departments.department_id,
Departments.department_name,
location_id,
locations.city
FROM departments JOIN locations
USING (location_id)
WHERE location_id = 1400 ;
Пример 3 (неправильное использование).
SELECTemployees.employee_id,
employees.last_name,
departments.location_id,
department_id
FROM employees JOIN departments
USING ( departments.department_id );
Пример 4 (неправильное использование).
SELECTemployees.employee_id,
employees.last_name,
departments.location_id,
department_id
FROM employees JOIN departments
USING (department_id)
WHERE departments.department_id in (20, 50);
2.4 Использование псевдонимов таблиц.
Использование псевдонимов таблиц позволяет:
упрощать вид запросов;
увеличивать производительность запросов.
Пример 1.
SELECT e.employee_id, e.last_name,
d.location_id, department_id
FROM employees e JOIN departments d
USING (department_id);
2.5 Различение столбцов с одинаковыми именами.
Для различения одноимённых столбцов из разных таблиц используются префиксы в виде имён таблиц (либо их псевдонимов);
Использование префиксов в виде имён таблиц (или их псевдонимов) увеличивает производительность запросов;
Одноимённые столбцы из разных таблиц можно различать по их псевдонимам.
2.6 Создание соединений с помощью предложения on.
Использование предложения ON позволяет:
задавать произвольных условия соединений;
отделять условия соединения от условий ограничения;
делать код более легким для понимания.
Пример 1.
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id) ;
Примечание: Предложение ON может быть также использовано для соединения при помощи столбцов с разными иенами.
Пример 2.
SELECT e.last_name emp, m.last_name mgr
FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id) ;
В данном примере таблица EMPLOYEES соединяется с собой. Для имитации двух таблиц используются два псевдонима одной и той же таблицы, а именно eиm. Такой тип соединений называетсясоединение с собой(self-join).
Пример 3.
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
AND e.manager_id = 149 ;
2.7 Создание трёхсторонних соединений при помощи предложения on.
Трехстороннее соединение – это соединение трёх таблиц. В соответствие со стандартом SQL:1999 соединения обрабатываются слева направо.
Пример.
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;
В данном примере первым обрабатывается соединение между таблицами EMPLOYEES и DEPARTMENTS (employees JOIN departments). В этом соединении указываются столбцы из таблиц EMPLOYEES и DEPARTMENTS, но в нём не могут быть использованы столбцы из таблицы LOCATIONS. Во втором условии соединения могут быть использованы столбцы из всех трёх таблиц.
Следующий запрос вернёт идентичный результат:
SELECT employee_id, city, department_name
FROM employees e, departments d, locations l
WHERE d.department_id = e.department_id
AND d.location_id = l.location_id;