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

Preview:

DESCRIPTION

ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ. Соединение используется для выборки данных из более, чем одной таблицы Строки соединяются с помощью общих значений - как правило, значений первичных и внешних ключей Способы соединения: Эквисоединение Не-эквисоединение Внешнее соединение - PowerPoint PPT Presentation

Citation preview

Соединение используется для выборки данных из более, чем одной таблицы

Строки соединяются с помощью общих значений - как правило, значений первичных и внешних ключей

Способы соединения: Эквисоединение Не-эквисоединение Внешнее соединение Соединение таблицы с собой Операторы множеств

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 приводит к возникновению декартова произведения таблиц

Использование псевдонимов таблиц ускоряет доступ к базе данных

Для соединения таблицы с собой использование псевдонимов обязательно

Recommended