- •Выборка данных из нескольких таблиц.
- •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.8 Не-эквисоединение.
Не-эквисоединение– это условие соединения, которое содержит оператор, отличный от оператора равенства.
EMPLOYEES |
|
JOB_GRADES | |||
LAST_NAME |
SALARY |
|
GRADE_LEVEL |
LOWEST_SALARY |
HIGHEST_SALARY |
King |
24000 |
|
A |
1000 |
2999 |
Kochhar |
17000 |
|
B |
3000 |
5999 |
De Haan |
17000 |
|
C |
6000 |
9999 |
Hunold |
9000 |
|
D |
10000 |
14999 |
Ernst |
6000 |
|
E |
15000 |
24999 |
Lorentz |
4200 |
|
F |
25000 |
40000 |
Mourgos |
5800 |
|
|
|
|
Rajs |
3500 |
|
|
|
|
Davies |
3100 |
|
|
|
|
Matos |
2600 |
|
|
|
|
Vargas |
2500 |
Зарплата в таблице EMPLOYEES находится в пределах минимального и максимального значений в таблице JOB_GRADES. | |||
Zlotkey |
10500 |
| |||
Abel |
11000 |
| |||
Taylor |
8600 |
| |||
. . . |
|
|
Отношение между таблицами EMPLOYEES и JOB_GRADES не является эквисоединением, т.к. ни один столбец таблицы EMPLOYEES не соответствует точно какому-либо столбцу в таблице JOB_GRADES. Связь между таблицами такова, что значение столбца SALARY в таблице EMPLOYEES находится между значениями столбцов LOWEST_SAL и HIGHEST_SAL таблицы JOB_GRADES. Для такого соединения оператор «равно» (=) использоваться не может.
Пример.
SELECT e.last_name, e.salary, j.grade_level
FROM employees e JOIN job_grades j
ON e.salary
BETWEEN j.lowest_salary AND j.highest_salary ;
2.9 Внешние соединения.
В соответствие со стандартом SQL:1999 внутреннее соединение– это соединение двух таблиц, возвращающее только те строки, которые соответствуют условию соединения.
Соединение двух таблиц, которое возвращает как строки внутреннего соединения, так и несоответствующие строки левой (правой) таблицы – это левое (правое) внешнее соединение.
Полное внешнее соединениевозвращает результаты внутреннего соединения, а также левого и правого внешних соединений.
2.9.1 Левое внешнее соединение.
SELECT e.last_name, e.department_id, d.department_name
FROM employees e LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
В этом запросе возвращаются все строки таблицы EMPLOYEES, даже если они не соответствуют строкам таблицы DEPARTMENTS, т.к. таблица EMPLOYEES является левой таблицейво внешнем соединении.
В предыдущих версиях СУБД Oracle (до версии 8i) этот запрос выглядел бы так:
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+) ;
2.9.2 Правое внешнее соединение.
SELECT e.last_name, e.department_id, d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
В этом запросе возвращаются все строки таблицы DEPARTMENTS, даже если они не соответствуют строкам таблицы EMPLOYEES, т.к. таблица DEPARTMENTS является правой таблицейво внешнем соединении.
В предыдущих версиях СУБД Oracle (до версии 8i) этот запрос выглядел бы так:
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id (+) = d.department_id ;