ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ
DESCRIPTION
ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ. Соединение используется для выборки данных из более, чем одной таблицы Строки соединяются с помощью общих значений - как правило, значений первичных и внешних ключей Способы соединения: Эквисоединение Не-эквисоединение Внешнее соединение - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/1.jpg)
![Page 2: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/2.jpg)
Соединение используется для выборки данных из более, чем одной таблицы
Строки соединяются с помощью общих значений - как правило, значений первичных и внешних ключей
Способы соединения: Эквисоединение Не-эквисоединение Внешнее соединение Соединение таблицы с собой Операторы множеств
![Page 3: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/3.jpg)
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
![Page 4: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/4.jpg)
Декартово произведения образуется, если: Опущено условие соединения Условие соединения недействительно
Результат: Все строки первой таблицы соединяются со всеми
строками второй Во избежание получения декартова произведения
предложение WHERE всегда должно включать допустимое условие соединения
ПРАВИЛО: количество условий соединения = количество таблиц - 1
![Page 5: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/5.jpg)
Для отображения данных из двух или более связанных таблиц необходимо задать простое условие соединения в предложении WHERE
Синтаксис:SELECT таблица.столбец, таблица.столбецFROM таблица1, таблица2WHERE таблица1.столбец1 = таблица2.столбец2где: таблица, столбец таблица и столбец, из которых
производится выборка данныхТаблица1.столбец1= условие, соединяющее таблица2.столбец2 таблицы (или задающее их
взаимосвязь)
![Page 6: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/6.jpg)
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
![Page 7: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/7.jpg)
Для различения одноименных столбцов из разных таблиц используются префиксы в виде имен таблиц
Использование префиксов в виде имен таблиц увеличивает производительность
Одноименные столбцы из разных таблиц можно различать по их псевдонимам
![Page 8: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/8.jpg)
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
![Page 9: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/9.jpg)
Перед именами столбцов рекомендуется указывать псевдонимы таблиц
Псевдонимы таблиц действительны только для данной команды 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;
![Page 10: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/10.jpg)
Не-эквисоединение возникает в случае, если ни одно значение в столбце одной таблицы не соответствует точно ни одному значению в столбце другой таблицы
Условие соединения содержит оператор, не являющийся оператором равенства (=)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;
![Page 11: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/11.jpg)
Существует три типа join-выражений:
inner join; outer join; cross join;
![Page 12: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/12.jpg)
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) )
![Page 13: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/13.jpg)
![Page 14: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/14.jpg)
table_name1 join_type join table_name2 on condition …
![Page 15: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/15.jpg)
Необходим для получения только тех строк, для которых существует соответствие записей главной таблицы и присоединяемой. Иными словами условие condition должно выполняться всегда.
![Page 16: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/16.jpg)
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
![Page 17: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/17.jpg)
![Page 18: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/18.jpg)
В случае с left join из главной таблицы будут выбраны все записи, даже если в присоединяемой таблице нет совпадений, то есть условие condition не учитывает присоединяемую (правую) таблицу.
![Page 19: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/19.jpg)
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
![Page 20: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/20.jpg)
![Page 21: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/21.jpg)
Необходим для отображения всех возможных комбинаций строк из нескольких таблиц. Иными словами, это объединение результатов left и right join (ключевое слово outer можно опустить).
![Page 22: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/22.jpg)
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
![Page 23: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/23.jpg)
![Page 24: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/24.jpg)
![Page 25: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/25.jpg)
Этот тип join еще называют декартовым произведением (на английском - cartesian product).
select t_resources.t_name, t_users.t_nick from t_resources, t_users
![Page 26: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/26.jpg)
Синтаксис
SELECT таблица.столбец, таблица.столбец
FROM таблица1, таблица2
WHERE таблица1.столбец = таблица2.столбец(+); ИЛИ
SELECT таблица.столбец, таблица.столбец
FROM таблица1, таблица2
WHERE таблица1.столбец(+) = таблица2.столбец;
Где: таблица1.столбец = условие, соединяющее
таблица2.столбец таблицы (или задающее их отношение)
(+) символ внешнего соединения; может использоваться на любой стороне условия в предложении WHERE, но не по обеим сторонам. Символ внешнего соединения указывается после имени таблицы, в которой нет соответствующих строк.
![Page 27: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/27.jpg)
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
![Page 28: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/28.jpg)
Вывод имени торгового представителя и названия каждой фирмы-клиента, включая тех, кто не имеет торгового представителя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
![Page 29: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/29.jpg)
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)
![Page 30: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/30.jpg)
Строки таблицы соединяются со строками этой же самой таблицы
В предложении 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;
![Page 31: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/31.jpg)
Операторы множеств
• Позволяют объединять результаты разных запросов в единую выборку
• Количество столбцов и последовательность типов данных в списках SELECT запросов должны совпадать- UNION- UNION ALL - INTERSECT- MINUS
![Page 32: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/32.jpg)
Операторы множеств: пример
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……
![Page 33: ВЫБОРКА ДАННЫХ ИЗ НЕСКОЛЬКИХ ТАБЛИЦ](https://reader035.vdocuments.net/reader035/viewer/2022081506/568148fe550346895db623c3/html5/thumbnails/33.jpg)
Имеется несколько способов соединения таблиц: Эквисоединение Не-эквисоединение Внешнее соединение Соединение с собой Операторы множеств
Отсутствие предложения WHERE приводит к возникновению декартова произведения таблиц
Использование псевдонимов таблиц ускоряет доступ к базе данных
Для соединения таблицы с собой использование псевдонимов обязательно