Соединение используется для выборки данных из более, чем одной таблицы
Строки соединяются с помощью общих значений - как правило, значений первичных и внешних ключей
Способы соединения: Эквисоединение Не-эквисоединение Внешнее соединение Соединение таблицы с собой Операторы множеств
S_EMP Table ID LAST_NAME DEPT_ID----- ----------------------------- ------------- 1 Velasquez 50 2 Ngao 41 3 Nagayama S_DEPT Table 4 Quick-To-See ID NAME REGION_ID 5 Ropeburn ---- ---------------------------- ----------------- 6 Urguhart 30 Finance 1 7 Menchu 31 Sales 1 8 Biri 32 Sales 9 Catchpole 43 Operations S_REGION Table 10 Havel 50 Administration ID NAME 11 Magee 31 ----- ---------------------------- 12 Giljum 32 1 North America 13 Sedeghi 33 2 South America 14 Nguyen 34 3 Africa / Middle East 15 Dumas 35 4 Asia 16 Maguro 41 5 Europe
Декартово произведения образуется, если: Опущено условие соединения Условие соединения недействительно
Результат: Все строки первой таблицы соединяются со всеми
строками второй Во избежание получения декартова произведения
предложение WHERE всегда должно включать допустимое условие соединения
ПРАВИЛО: количество условий соединения = количество таблиц - 1
Для отображения данных из двух или более связанных таблиц необходимо задать простое условие соединения в предложении WHERE
Синтаксис:SELECT таблица.столбец, таблица.столбецFROM таблица1, таблица2WHERE таблица1.столбец1 = таблица2.столбец2где: таблица, столбец таблица и столбец, из которых
производится выборка данныхТаблица1.столбец1= условие, соединяющее таблица2.столбец2 таблицы (или задающее их
взаимосвязь)
LAST_NAME DEPT_ID-------------- -----------Velasquez 50Ngao 41 Nagayama 31 Ropeburn 50Urguhart 41Menchu 42 Biri 43 Havel 45
ID NAME
---------- -----------50 Administration41 Operations31 Sales 50 Administration 41 Operations42 Operations43 Operations45 Operations
SS_DEPTS_EMPS_EMP
Для различения одноименных столбцов из разных таблиц используются префиксы в виде имен таблиц
Использование префиксов в виде имен таблиц увеличивает производительность
Одноименные столбцы из разных таблиц можно различать по их псевдонимам
LAST_NAME DEPT_ID-------------- -----------Velasquez 50Ngao 41 Nagayama 31 Ropeburn 50Urguhart 41Menchu 42 Biri 43 Havel 45
ID NAME
---------- -----------50 Administration41 Operations31 Sales 50 Administration 41 Operations42 Operations43 Operations45 Operation
SS_DEPTS_EMPS_EMP
Перед именами столбцов рекомендуется указывать псевдонимы таблиц
Псевдонимы таблиц действительны только для данной команды SELECT
Если псевдоним таблицы создан, перед ссылкой на столбец следует указывать его, а не не имя таблицыSQL> SELECT с.name "Customer Name",
2 c.region_id "Region ID",
3 r.name "Region Name"
4 FROM s_customer c, s_region r
5 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;
Существует три типа 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) )
table_name1 join_type join table_name2 on condition …
Необходим для получения только тех строк, для которых существует соответствие записей главной таблицы и присоединяемой. Иными словами условие condition должно выполняться всегда.
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
В случае с left join из главной таблицы будут выбраны все записи, даже если в присоединяемой таблице нет совпадений, то есть условие condition не учитывает присоединяемую (правую) таблицу.
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
Необходим для отображения всех возможных комбинаций строк из нескольких таблиц. Иными словами, это объединение результатов left и right join (ключевое слово outer можно опустить).
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
Этот тип 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, но не по обеим сторонам. Символ внешнего соединения указывается после имени таблицы, в которой нет соответствующих строк.
LAST_NAME ID-------------- -----------Magee 11Magee 11 Magee 11 Giljum 12 Giljum 12 Sedeghi 13 Dumas 15
SALES_REP_ID NAME
---------- -----------11 Womanaport11 Beisbol Si11 Ojibway Retail12 Unisports12 Futbol Sonora13 Hamada Sport15 Sportique Sweet Rock Sports
SS_CUSTOMERS_EMPS_EMP
Вывод имени торгового представителя и названия каждой фирмы-клиента, включая тех, кто не имеет торгового представителя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
LAST_NAME MANAGER_ID-------------- -----------Ngao 1Nagayama 1 Ropeburn 1 Urguhart 2 Menchu 2 Biri 2 Magee 3 Giljum 3 . . .
ID LAST_NAME ----------- -----------
1 Velasquez1 Velasquez1 Velasquez2 Ngao2 Ngao2 Ngao3 Nagayama3 Nagayama
SS_EMP (MANAGER)S_EMPS_EMP (WORKER)(WORKER)
Строки таблицы соединяются со строками этой же самой таблицы
В предложении FROM наличие двух таблиц имитируется путем использования двух псевдонимов таблицыSQL> SELECT worker.last_name||' works for ’||
2 manager.last_name
3 FROM s_emp worker, s_emp manager
4 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 LAST_NAME MANAGER_IDMANAGER_ID-------------------------------------------------- ---------- ----------Administration Administration 5050Biri 2Biri 2Catchpole 2Catchpole 2Chang 9Chang 9Dancs Dancs 1010Dumas Dumas 33……
Имеется несколько способов соединения таблиц: Эквисоединение Не-эквисоединение Внешнее соединение Соединение с собой Операторы множеств
Отсутствие предложения WHERE приводит к возникновению декартова произведения таблиц
Использование псевдонимов таблиц ускоряет доступ к базе данных
Для соединения таблицы с собой использование псевдонимов обязательно