ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ

advertisement
ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ
ТАБЛИЦ
ЧТО ТАКОЕ СОЕДИНЕНИЕ?
Соединение используется для выборки данных из более, чем
одной таблицы
Строки соединяются с помощью общих значений - как правило,
значений первичных и внешних ключей
Способы соединения:





Эквисоединение
Не-эквисоединение
Внешнее соединение
Соединение таблицы с собой
Операторы множеств
ОТНОШЕНИЯ МЕЖДУ ТАБЛИЦАМИ
S_EMP Table
ID LAST_NAME
----- ----------------------------1 Velasquez
2 Ngao
3 Nagayama
4 Quick-To-See
5 Ropeburn
6 Urguhart
7 Menchu
8 Biri
9 Catchpole
10 Havel
11 Magee
12 Giljum
13 Sedeghi
14 Nguyen
15 Dumas
16 Maguro
DEPT_ID
------------50
41
S_DEPT Table
ID NAME
REGION_ID
---- ---------------------------- ----------------30 Finance
1
31 Sales
1
32 Sales
43 Operations
S_REGION Table
50 Administration ID
NAME
31 ----- ---------------------------32
1 North America
33
2 South America
34
3 Africa / Middle East
35
4 Asia
41
5 Europe
ДЕКАРТОВО ПРОИЗВЕДЕНИЕ

Декартово произведения образуется, если:
Опущено условие соединения
 Условие соединения недействительно
Результат:
 Все строки первой таблицы соединяются со всеми
строками второй


Во избежание получения декартова произведения
предложение WHERE всегда должно включать
допустимое условие соединения
ПРАВИЛО:
количество условий соединения = количество таблиц - 1
ПРОСТОЙ ЗАПРОС С СОЕДИНЕНИЕМ
Для отображения данных из двух или более связанных
таблиц необходимо задать простое условие
соединения в предложении WHERE
Синтаксис:
SELECT таблица.столбец, таблица.столбец
FROM
таблица1, таблица2
WHERE таблица1.столбец1 = таблица2.столбец2
где: таблица, столбец таблица и столбец, из которых
производится выборка данных
Таблица1.столбец1= условие, соединяющее
таблица2.столбец2
таблицы (или задающее их
взаимосвязь)
ЭКВИСОЕДИНЕНИЕ: ПРИМЕР
S_EMP
LAST_NAME
DEPT_ID
-------------- ----------Velasquez
50
Ngao
41
Nagayama
31
Ropeburn
50
Urguhart
41
Menchu
42
Biri
43
Havel
45
S_DEPT
ID
---------50
41
31
50
41
42
43
45
NAME
----------Administration
Operations
Sales
Administration
Operations
Operations
Operations
Operations
РАЗЛИЧЕНИЕ СТОЛБЦОВ С
ОДИНАКОВЫМИ ИМЕНАМИ



Для различения одноименных столбцов из разных
таблиц используются префиксы в виде имен таблиц
Использование префиксов в виде имен таблиц
увеличивает производительность
Одноименные столбцы из разных таблиц можно
различать по их псевдонимам
ДОПОЛНИТЕЛЬНЫЕ УСЛОВИЯ
ПОИСКА И ОПЕРАТОР AND: ПРИМЕР
S_EMP
LAST_NAME
DEPT_ID
-------------- ----------Velasquez
50
Ngao
41
Nagayama
31
Ropeburn
50
Urguhart
41
Menchu
42
Biri
43
Havel
45
S_DEPT
ID
---------50
41
31
50
41
42
43
45
NAME
----------Administration
Operations
Sales
Administration
Operations
Operations
Operations
Operation
ПСЕВДОНИМЫ ТАБЛИЦ



Перед именами столбцов рекомендуется указывать
псевдонимы таблиц
Псевдонимы таблиц действительны только для
данной команды SELECT
Если псевдоним таблицы создан, перед ссылкой на
столбец следует указывать его, а не не имя таблицы
SQL>
2
3
4
5
SELECT с.name "Customer Name",
c.region_id "Region ID",
r.name "Region Name"
FROM s_customer c,
s_region r
WHERE c.region_id = r.id;
НЕ-ЭКВИСОЕДИНЕНИЯ: ПРИМЕР


Не-эквисоединение возникает в случае, если ни одно
значение в столбце одной таблицы не соответствует
точно ни одному значению в столбце другой таблицы
Условие соединения содержит оператор, не
являющийся оператором равенства (=)
SELECT e.last_name, e.title, e.salary, s.grade
FROM s_emp e, salgrade s
WHERE e.salary BETWEEN s.losal
AND s.hisal;
ОПЕРАТОРЫ INNER JOIN И OUTER (LEFT,
RIGHT, FULL) JOIN В SQL (ORACLE)
Существует три типа join-выражений:
 inner join;
 outer join;
 cross join;

ПРИМЕР
create table t_users ( t_id number(11, 0),
 t_nick varchar(16),
 primary key (t_id) )
 create table t_resources (t_id number(11, 0),
 t_name varchar(16),
 t_userid number (11, 0),
 primary key (t_id) )

СОДЕРЖИМОЕ ТАБЛИЦ
КОНСТРУКЦИЯ JOIN ВЫГЛЯДИТ ТАК
table_name1 join_type join table_name2 on
condition …
INNER JOIN

Необходим для получения только тех строк,
для которых существует соответствие записей
главной таблицы и присоединяемой. Иными
словами условие condition должно
выполняться всегда.
INNER JOIN

select t_resources.t_name, t_users.t_nick from
t_resources inner join t_users on t_users.t_id =
t_resources.t_userid
INNER JOIN
INNER JOIN

В случае с left join из главной таблицы будут
выбраны все записи, даже если в
присоединяемой таблице нет совпадений, то
есть условие condition не учитывает
присоединяемую (правую) таблицу.
INNER JOIN

select t_resources.t_name, t_users.t_nick from
t_resources left join t_users on t_users.t_id =
t_resources.t_userid
INNER JOIN
FULL OUTER JOIN

Необходим для отображения всех возможных
комбинаций строк из нескольких таблиц.
Иными словами, это объединение
результатов left и right join (ключевое слово
outer можно опустить).
FULL OUTER JOIN

select t_resources.t_name, t_users.t_nick from
t_resources full join t_users on t_users.t_id =
t_resources.t_userid
FULL OUTER JOIN
CROSS JOIN

Этот тип join еще называют декартовым
произведением (на английском - cartesian
product).

select t_resources.t_name, t_users.t_nick from
t_resources, t_users
ВНЕШНЕЕ СОЕДИНЕНИЕ

Синтаксис
SELECT таблица.столбец, таблица.столбец
FROM таблица1, таблица2
WHERE таблица1.столбец = таблица2.столбец(+);

ИЛИ
SELECT таблица.столбец, таблица.столбец
FROM таблица1, таблица2
WHERE таблица1.столбец(+) = таблица2.столбец;
Где: таблица1.столбец = условие, соединяющее
таблица2.столбец таблицы (или задающее их
отношение)
(+)
символ внешнего соединения; может использоваться на
любой стороне условия в предложении WHERE, но не по
обеим сторонам. Символ внешнего соединения
указывается после имени таблицы, в которой нет
соответствующих строк.
ВНЕШНИЕ СОЕДИНЕНИЯ
S_EMP
LAST_NAME
-------------Magee
Magee
Magee
Giljum
Giljum
Sedeghi
Dumas
S_CUSTOMER
ID
----------11
11
11
12
12
13
15
SALES_REP_ID NAME
---------11
11
11
12
12
13
15
----------Womanaport
Beisbol Si
Ojibway Retail
Unisports
Futbol Sonora
Hamada Sport
Sportique
Sweet Rock Sports
ВНЕШНИЕ СОЕДИНЕНИЯ:
ПРИМЕР



Вывод имени торгового представителя и названия каждой
фирмы-клиента, включая тех, кто не имеет торгового
представителя
SQL> SELECT e.last_name, e.id, с.name
2 FROM s_emp e, s_customer с
3 WHERE e.id(+) = с.sales_rep_id
4 ORDER BY e.id;
Оператор внешнего соединения может использоваться
лишь на одной стороне выражения
Условие, предполагающее внешнее соединение, не может:
- Использовать оператор IN
- Быть связанным с другими условиями с помощью
оператора OR
СОЕДИНЕНИЕ ТАБЛИЦЫ С
СОБОЙ
S_EMP (WORKER)
LAST_NAME
-------------Ngao
Nagayama
Ropeburn
Urguhart
Menchu
Biri
Magee
Giljum
. . .
S_EMP (MANAGER)
MANAGER_ID
----------1
1
1
2
2
2
3
3
ID
----------1
1
1
2
2
2
3
3
LAST_NAME
----------Velasquez
Velasquez
Velasquez
Ngao
Ngao
Ngao
Nagayama
Nagayama
СОЕДИНЕНИЕ ТАБЛИЦЫ С СОБОЙ:
ПРИМЕР


Строки таблицы соединяются со строками этой же
самой таблицы
В предложении FROM наличие двух таблиц
имитируется путем использования двух
псевдонимов таблицы
SQL>
2
3
4
SELECT worker.last_name||' works for ’||
manager.last_name
FROM s_emp worker, s_emp manager
WHERE worker.manager_id = manager.id;
Операторы множеств
• Позволяют объединять результаты разных запросов
в единую выборку
• Количество столбцов и последовательность типов
данных в списках SELECT запросов должны
совпадать
- UNION
- UNION ALL
- INTERSECT
- MINUS
Операторы множеств:
пример
SQL> select last_name, manager_id from s_emp
2 union
3 select name, id from s_dept;
LAST_NAME
------------------------Administration
Biri
Catchpole
Chang
Dancs
Dumas
…
MANAGER_ID
---------50
2
2
9
10
3
ЗАКЛЮЧЕНИЕ

Имеется несколько способов соединения таблиц:








Эквисоединение
Не-эквисоединение
Внешнее соединение
Соединение с собой
Операторы множеств
Отсутствие предложения WHERE приводит к
возникновению декартова произведения таблиц
Использование псевдонимов таблиц ускоряет доступ
к базе данных
Для соединения таблицы с собой использование
псевдонимов обязательно
Download